xrpld
Loading...
Searching...
No Matches
OpenView.cpp
1#include <xrpl/ledger/OpenView.h>
2
3#include <xrpl/basics/base_uint.h>
4#include <xrpl/basics/contract.h>
5#include <xrpl/ledger/RawView.h>
6#include <xrpl/ledger/ReadView.h>
7#include <xrpl/protocol/Fees.h>
8#include <xrpl/protocol/Keylet.h>
9#include <xrpl/protocol/SField.h>
10#include <xrpl/protocol/STLedgerEntry.h>
11#include <xrpl/protocol/STObject.h>
12#include <xrpl/protocol/STTx.h>
13#include <xrpl/protocol/Serializer.h>
14#include <xrpl/protocol/XRPAmount.h>
15
16#include <boost/container/pmr/monotonic_buffer_resource.hpp>
17
18#include <cstddef>
19#include <memory>
20#include <optional>
21#include <stdexcept>
22#include <tuple>
23#include <utility>
24
25namespace xrpl {
26
27class OpenView::TxsIterImpl : public TxsType::iter_base
28{
29private:
31 txs_map::const_iterator iter_;
32
33public:
34 explicit TxsIterImpl(bool metadata, txs_map::const_iterator iter)
35 : metadata_(metadata), iter_(iter)
36 {
37 }
38
39 [[nodiscard]] std::unique_ptr<base_type>
40 copy() const override
41 {
43 }
44
45 [[nodiscard]] bool
46 equal(base_type const& impl) const override
47 {
48 if (auto const p = dynamic_cast<TxsIterImpl const*>(&impl))
49 return iter_ == p->iter_;
50 return false;
51 }
52
53 void
54 increment() override
55 {
56 ++iter_;
57 }
58
59 [[nodiscard]] 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 , monotonicResource_{std::make_unique<boost::container::pmr::monotonic_buffer_resource>(
84 , rules_{rhs.rules_}
85 , header_{rhs.header_}
86 , base_{rhs.base_}
87 , items_{rhs.items_}
88 , hold_{rhs.hold_}
89 , open_{rhs.open_} {};
90
93 std::make_unique<boost::container::pmr::monotonic_buffer_resource>(kInitialBufferSize)}
95 , rules_(std::move(rules))
96 , header_(base->header())
97 , base_(base)
98 , hold_(std::move(hold))
99{
100 header_.validated = false;
101 header_.accepted = false;
102 header_.seq = base_->header().seq + 1;
103 header_.parentCloseTime = base_->header().closeTime;
104 header_.parentHash = base_->header().hash;
105}
106
109 std::make_unique<boost::container::pmr::monotonic_buffer_resource>(kInitialBufferSize)}
111 , rules_(base->rules())
112 , header_(base->header())
113 , base_(base)
114 , hold_(std::move(hold))
115 , open_(base->open())
116{
117}
118
121{
122 return baseTxCount_ + txs_.size();
123}
124
125void
127{
128 items_.apply(to);
129 for (auto const& item : txs_)
130 to.rawTxInsert(item.first, item.second.txn, item.second.meta);
131}
132
133//---
134
135LedgerHeader const&
137{
138 return header_;
139}
140
141Fees const&
143{
144 return base_->fees();
145}
146
147Rules const&
149{
150 return rules_;
151}
152
153bool
155{
156 return items_.exists(*base_, k);
157}
158
159auto
160OpenView::succ(key_type const& key, std::optional<key_type> const& last) const
162{
163 return items_.succ(*base_, key, last);
164}
165
167OpenView::read(Keylet const& k) const
168{
169 return items_.read(*base_, k);
170}
171
172auto
173OpenView::slesBegin() const -> std::unique_ptr<SlesType::iter_base>
174{
175 return items_.slesBegin(*base_);
176}
177
178auto
179OpenView::slesEnd() const -> std::unique_ptr<SlesType::iter_base>
180{
181 return items_.slesEnd(*base_);
182}
183
184auto
186{
187 return items_.slesUpperBound(*base_, key);
188}
189
190auto
191OpenView::txsBegin() const -> std::unique_ptr<TxsType::iter_base>
192{
193 return std::make_unique<TxsIterImpl>(!open(), txs_.cbegin());
194}
195
196auto
197OpenView::txsEnd() const -> std::unique_ptr<TxsType::iter_base>
198{
199 return std::make_unique<TxsIterImpl>(!open(), txs_.cend());
200}
201
202bool
204{
205 return txs_.contains(key);
206}
207
208auto
210{
211 auto const iter = txs_.find(key);
212 if (iter == txs_.end())
213 return base_->txRead(key);
214 auto const& item = iter->second;
215 auto stx = std::make_shared<STTx const>(SerialIter{item.txn->slice()});
216 decltype(tx_type::second) sto;
217 if (item.meta)
218 {
219 sto = std::make_shared<STObject const>(SerialIter{item.meta->slice()}, sfMetadata);
220 }
221 else
222 {
223 sto = nullptr;
224 }
225 return {std::move(stx), std::move(sto)};
226}
227
228//---
229
230void
232{
233 items_.erase(sle);
234}
235
236void
238{
239 items_.insert(sle);
240}
241
242void
244{
245 items_.replace(sle);
246}
247
248void
250{
251 items_.destroyXRP(fee);
252 // VFALCO Deduct from header_.totalDrops ?
253 // What about child views?
254}
255
256//---
257
258void
260 key_type const& key,
262 std::shared_ptr<Serializer const> const& metaData)
263{
264 auto const result = txs_.emplace(
266 if (!result.second)
267 Throw<std::logic_error>("rawTxInsert: duplicate TX id: " + to_string(key));
268}
269
270} // namespace xrpl
TxsIterImpl(bool metadata, txs_map::const_iterator iter)
Definition OpenView.cpp:34
txs_map::const_iterator iter_
Definition OpenView.cpp:31
std::unique_ptr< base_type > copy() const override
Definition OpenView.cpp:40
bool equal(base_type const &impl) const override
Definition OpenView.cpp:46
void increment() override
Definition OpenView.cpp:54
value_type dereference() const override
Definition OpenView.cpp:60
static constexpr size_t kInitialBufferSize
Definition OpenView.h:50
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
Definition OpenView.cpp:249
std::size_t txCount() const
Return the number of tx inserted since creation.
Definition OpenView.cpp:120
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Definition OpenView.cpp:209
OpenView()=delete
LedgerHeader header_
Definition OpenView.h:82
Fees const & fees() const override
Returns the fees for the base ledger.
Definition OpenView.cpp:142
txs_map txs_
Definition OpenView.h:80
std::unique_ptr< TxsType::iter_base > txsEnd() const override
Definition OpenView.cpp:197
void rawInsert(SLE::ref sle) override
Unconditionally insert a state item.
Definition OpenView.cpp:237
std::size_t baseTxCount_
In batch mode, the number of transactions already executed.
Definition OpenView.h:88
bool txExists(key_type const &key) const override
Returns true if a tx exists in the tx map.
Definition OpenView.cpp:203
std::shared_ptr< void const > hold_
Definition OpenView.h:85
bool open() const override
Returns true if this reflects an open ledger.
Definition OpenView.h:166
std::unique_ptr< SlesType::iter_base > slesBegin() const override
Definition OpenView.cpp:173
SLE::const_pointer read(Keylet const &k) const override
Return the state item associated with a key.
Definition OpenView.cpp:167
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:160
std::unique_ptr< SlesType::iter_base > slesUpperBound(uint256 const &key) const override
Definition OpenView.cpp:185
void rawErase(SLE::ref sle) override
Delete an existing state item.
Definition OpenView.cpp:231
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:259
ReadView const * base_
Definition OpenView.h:83
LedgerHeader const & header() const override
Returns information about the ledger.
Definition OpenView.cpp:136
void apply(TxsRawView &to) const
Apply changes.
Definition OpenView.cpp:126
Rules const & rules() const override
Returns the tx processing rules.
Definition OpenView.cpp:148
bool exists(Keylet const &k) const override
Determine if a state item exists.
Definition OpenView.cpp:154
std::unique_ptr< TxsType::iter_base > txsBegin() const override
Definition OpenView.cpp:191
std::unique_ptr< boost::container::pmr::monotonic_buffer_resource > monotonicResource_
Definition OpenView.h:79
std::unique_ptr< SlesType::iter_base > slesEnd() const override
Definition OpenView.cpp:179
detail::RawStateTable items_
Definition OpenView.h:84
void rawReplace(SLE::ref sle) override
Unconditionally replace a state item.
Definition OpenView.cpp:243
std::pair< std::shared_ptr< STTx const >, std::shared_ptr< STObject const > > tx_type
Definition ReadView.h:33
LedgerIndex seq() const
Returns the sequence number of the base ledger.
Definition ReadView.h:97
uint256 key_type
Definition ReadView.h:35
Rules controlling protocol behavior.
Definition Rules.h:33
std::shared_ptr< STLedgerEntry > const & ref
std::shared_ptr< STLedgerEntry const > const_pointer
Interface for changing ledger entries with transactions.
Definition RawView.h:75
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.
T forward_as_tuple(T... args)
T make_shared(T... args)
T make_unique(T... args)
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
T get(Section const &section, std::string const &name, T const &defaultValue=T{})
Retrieve a key/value pair from a section.
std::string to_string(BaseUInt< Bits, Tag > const &a)
Definition base_uint.h:633
BaseUInt< 256 > uint256
Definition base_uint.h:562
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:49
T piecewise_construct
Reflects the fee settings for a particular ledger.
A pair of SHAMap key and LedgerEntryType.
Definition Keylet.h:19
Information about the notional ledger backing the view.
Open ledger construction tag.
Definition OpenView.h:24