xrpld
Loading...
Searching...
No Matches
include/xrpl/ledger/Ledger.h
1#pragma once
2
3#include <xrpl/basics/CountedObject.h>
4#include <xrpl/basics/UnorderedContainers.h>
5#include <xrpl/basics/base_uint.h>
6#include <xrpl/basics/chrono.h>
7#include <xrpl/beast/utility/Journal.h>
8#include <xrpl/ledger/CachedView.h>
9#include <xrpl/ledger/RawView.h>
10#include <xrpl/protocol/Fees.h>
11#include <xrpl/protocol/Keylet.h>
12#include <xrpl/protocol/LedgerHeader.h>
13#include <xrpl/protocol/PublicKey.h>
14#include <xrpl/protocol/Rules.h>
15#include <xrpl/protocol/STLedgerEntry.h>
16#include <xrpl/protocol/STObject.h>
17#include <xrpl/protocol/STTx.h>
18#include <xrpl/protocol/Serializer.h>
19#include <xrpl/protocol/XRPAmount.h>
20#include <xrpl/shamap/Family.h>
21#include <xrpl/shamap/SHAMap.h>
22#include <xrpl/shamap/SHAMapItem.h>
23
24#include <cstdint>
25#include <memory>
26#include <mutex>
27#include <optional>
28#include <utility>
29#include <vector>
30
31namespace xrpl {
32
33class ServiceRegistry;
34class Job;
36
37class SqliteStatement;
38
40{
41 explicit CreateGenesisT() = default;
42};
44
72class Ledger final : public std::enable_shared_from_this<Ledger>,
74 public TxsRawView,
75 public CountedObject<Ledger>
76{
77public:
78 Ledger(Ledger const&) = delete;
79 Ledger&
80 operator=(Ledger const&) = delete;
81
82 Ledger(Ledger&&) = delete;
83 Ledger&
84 operator=(Ledger&&) = delete;
85
101 Ledger(
103 Rules rules,
104 Fees const& fees,
105 std::vector<uint256> const& amendments,
106 Family& family);
107
108 Ledger(LedgerHeader const& info, Rules rules, Family& family);
109
118 Ledger(
119 LedgerHeader const& info,
120 bool& loaded,
121 bool acquire,
122 Rules rules,
123 Fees const& fees,
124 Family& family,
126
134 Ledger(Ledger const& previous, NetClock::time_point closeTime);
135
136 // used for database ledgers
137 Ledger(
138 std::uint32_t ledgerSeq,
139 NetClock::time_point closeTime,
140 Rules rules,
141 Fees const& fees,
142 Family& family);
143
144 ~Ledger() override = default;
145
146 //
147 // ReadView
148 //
149
150 bool
151 open() const override
152 {
153 return false;
154 }
155
156 LedgerHeader const&
157 header() const override
158 {
159 return header_;
160 }
161
162 void
164 {
165 header_ = info;
166 }
167
168 Fees const&
169 fees() const override
170 {
171 return fees_;
172 }
173
174 Rules const&
175 rules() const override
176 {
177 return rules_;
178 }
179
180 bool
181 exists(Keylet const& k) const override;
182
183 bool
184 exists(uint256 const& key) const;
185
187 succ(uint256 const& key, std::optional<uint256> const& last = std::nullopt) const override;
188
190 read(Keylet const& k) const override;
191
193 slesBegin() const override;
194
196 slesEnd() const override;
197
199 slesUpperBound(uint256 const& key) const override;
200
202 txsBegin() const override;
203
205 txsEnd() const override;
206
207 bool
208 txExists(uint256 const& key) const override;
209
210 tx_type
211 txRead(key_type const& key) const override;
212
213 //
214 // DigestAwareReadView
215 //
216
218 digest(key_type const& key) const override;
219
220 //
221 // RawView
222 //
223
224 void
225 rawErase(SLE::ref sle) override;
226
227 void
228 rawInsert(SLE::ref sle) override;
229
230 void
231 rawErase(uint256 const& key);
232
233 void
234 rawReplace(SLE::ref sle) override;
235
236 void
237 rawDestroyXRP(XRPAmount const& fee) override
238 {
239 header_.drops -= fee;
240 }
241
242 //
243 // TxsRawView
244 //
245
246 void
248 uint256 const& key,
250 std::shared_ptr<Serializer const> const& metaData) override;
251
252 //--------------------------------------------------------------------------
253
254 void
256 {
257 header_.validated = true;
258 }
259
260 void
262 NetClock::time_point closeTime,
263 NetClock::duration closeResolution,
264 bool correctCloseTime);
265
266 void
267 setImmutable(bool rehash = true);
268
269 bool
271 {
272 return immutable_;
273 }
274
275 /* Mark this ledger as "should be full".
276
277 "Full" is metadata property of the ledger, it indicates
278 that the local server wants all the corresponding nodes
279 in durable storage.
280
281 This is marked `const` because it reflects metadata
282 and not data that is in common with other nodes on the
283 network.
284 */
285 void
286 setFull() const
287 {
288 txMap_.setFull();
289 txMap_.setLedgerSeq(header_.seq);
290 stateMap_.setFull();
291 stateMap_.setLedgerSeq(header_.seq);
292 }
293
294 void
296 {
297 header_.drops = totDrops;
298 }
299
300 SHAMap const&
301 stateMap() const
302 {
303 return stateMap_;
304 }
305
306 SHAMap&
308 {
309 return stateMap_;
310 }
311
312 SHAMap const&
313 txMap() const
314 {
315 return txMap_;
316 }
317
318 SHAMap&
320 {
321 return txMap_;
322 }
323
324 // returns false on error
325 bool
326 addSLE(SLE const& sle);
327
328 //--------------------------------------------------------------------------
329
330 void
332
333 bool
334 walkLedger(beast::Journal j, bool parallel = false) const;
335
336 bool
337 isSensible() const;
338
339 void
340 invariants() const;
341 void
342 unshare() const;
343
350 negativeUNL() const;
351
358 validatorToDisable() const;
359
366 validatorToReEnable() const;
367
373 void
375
379 bool
380 isFlagLedger() const;
381
385 bool
386 isVotingLedger() const;
387
389 peek(Keylet const& k) const;
390
391private:
392 class SlesIterImpl;
393 class TxsIterImpl;
394
395 bool
396 setup();
397
406 deserializeTx(SHAMapItem const& item);
407
420
422
423 // A SHAMap containing the transactions associated with this ledger.
424 SHAMap mutable txMap_;
425
426 // A SHAMap containing the state objects for this ledger.
428
429 // Protects fee variables
431
436};
437
442
443} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:44
Wraps a DigestAwareReadView to provide caching.
Definition CachedView.h:143
void rawErase(SLE::ref sle) override
Delete an existing state item.
bool txExists(uint256 const &key) const override
std::unique_ptr< TxsType::iter_base > txsEnd() const override
bool isFlagLedger() const
Returns true if the ledger is a flag ledger.
std::optional< digest_type > digest(key_type const &key) const override
Return the digest associated with the key.
void rawTxInsert(uint256 const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData) override
std::optional< PublicKey > validatorToDisable() const
get the to be disabled validator's master public key if any
void setLedgerInfo(LedgerHeader const &info)
void updateNegativeUNL()
update the Negative UNL ledger component.
void rawInsert(SLE::ref sle) override
Unconditionally insert a state item.
bool isVotingLedger() const
Returns true if the ledger directly precedes a flag ledger.
std::unique_ptr< SlesType::iter_base > slesBegin() const override
hash_set< PublicKey > negativeUNL() const
get Negative UNL validators' master public keys
Ledger(Ledger &&)=delete
void setImmutable(bool rehash=true)
SHAMap const & stateMap() const
SHAMap const & txMap() const
bool open() const override
Returns true if this reflects an open ledger.
static std::pair< std::shared_ptr< STTx const >, std::shared_ptr< STObject const > > deserializeTxPlusMeta(SHAMapItem const &item)
Deserialize a SHAMapItem containing STTx + STObject metadata.
LedgerHeader const & header() const override
Returns information about the ledger.
void setAccepted(NetClock::time_point closeTime, NetClock::duration closeResolution, bool correctCloseTime)
Ledger(Ledger const &)=delete
void rawReplace(SLE::ref sle) override
Unconditionally replace a state item.
static std::shared_ptr< STTx const > deserializeTx(SHAMapItem const &item)
Deserialize a SHAMapItem containing a single STTx.
Ledger & operator=(Ledger const &)=delete
void setTotalDrops(std::uint64_t totDrops)
bool addSLE(SLE const &sle)
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
std::unique_ptr< TxsType::iter_base > txsBegin() const override
std::unique_ptr< SlesType::iter_base > slesEnd() const override
~Ledger() override=default
std::optional< uint256 > succ(uint256 const &key, std::optional< uint256 > const &last=std::nullopt) const override
Ledger & operator=(Ledger &&)=delete
Rules const & rules() const override
Returns the tx processing rules.
Fees const & fees() const override
Returns the fees for the base ledger.
bool walkLedger(beast::Journal j, bool parallel=false) const
std::unique_ptr< SlesType::iter_base > slesUpperBound(uint256 const &key) const override
std::optional< PublicKey > validatorToReEnable() const
get the to be re-enabled validator's master public key if any
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
SLE::const_pointer read(Keylet const &k) const override
Return the state item associated with a key.
SLE::pointer peek(Keylet const &k) const
bool exists(Keylet const &k) const override
Determine if a state item exists.
std::chrono::time_point< NetClock > time_point
Definition chrono.h:48
std::chrono::duration< rep, period > duration
Definition chrono.h:47
std::pair< std::shared_ptr< STTx const >, std::shared_ptr< STObject const > > tx_type
Definition ReadView.h:43
uint256 key_type
Definition ReadView.h:45
Rules controlling protocol behavior.
Definition Rules.h:40
std::shared_ptr< STLedgerEntry > const & ref
std::shared_ptr< STLedgerEntry > pointer
std::shared_ptr< STLedgerEntry const > const_pointer
Service registry for dependency injection.
Interface for changing ledger entries with transactions.
Definition RawView.h:84
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
CreateGenesisT const kCreateGenesis
std::unordered_set< Value, Hash, Pred, Allocator > hash_set
STLedgerEntry SLE
CachedView< Ledger > CachedLedger
A ledger wrapped in a CachedView.
BaseUInt< 256 > uint256
Definition base_uint.h:580
CreateGenesisT()=default
Reflects the fee settings for a particular ledger.
A pair of SHAMap key and LedgerEntryType.
Definition Keylet.h:20
Information about the notional ledger backing the view.