rippled
Ledger.h
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 #ifndef RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED
21 #define RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED
22 
23 #include <ripple/basics/CountedObject.h>
24 #include <ripple/beast/utility/Journal.h>
25 #include <ripple/core/TimeKeeper.h>
26 #include <ripple/ledger/CachedView.h>
27 #include <ripple/ledger/TxMeta.h>
28 #include <ripple/ledger/View.h>
29 #include <ripple/protocol/Book.h>
30 #include <ripple/protocol/Indexes.h>
31 #include <ripple/protocol/STLedgerEntry.h>
32 #include <ripple/protocol/Serializer.h>
33 #include <ripple/shamap/SHAMap.h>
34 #include <boost/optional.hpp>
35 #include <mutex>
36 
37 namespace ripple {
38 
39 class Application;
40 class Job;
41 class TransactionMaster;
42 
43 class SqliteStatement;
44 
46 {
47  explicit create_genesis_t() = default;
48 };
49 extern create_genesis_t const create_genesis;
50 
77 class Ledger final : public std::enable_shared_from_this<Ledger>,
78  public DigestAwareReadView,
79  public TxsRawView,
80  public CountedObject<Ledger>
81 {
82 public:
83  static char const*
85  {
86  return "Ledger";
87  }
88 
89  Ledger(Ledger const&) = delete;
90  Ledger&
91  operator=(Ledger const&) = delete;
92 
107  Ledger(
109  Config const& config,
110  std::vector<uint256> const& amendments,
111  Family& family);
112 
113  Ledger(LedgerInfo const& info, Config const& config, Family& family);
114 
119  Ledger(
120  LedgerInfo const& info,
121  bool& loaded,
122  bool acquire,
123  Config const& config,
124  Family& family,
125  beast::Journal j);
126 
133  Ledger(Ledger const& previous, NetClock::time_point closeTime);
134 
135  // used for database ledgers
136  Ledger(
137  std::uint32_t ledgerSeq,
138  NetClock::time_point closeTime,
139  Config const& config,
140  Family& family);
141 
142  ~Ledger() = default;
143 
144  //
145  // ReadView
146  //
147 
148  bool
149  open() const override
150  {
151  return false;
152  }
153 
154  LedgerInfo const&
155  info() const override
156  {
157  return info_;
158  }
159 
160  Fees const&
161  fees() const override
162  {
163  return fees_;
164  }
165 
166  Rules const&
167  rules() const override
168  {
169  return rules_;
170  }
171 
172  bool
173  exists(Keylet const& k) const override;
174 
175  boost::optional<uint256>
176  succ(uint256 const& key, boost::optional<uint256> const& last = boost::none)
177  const override;
178 
180  read(Keylet const& k) const override;
181 
183  slesBegin() const override;
184 
186  slesEnd() const override;
187 
189  slesUpperBound(uint256 const& key) const override;
190 
192  txsBegin() const override;
193 
195  txsEnd() const override;
196 
197  bool
198  txExists(uint256 const& key) const override;
199 
200  tx_type
201  txRead(key_type const& key) const override;
202 
203  //
204  // DigestAwareReadView
205  //
206 
207  boost::optional<digest_type>
208  digest(key_type const& key) const override;
209 
210  //
211  // RawView
212  //
213 
214  void
215  rawErase(std::shared_ptr<SLE> const& sle) override;
216 
217  void
218  rawInsert(std::shared_ptr<SLE> const& sle) override;
219 
220  void
221  rawReplace(std::shared_ptr<SLE> const& sle) override;
222 
223  void
224  rawDestroyXRP(XRPAmount const& fee) override
225  {
226  info_.drops -= fee;
227  }
228 
229  //
230  // TxsRawView
231  //
232 
233  void
234  rawTxInsert(
235  uint256 const& key,
237  std::shared_ptr<Serializer const> const& metaData) override;
238 
239  //--------------------------------------------------------------------------
240 
241  void
242  setValidated() const
243  {
244  info_.validated = true;
245  }
246 
247  void
248  setAccepted(
249  NetClock::time_point closeTime,
250  NetClock::duration closeResolution,
251  bool correctCloseTime,
252  Config const& config);
253 
254  void
255  setImmutable(Config const& config);
256 
257  bool
258  isImmutable() const
259  {
260  return mImmutable;
261  }
262 
263  /* Mark this ledger as "should be full".
264 
265  "Full" is metadata property of the ledger, it indicates
266  that the local server wants all the corresponding nodes
267  in durable storage.
268 
269  This is marked `const` because it reflects metadata
270  and not data that is in common with other nodes on the
271  network.
272  */
273  void
274  setFull() const
275  {
276  txMap_->setFull();
277  stateMap_->setFull();
278  txMap_->setLedgerSeq(info_.seq);
279  stateMap_->setLedgerSeq(info_.seq);
280  }
281 
282  void
284  {
285  info_.drops = totDrops;
286  }
287 
288  SHAMap const&
289  stateMap() const
290  {
291  return *stateMap_;
292  }
293 
294  SHAMap&
296  {
297  return *stateMap_;
298  }
299 
300  SHAMap const&
301  txMap() const
302  {
303  return *txMap_;
304  }
305 
306  SHAMap&
308  {
309  return *txMap_;
310  }
311 
312  // returns false on error
313  bool
314  addSLE(SLE const& sle);
315 
316  //--------------------------------------------------------------------------
317 
318  void
319  updateSkipList();
320 
321  bool
322  walkLedger(beast::Journal j) const;
323 
324  bool
325  assertSane(beast::Journal ledgerJ) const;
326 
327  void
328  invariants() const;
329  void
330  unshare() const;
331 
338  negativeUNL() const;
339 
345  boost::optional<PublicKey>
346  validatorToDisable() const;
347 
353  boost::optional<PublicKey>
354  validatorToReEnable() const;
355 
361  void
363 
365  bool
366  isFlagLedger() const;
367 
369  bool
370  isVotingLedger() const;
371 
372 private:
373  class sles_iter_impl;
374  class txs_iter_impl;
375 
376  bool
377  setup(Config const& config);
378 
380  peek(Keylet const& k) const;
381 
383 
386 
387  // Protects fee variables
389 
393 };
394 
397 
400 bool
402 
403 //------------------------------------------------------------------------------
404 //
405 // API
406 //
407 //------------------------------------------------------------------------------
408 
409 extern bool
411  Application& app,
412  std::shared_ptr<Ledger const> const& ledger,
413  bool isSynchronous,
414  bool isCurrent);
415 
417 loadByIndex(std::uint32_t ledgerIndex, Application& app, bool acquire = true);
418 
421  std::string const& sqlSuffix,
422  Application& app,
423  bool acquire = true);
424 
426 loadByHash(uint256 const& ledgerHash, Application& app, bool acquire = true);
427 
428 extern uint256
430 
431 extern bool
433  std::uint32_t index,
434  uint256& ledgerHash,
435  uint256& parentHash,
436  Application& app);
437 
440 
448 deserializeTx(SHAMapItem const& item);
449 
460 deserializeTxPlusMeta(SHAMapItem const& item);
461 
462 } // namespace ripple
463 
464 #endif
ripple::Ledger::mutex_
std::mutex mutex_
Definition: Ledger.h:388
ripple::Ledger::slesUpperBound
std::unique_ptr< sles_type::iter_base > slesUpperBound(uint256 const &key) const override
Definition: Ledger.cpp:439
ripple::Ledger::fees
Fees const & fees() const override
Returns the fees for the base ledger.
Definition: Ledger.h:161
ripple::loadLedgerHelper
std::tuple< std::shared_ptr< Ledger >, std::uint32_t, uint256 > loadLedgerHelper(std::string const &sqlSuffix, Application &app, bool acquire)
Definition: Ledger.cpp:1133
ripple::Application
Definition: Application.h:97
ripple::Ledger::slesBegin
std::unique_ptr< sles_type::iter_base > slesBegin() const override
Definition: Ledger.cpp:427
ripple::Ledger::addSLE
bool addSLE(SLE const &sle)
Definition: Ledger.cpp:354
ripple::isFlagLedger
bool isFlagLedger(LedgerIndex seq)
Returns true if the given ledgerIndex is a flag ledgerIndex.
Definition: Ledger.cpp:857
ripple::Ledger::rawReplace
void rawReplace(std::shared_ptr< SLE > const &sle) override
Unconditionally replace a state item.
Definition: Ledger.cpp:508
ripple::Ledger::txMap_
std::shared_ptr< SHAMap > txMap_
Definition: Ledger.h:384
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::Ledger::mImmutable
bool mImmutable
Definition: Ledger.h:382
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:110
ripple::STLedgerEntry
Definition: STLedgerEntry.h:30
ripple::Ledger::isVotingLedger
bool isVotingLedger() const
Returns true if the ledger directly precedes a flag ledger.
Definition: Ledger.cpp:851
ripple::Ledger::txRead
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Definition: Ledger.cpp:464
std::string
STL class.
std::shared_ptr
STL class.
ripple::loadByIndex
std::shared_ptr< Ledger > loadByIndex(std::uint32_t ledgerIndex, Application &app, bool acquire)
Definition: Ledger.cpp:1225
ripple::Ledger::fees_
Fees fees_
Definition: Ledger.h:390
ripple::Ledger::unshare
void unshare() const
Definition: Ledger.cpp:1109
ripple::Ledger::~Ledger
~Ledger()=default
ripple::Ledger::slesEnd
std::unique_ptr< sles_type::iter_base > slesEnd() const override
Definition: Ledger.cpp:433
std::unordered_set
STL class.
std::pair
ripple::ReadView::key_type
uint256 key_type
Definition: ReadView.h:194
std::vector
STL class.
std::chrono::duration
ripple::FLAG_LEDGER_INTERVAL
constexpr std::uint32_t FLAG_LEDGER_INTERVAL
Definition: Ledger.h:398
ripple::Ledger::exists
bool exists(Keylet const &k) const override
Determine if a state item exists.
Definition: Ledger.cpp:389
ripple::Ledger::peek
std::shared_ptr< SLE > peek(Keylet const &k) const
Definition: Ledger.cpp:590
ripple::Ledger::invariants
void invariants() const
Definition: Ledger.cpp:1116
ripple::Ledger::operator=
Ledger & operator=(Ledger const &)=delete
std::tuple
ripple::Ledger::walkLedger
bool walkLedger(beast::Journal j) const
Definition: Ledger.cpp:710
ripple::LedgerInfo::seq
LedgerIndex seq
Definition: ReadView.h:88
ripple::Ledger::rawTxInsert
void rawTxInsert(uint256 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: Ledger.cpp:519
ripple::Ledger::rawErase
void rawErase(std::shared_ptr< SLE > const &sle) override
Delete an existing state item.
Definition: Ledger.cpp:491
ripple::Ledger::updateNegativeUNL
void updateNegativeUNL()
update the Negative UNL ledger component.
Definition: Ledger.cpp:659
ripple::Ledger::info_
LedgerInfo info_
Definition: Ledger.h:392
ripple::deserializeTx
std::shared_ptr< STTx const > deserializeTx(SHAMapItem const &item)
Deserialize a SHAMapItem containing a single STTx.
Definition: Ledger.cpp:363
ripple::Ledger::txMap
SHAMap & txMap()
Definition: Ledger.h:307
ripple::Ledger::setImmutable
void setImmutable(Config const &config)
Definition: Ledger.cpp:319
ripple::getHashByIndex
uint256 getHashByIndex(std::uint32_t ledgerIndex, Application &app)
Definition: Ledger.cpp:1258
ripple::Ledger::txsEnd
std::unique_ptr< txs_type::iter_base > txsEnd() const override
Definition: Ledger.cpp:452
ripple::create_genesis_t::create_genesis_t
create_genesis_t()=default
ripple::base_uint< 256 >
ripple::Ledger::info
LedgerInfo const & info() const override
Returns information about the ledger.
Definition: Ledger.h:155
ripple::Ledger::validatorToReEnable
boost::optional< PublicKey > validatorToReEnable() const
get the to be re-enabled validator's master public key if any
Definition: Ledger.cpp:644
ripple::Ledger::txExists
bool txExists(uint256 const &key) const override
Returns true if a tx exists in the tx map.
Definition: Ledger.cpp:458
ripple::Ledger::assertSane
bool assertSane(beast::Journal ledgerJ) const
Definition: Ledger.cpp:758
ripple::loadByHash
std::shared_ptr< Ledger > loadByHash(uint256 const &ledgerHash, Application &app, bool acquire)
Definition: Ledger.cpp:1240
ripple::Fees
Reflects the fee settings for a particular ledger.
Definition: ReadView.h:47
ripple::Ledger::rules
Rules const & rules() const override
Returns the tx processing rules.
Definition: Ledger.h:167
ripple::CachedView
Wraps a DigestAwareReadView to provide caching.
Definition: CachedView.h:159
ripple::Ledger::getCountedObjectName
static char const * getCountedObjectName()
Definition: Ledger.h:84
ripple::Ledger::setAccepted
void setAccepted(NetClock::time_point closeTime, NetClock::duration closeResolution, bool correctCloseTime, Config const &config)
Definition: Ledger.cpp:338
ripple::Ledger
Holds a ledger.
Definition: Ledger.h:77
ripple::Ledger::setFull
void setFull() const
Definition: Ledger.h:274
ripple::SHAMapItem
Definition: SHAMapItem.h:34
ripple::Config
Definition: Config.h:67
ripple::deserializeTxPlusMeta
std::pair< std::shared_ptr< STTx const >, std::shared_ptr< STObject const > > deserializeTxPlusMeta(SHAMapItem const &item)
Deserialize a SHAMapItem containing STTx + STObject metadata.
Definition: Ledger.cpp:370
ripple::Ledger::stateMap
SHAMap & stateMap()
Definition: Ledger.h:295
ripple::Ledger::rawDestroyXRP
void rawDestroyXRP(XRPAmount const &fee) override
Destroy XRP.
Definition: Ledger.h:224
ripple::Ledger::validatorToDisable
boost::optional< PublicKey > validatorToDisable() const
get the to be disabled validator's master public key if any
Definition: Ledger.cpp:629
ripple::isCurrent
bool isCurrent(ValidationParms const &p, NetClock::time_point now, NetClock::time_point signTime, NetClock::time_point seenTime)
Whether a validation is still current.
Definition: Validations.h:145
ripple::Ledger::stateMap
SHAMap const & stateMap() const
Definition: Ledger.h:289
ripple::DigestAwareReadView
ReadView that associates keys with digests.
Definition: ReadView.h:392
ripple::SHAMap
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
Definition: SHAMap.h:81
ripple::create_genesis_t
Definition: Ledger.h:45
ripple::Ledger::isFlagLedger
bool isFlagLedger() const
Returns true if the ledger is a flag ledger.
Definition: Ledger.cpp:846
std::enable_shared_from_this
ripple::Ledger::rawInsert
void rawInsert(std::shared_ptr< SLE > const &sle) override
Unconditionally insert a state item.
Definition: Ledger.cpp:498
std::chrono::time_point
ripple::Family
Definition: Family.h:32
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
std::uint32_t
ripple::Ledger::isImmutable
bool isImmutable() const
Definition: Ledger.h:258
std::map
STL class.
ripple::LedgerInfo::drops
XRPAmount drops
Definition: ReadView.h:101
ripple::ReadView::tx_type
std::pair< std::shared_ptr< STTx const >, std::shared_ptr< STObject const > > tx_type
Definition: ReadView.h:192
ripple::Ledger::read
std::shared_ptr< SLE const > read(Keylet const &k) const override
Return the state item associated with a key.
Definition: Ledger.cpp:407
ripple::Ledger::txMap
SHAMap const & txMap() const
Definition: Ledger.h:301
ripple::Ledger::txsBegin
std::unique_ptr< txs_type::iter_base > txsBegin() const override
Definition: Ledger.cpp:446
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Ledger::setup
bool setup(Config const &config)
Definition: Ledger.cpp:536
ripple::create_genesis
const create_genesis_t create_genesis
Definition: Ledger.cpp:57
ripple::Ledger::stateMap_
std::shared_ptr< SHAMap > stateMap_
Definition: Ledger.h:385
ripple::Ledger::updateSkipList
void updateSkipList()
Definition: Ledger.cpp:782
ripple::Ledger::open
bool open() const override
Returns true if this reflects an open ledger.
Definition: Ledger.h:149
ripple::Ledger::succ
boost::optional< uint256 > succ(uint256 const &key, boost::optional< uint256 > const &last=boost::none) const override
Return the key of the next state item.
Definition: Ledger.cpp:396
ripple::Ledger::negativeUNL
hash_set< PublicKey > negativeUNL() const
get Negative UNL validators' master public keys
Definition: Ledger.cpp:603
ripple::Rules
Rules controlling protocol behavior.
Definition: ReadView.h:127
mutex
ripple::getHashesByIndex
bool getHashesByIndex(std::uint32_t ledgerIndex, uint256 &ledgerHash, uint256 &parentHash, Application &app)
Definition: Ledger.cpp:1287
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:80
ripple::Ledger::setTotalDrops
void setTotalDrops(std::uint64_t totDrops)
Definition: Ledger.h:283
ripple::TxsRawView
Interface for changing ledger entries with transactions.
Definition: RawView.h:98
ripple::pendSaveValidated
bool pendSaveValidated(Application &app, std::shared_ptr< Ledger const > const &ledger, bool isSynchronous, bool isCurrent)
Save, or arrange to save, a fully-validated ledger Returns false on error.
Definition: Ledger.cpp:1059
ripple::LedgerInfo::validated
bool validated
Definition: ReadView.h:106
ripple::Ledger::Ledger
Ledger(Ledger const &)=delete
std::unique_ptr
STL class.
ripple::Ledger::digest
boost::optional< digest_type > digest(key_type const &key) const override
Return the digest associated with the key.
Definition: Ledger.cpp:478
ripple::Ledger::rules_
Rules rules_
Definition: Ledger.h:391
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::Ledger::setValidated
void setValidated() const
Definition: Ledger.h:242