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  if (auto const p = dynamic_cast<txs_iter_impl const*>(&impl))
49  return iter_ == p->iter_;
50  return false;
51  }
52 
53  void
54  increment() override
55  {
56  ++iter_;
57  }
58 
59  value_type
60  dereference() const override
61  {
62  value_type result;
63  {
64  SerialIter sit(iter_->second.txn->slice());
65  result.first = std::make_shared<STTx const>(sit);
66  }
67  if (metadata_)
68  {
69  SerialIter sit(iter_->second.meta->slice());
70  result.second = std::make_shared<STObject const>(sit, sfMetadata);
71  }
72  return result;
73  }
74 };
75 
76 //------------------------------------------------------------------------------
77 
79  : ReadView(rhs)
80  , TxsRawView(rhs)
81  , monotonic_resource_{std::make_unique<
82  boost::container::pmr::monotonic_buffer_resource>(initialBufferSize)}
83  , txs_{rhs.txs_, monotonic_resource_.get()}
84  , rules_{rhs.rules_}
85  , info_{rhs.info_}
86  , base_{rhs.base_}
87  , items_{rhs.items_}
88  , hold_{rhs.hold_}
89  , open_{rhs.open_} {};
90 
93  ReadView const* base,
94  Rules const& rules,
96  : monotonic_resource_{std::make_unique<
97  boost::container::pmr::monotonic_buffer_resource>(initialBufferSize)}
98  , txs_{monotonic_resource_.get()}
99  , rules_(rules)
100  , info_(base->info())
101  , base_(base)
102  , hold_(std::move(hold))
103 {
104  info_.validated = false;
105  info_.accepted = false;
106  info_.seq = base_->info().seq + 1;
107  info_.parentCloseTime = base_->info().closeTime;
108  info_.parentHash = base_->info().hash;
109 }
110 
112  : monotonic_resource_{std::make_unique<
113  boost::container::pmr::monotonic_buffer_resource>(initialBufferSize)}
114  , txs_{monotonic_resource_.get()}
115  , rules_(base->rules())
116  , info_(base->info())
117  , base_(base)
118  , hold_(std::move(hold))
119  , open_(base->open())
120 {
121 }
122 
125 {
126  return txs_.size();
127 }
128 
129 void
131 {
132  items_.apply(to);
133  for (auto const& item : txs_)
134  to.rawTxInsert(item.first, item.second.txn, item.second.meta);
135 }
136 
137 //---
138 
139 LedgerInfo const&
141 {
142  return info_;
143 }
144 
145 Fees const&
147 {
148  return base_->fees();
149 }
150 
151 Rules const&
153 {
154  return rules_;
155 }
156 
157 bool
158 OpenView::exists(Keylet const& k) const
159 {
160  return items_.exists(*base_, k);
161 }
162 
163 auto
164 OpenView::succ(key_type const& key, std::optional<key_type> const& last) const
166 {
167  return items_.succ(*base_, key, last);
168 }
169 
171 OpenView::read(Keylet const& k) const
172 {
173  return items_.read(*base_, k);
174 }
175 
176 auto
177 OpenView::slesBegin() const -> std::unique_ptr<sles_type::iter_base>
178 {
179  return items_.slesBegin(*base_);
180 }
181 
182 auto
183 OpenView::slesEnd() const -> std::unique_ptr<sles_type::iter_base>
184 {
185  return items_.slesEnd(*base_);
186 }
187 
188 auto
191 {
192  return items_.slesUpperBound(*base_, key);
193 }
194 
195 auto
196 OpenView::txsBegin() const -> std::unique_ptr<txs_type::iter_base>
197 {
198  return std::make_unique<txs_iter_impl>(!open(), txs_.cbegin());
199 }
200 
201 auto
202 OpenView::txsEnd() const -> std::unique_ptr<txs_type::iter_base>
203 {
204  return std::make_unique<txs_iter_impl>(!open(), txs_.cend());
205 }
206 
207 bool
208 OpenView::txExists(key_type const& key) const
209 {
210  return txs_.find(key) != txs_.end();
211 }
212 
213 auto
214 OpenView::txRead(key_type const& key) const -> tx_type
215 {
216  auto const iter = txs_.find(key);
217  if (iter == txs_.end())
218  return base_->txRead(key);
219  auto const& item = iter->second;
220  auto stx = std::make_shared<STTx const>(SerialIter{item.txn->slice()});
221  decltype(tx_type::second) sto;
222  if (item.meta)
223  sto = std::make_shared<STObject const>(
224  SerialIter{item.meta->slice()}, sfMetadata);
225  else
226  sto = nullptr;
227  return {std::move(stx), std::move(sto)};
228 }
229 
230 //---
231 
232 void
234 {
235  items_.erase(sle);
236 }
237 
238 void
240 {
241  items_.insert(sle);
242 }
243 
244 void
246 {
247  items_.replace(sle);
248 }
249 
250 void
252 {
253  items_.destroyXRP(fee);
254  // VFALCO Deduct from info_.totalDrops ?
255  // What about child views?
256 }
257 
258 //---
259 
260 void
262  key_type const& key,
264  std::shared_ptr<Serializer const> const& metaData)
265 {
266  auto const result = txs_.emplace(
267  std::piecewise_construct,
269  std::forward_as_tuple(txn, metaData));
270  if (!result.second)
271  LogicError("rawTxInsert: duplicate TX id" + to_string(key));
272 }
273 
274 } // namespace ripple
ripple::OpenView::txCount
std::size_t txCount() const
Return the number of tx inserted since creation.
Definition: OpenView.cpp:124
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:140
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:130
ripple::ReadView::txs_type
Definition: ReadView.h:146
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:233
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:158
ripple::OpenView::slesUpperBound
std::unique_ptr< sles_type::iter_base > slesUpperBound(uint256 const &key) const override
Definition: OpenView.cpp:189
std::map::emplace
T emplace(T... args)
ripple::OpenView::succ
std::optional< key_type > succ(key_type const &key, std::optional< key_type > const &last=std::nullopt) const override
Return the key of the next state item.
Definition: OpenView.cpp:164
ripple::detail::RawStateTable::read
std::shared_ptr< SLE const > read(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:307
ripple::OpenView::txs_iter_impl
Definition: OpenView.cpp:27
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:214
ripple::base_uint< 256 >
ripple::OpenView::fees
Fees const & fees() const override
Returns the fees for the base ledger.
Definition: OpenView.cpp:146
ripple::OpenView::txsEnd
std::unique_ptr< txs_type::iter_base > txsEnd() const override
Definition: OpenView.cpp:202
ripple::OpenView::txExists
bool txExists(key_type const &key) const override
Returns true if a tx exists in the tx map.
Definition: OpenView.cpp:208
ripple::Fees
Reflects the fee settings for a particular ledger.
Definition: ReadView.h:49
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:245
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:54
ripple::detail::RawStateTable::slesBegin
std::unique_ptr< ReadView::sles_type::iter_base > slesBegin(ReadView const &base) const
Definition: RawStateTable.cpp:329
ripple::SerialIter
Definition: Serializer.h:310
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:234
ripple::detail::RawStateTable::exists
bool exists(ReadView const &base, Keylet const &k) const
Definition: RawStateTable.cpp:180
ripple::OpenView::rawInsert
void rawInsert(std::shared_ptr< SLE > const &sle) override
Unconditionally insert a state item.
Definition: OpenView.cpp:239
ripple::open_ledger_t
Open ledger construction tag.
Definition: OpenView.h:42
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:125
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:135
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:261
ripple::detail::RawStateTable::apply
void apply(RawView &to) const
Definition: RawStateTable.cpp:158
ripple::OpenView::txsBegin
std::unique_ptr< txs_type::iter_base > txsBegin() const override
Definition: OpenView.cpp:196
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:323
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:260
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:60
ripple::Rules
Rules controlling protocol behavior.
Definition: Rules.h:33
ripple::OpenView::txs_
txs_map txs_
Definition: OpenView.h:93
ripple::OpenView::rawDestroyXRP
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
Definition: OpenView.cpp:251
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:171
std::optional
ripple::detail::RawStateTable::replace
void replace(std::shared_ptr< SLE > const &sle)
Definition: RawStateTable.cpp:285
std::size_t
ripple::to_string
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
Definition: app/misc/impl/Manifest.cpp:41
ripple::OpenView::slesEnd
std::unique_ptr< sles_type::iter_base > slesEnd() const override
Definition: OpenView.cpp:183
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:75
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:97
ripple::detail::RawStateTable::slesEnd
std::unique_ptr< ReadView::sles_type::iter_base > slesEnd(ReadView const &base) const
Definition: RawStateTable.cpp:336
std::unique_ptr
STL class.
ripple::OpenView::slesBegin
std::unique_ptr< sles_type::iter_base > slesBegin() const override
Definition: OpenView.cpp:177
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:152
ripple::XRPAmount
Definition: XRPAmount.h:46