rippled
OpenView.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/basics/contract.h>
21 #include <ripple/ledger/OpenView.h>
22 
23 namespace ripple {
24 
26 
27 class OpenView::txs_iter_impl : public txs_type::iter_base
28 {
29 private:
30  bool metadata_;
31  txs_map::const_iterator iter_;
32 
33 public:
34  explicit txs_iter_impl(bool metadata, txs_map::const_iterator iter)
35  : metadata_(metadata), iter_(iter)
36  {
37  }
38 
40  copy() const override
41  {
42  return std::make_unique<txs_iter_impl>(metadata_, iter_);
43  }
44 
45  bool
46  equal(base_type const& impl) const override
47  {
48  auto const& other = dynamic_cast<txs_iter_impl const&>(impl);
49  return iter_ == other.iter_;
50  }
51 
52  void
53  increment() override
54  {
55  ++iter_;
56  }
57 
58  value_type
59  dereference() const override
60  {
61  value_type result;
62  {
63  SerialIter sit(iter_->second.txn->slice());
64  result.first = std::make_shared<STTx const>(sit);
65  }
66  if (metadata_)
67  {
68  SerialIter sit(iter_->second.meta->slice());
69  result.second = std::make_shared<STObject const>(sit, sfMetadata);
70  }
71  return result;
72  }
73 };
74 
75 //------------------------------------------------------------------------------
76 
78  : ReadView(rhs)
79  , TxsRawView(rhs)
80  , monotonic_resource_{std::make_unique<
81  boost::container::pmr::monotonic_buffer_resource>(initialBufferSize)}
82  , txs_{rhs.txs_, monotonic_resource_.get()}
83  , rules_{rhs.rules_}
84  , info_{rhs.info_}
85  , base_{rhs.base_}
86  , items_{rhs.items_}
87  , hold_{rhs.hold_}
88  , open_{rhs.open_} {};
89 
92  ReadView const* base,
93  Rules const& rules,
95  : monotonic_resource_{std::make_unique<
96  boost::container::pmr::monotonic_buffer_resource>(initialBufferSize)}
97  , txs_{monotonic_resource_.get()}
98  , rules_(rules)
99  , info_(base->info())
100  , base_(base)
101  , hold_(std::move(hold))
102 {
103  info_.validated = false;
104  info_.accepted = false;
105  info_.seq = base_->info().seq + 1;
106  info_.parentCloseTime = base_->info().closeTime;
107  info_.parentHash = base_->info().hash;
108 }
109 
111  : monotonic_resource_{std::make_unique<
112  boost::container::pmr::monotonic_buffer_resource>(initialBufferSize)}
113  , txs_{monotonic_resource_.get()}
114  , rules_(base->rules())
115  , info_(base->info())
116  , base_(base)
117  , hold_(std::move(hold))
118  , open_(base->open())
119 {
120 }
121 
124 {
125  return txs_.size();
126 }
127 
128 void
130 {
131  items_.apply(to);
132  for (auto const& item : txs_)
133  to.rawTxInsert(item.first, item.second.txn, item.second.meta);
134 }
135 
136 //---
137 
138 LedgerInfo const&
140 {
141  return info_;
142 }
143 
144 Fees const&
146 {
147  return base_->fees();
148 }
149 
150 Rules const&
152 {
153  return rules_;
154 }
155 
156 bool
157 OpenView::exists(Keylet const& k) const
158 {
159  return items_.exists(*base_, k);
160 }
161 
162 auto
163 OpenView::succ(key_type const& key, boost::optional<key_type> const& last) const
164  -> boost::optional<key_type>
165 {
166  return items_.succ(*base_, key, last);
167 }
168 
170 OpenView::read(Keylet const& k) const
171 {
172  return items_.read(*base_, k);
173 }
174 
175 auto
176 OpenView::slesBegin() const -> std::unique_ptr<sles_type::iter_base>
177 {
178  return items_.slesBegin(*base_);
179 }
180 
181 auto
182 OpenView::slesEnd() const -> std::unique_ptr<sles_type::iter_base>
183 {
184  return items_.slesEnd(*base_);
185 }
186 
187 auto
190 {
191  return items_.slesUpperBound(*base_, key);
192 }
193 
194 auto
195 OpenView::txsBegin() const -> std::unique_ptr<txs_type::iter_base>
196 {
197  return std::make_unique<txs_iter_impl>(!open(), txs_.cbegin());
198 }
199 
200 auto
201 OpenView::txsEnd() const -> std::unique_ptr<txs_type::iter_base>
202 {
203  return std::make_unique<txs_iter_impl>(!open(), txs_.cend());
204 }
205 
206 bool
207 OpenView::txExists(key_type const& key) const
208 {
209  return txs_.find(key) != txs_.end();
210 }
211 
212 auto
213 OpenView::txRead(key_type const& key) const -> tx_type
214 {
215  auto const iter = txs_.find(key);
216  if (iter == txs_.end())
217  return base_->txRead(key);
218  auto const& item = iter->second;
219  auto stx = std::make_shared<STTx const>(SerialIter{item.txn->slice()});
220  decltype(tx_type::second) sto;
221  if (item.meta)
222  sto = std::make_shared<STObject const>(
223  SerialIter{item.meta->slice()}, sfMetadata);
224  else
225  sto = nullptr;
226  return {std::move(stx), std::move(sto)};
227 }
228 
229 //---
230 
231 void
233 {
234  items_.erase(sle);
235 }
236 
237 void
239 {
240  items_.insert(sle);
241 }
242 
243 void
245 {
246  items_.replace(sle);
247 }
248 
249 void
251 {
252  items_.destroyXRP(fee);
253  // VFALCO Deduct from info_.totalDrops ?
254  // What about child views?
255 }
256 
257 //---
258 
259 void
261  key_type const& key,
263  std::shared_ptr<Serializer const> const& metaData)
264 {
265  auto const result = txs_.emplace(
266  std::piecewise_construct,
268  std::forward_as_tuple(txn, metaData));
269  if (!result.second)
270  LogicError("rawTxInsert: duplicate TX id" + to_string(key));
271 }
272 
273 } // namespace ripple
ripple::OpenView::txCount
std::size_t txCount() const
Return the number of tx inserted since creation.
Definition: OpenView.cpp:123
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::OpenView::txs_iter_impl::equal
bool equal(base_type const &impl) const override
Definition: OpenView.cpp:46
ripple::sfMetadata
const SField sfMetadata
std::shared_ptr
STL class.
ripple::OpenView::info
LedgerInfo const & info() const override
Returns information about the ledger.
Definition: OpenView.cpp:139
ripple::open_ledger
const open_ledger_t open_ledger
Definition: OpenView.cpp:25
ripple::OpenView::apply
void apply(TxsRawView &to) const
Apply changes.
Definition: OpenView.cpp:129
ripple::ReadView::txs_type
Definition: ReadView.h:213
std::make_unique
T make_unique(T... args)
std::pair
ripple::OpenView
Writable ledger view that accumulates state and tx changes.
Definition: OpenView.h:55
ripple::OpenView::rawErase
void rawErase(std::shared_ptr< SLE > const &sle) override
Delete an existing state item.
Definition: OpenView.cpp:232
std::map::find
T find(T... args)
std::map::size
T size(T... args)
ripple::ReadView::fees
virtual Fees const & fees() const =0
Returns the fees for the base ledger.
ripple::OpenView::exists
bool exists(Keylet const &k) const override
Determine if a state item exists.
Definition: OpenView.cpp:157
ripple::OpenView::slesUpperBound
std::unique_ptr< sles_type::iter_base > slesUpperBound(uint256 const &key) const override
Definition: OpenView.cpp:188
std::map::emplace
T emplace(T... args)
ripple::detail::RawStateTable::read
std::shared_ptr< SLE const > read(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:303
ripple::OpenView::txs_iter_impl
Definition: OpenView.cpp:27
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:42
ripple::OpenView::items_
detail::RawStateTable items_
Definition: OpenView.h:97
ripple::OpenView::info_
LedgerInfo info_
Definition: OpenView.h:95
ripple::OpenView::txRead
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Definition: OpenView.cpp:213
ripple::base_uint< 256 >
ripple::OpenView::fees
Fees const & fees() const override
Returns the fees for the base ledger.
Definition: OpenView.cpp:145
ripple::OpenView::txsEnd
std::unique_ptr< txs_type::iter_base > txsEnd() const override
Definition: OpenView.cpp:201
ripple::OpenView::txExists
bool txExists(key_type const &key) const override
Returns true if a tx exists in the tx map.
Definition: OpenView.cpp:207
ripple::Fees
Reflects the fee settings for a particular ledger.
Definition: ReadView.h:48
ripple::TxsRawView::rawTxInsert
virtual void rawTxInsert(ReadView::key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData)=0
Add a transaction to the tx map.
ripple::OpenView::rawReplace
void rawReplace(std::shared_ptr< SLE > const &sle) override
Unconditionally replace a state item.
Definition: OpenView.cpp:244
ripple::OpenView::open
bool open() const override
Returns true if this reflects an open ledger.
Definition: OpenView.h:175
ripple::OpenView::OpenView
OpenView()=delete
ripple::OpenView::txs_iter_impl::copy
std::unique_ptr< base_type > copy() const override
Definition: OpenView.cpp:40
ripple::OpenView::txs_iter_impl::increment
void increment() override
Definition: OpenView.cpp:53
ripple::detail::RawStateTable::slesBegin
std::unique_ptr< ReadView::sles_type::iter_base > slesBegin(ReadView const &base) const
Definition: RawStateTable.cpp:325
ripple::SerialIter
Definition: Serializer.h:308
std::forward_as_tuple
T forward_as_tuple(T... args)
ripple::detail::RawStateTable::erase
void erase(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:230
ripple::detail::RawStateTable::exists
bool exists(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:176
ripple::OpenView::rawInsert
void rawInsert(std::shared_ptr< SLE > const &sle) override
Unconditionally insert a state item.
Definition: OpenView.cpp:238
ripple::open_ledger_t
Open ledger construction tag.
Definition: OpenView.h:42
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:192
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::ReadView::sles_type
Definition: ReadView.h:202
ripple::OpenView::rawTxInsert
void rawTxInsert(key_type const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData) override
Add a transaction to the tx map.
Definition: OpenView.cpp:260
ripple::detail::RawStateTable::apply
void apply(RawView &to) const
Definition: RawStateTable.cpp:154
ripple::OpenView::txsBegin
std::unique_ptr< txs_type::iter_base > txsBegin() const override
Definition: OpenView.cpp:195
ripple::OpenView::rules_
Rules rules_
Definition: OpenView.h:94
ripple::OpenView::txs_iter_impl::metadata_
bool metadata_
Definition: OpenView.cpp:30
ripple::detail::RawStateTable::destroyXRP
void destroyXRP(XRPAmount const &fee)
Definition: RawStateTable.cpp:319
std::map::cbegin
T cbegin(T... args)
std
STL namespace.
ripple::LogicError
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:48
ripple::detail::RawStateTable::insert
void insert(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:256
ripple::OpenView::txs_iter_impl::txs_iter_impl
txs_iter_impl(bool metadata, txs_map::const_iterator iter)
Definition: OpenView.cpp:34
ripple::OpenView::txs_iter_impl::dereference
value_type dereference() const override
Definition: OpenView.cpp:59
ripple::Rules
Rules controlling protocol behavior.
Definition: ReadView.h:131
ripple::OpenView::txs_
txs_map txs_
Definition: OpenView.h:93
ripple::OpenView::rawDestroyXRP
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
Definition: OpenView.cpp:250
ripple::OpenView::read
std::shared_ptr< SLE const > read(Keylet const &k) const override
Return the state item associated with a key.
Definition: OpenView.cpp:170
ripple::detail::RawStateTable::replace
void replace(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:281
std::size_t
ripple::OpenView::slesEnd
std::unique_ptr< sles_type::iter_base > slesEnd() const override
Definition: OpenView.cpp:182
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:84
std::map::cend
T cend(T... args)
ripple::OpenView::base_
ReadView const * base_
Definition: OpenView.h:96
ripple::OpenView::initialBufferSize
static constexpr size_t initialBufferSize
Definition: OpenView.h:61
ripple::TxsRawView
Interface for changing ledger entries with transactions.
Definition: RawView.h:98
ripple::detail::RawStateTable::slesEnd
std::unique_ptr< ReadView::sles_type::iter_base > slesEnd(ReadView const &base) const
Definition: RawStateTable.cpp:332
std::unique_ptr
STL class.
ripple::OpenView::slesBegin
std::unique_ptr< sles_type::iter_base > slesBegin() const override
Definition: OpenView.cpp:176
ripple::OpenView::txs_iter_impl::iter_
txs_map::const_iterator iter_
Definition: OpenView.cpp:31
ripple::OpenView::rules
Rules const & rules() const override
Returns the tx processing rules.
Definition: OpenView.cpp:151
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::OpenView::succ
boost::optional< key_type > succ(key_type const &key, boost::optional< key_type > const &last=boost::none) const override
Return the key of the next state item.
Definition: OpenView.cpp:163