rippled
Ledger.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/app/ledger/AcceptedLedger.h>
21 #include <ripple/app/ledger/InboundLedgers.h>
22 #include <ripple/app/ledger/Ledger.h>
23 #include <ripple/app/ledger/LedgerMaster.h>
24 #include <ripple/app/ledger/LedgerToJson.h>
25 #include <ripple/app/ledger/OrderBookDB.h>
26 #include <ripple/app/ledger/PendingSaves.h>
27 #include <ripple/app/ledger/TransactionMaster.h>
28 #include <ripple/app/main/Application.h>
29 #include <ripple/app/misc/HashRouter.h>
30 #include <ripple/app/misc/LoadFeeTrack.h>
31 #include <ripple/app/misc/NetworkOPs.h>
32 #include <ripple/app/rdb/backend/PostgresDatabase.h>
33 #include <ripple/app/rdb/backend/SQLiteDatabase.h>
34 #include <ripple/basics/Log.h>
35 #include <ripple/basics/StringUtilities.h>
36 #include <ripple/basics/contract.h>
37 #include <ripple/beast/core/LexicalCast.h>
38 #include <ripple/consensus/LedgerTiming.h>
39 #include <ripple/core/Config.h>
40 #include <ripple/core/JobQueue.h>
41 #include <ripple/core/Pg.h>
42 #include <ripple/core/SociDB.h>
43 #include <ripple/json/to_string.h>
44 #include <ripple/nodestore/Database.h>
45 #include <ripple/protocol/Feature.h>
46 #include <ripple/protocol/HashPrefix.h>
47 #include <ripple/protocol/Indexes.h>
48 #include <ripple/protocol/PublicKey.h>
49 #include <ripple/protocol/SecretKey.h>
50 #include <ripple/protocol/UintTypes.h>
51 #include <ripple/protocol/digest.h>
52 #include <ripple/protocol/jss.h>
53 #include <boost/optional.hpp>
54 #include <cassert>
55 #include <utility>
56 #include <vector>
57 
58 #include <ripple/nodestore/impl/DatabaseNodeImp.h>
59 
60 namespace ripple {
61 
63 
64 uint256
66 {
67  // VFALCO This has to match addRaw in View.h.
68  return sha512Half(
70  std::uint32_t(info.seq),
71  std::uint64_t(info.drops.drops()),
72  info.parentHash,
73  info.txHash,
74  info.accountHash,
78  std::uint8_t(info.closeFlags));
79 }
80 
81 //------------------------------------------------------------------------------
82 
83 class Ledger::sles_iter_impl : public sles_type::iter_base
84 {
85 private:
87 
88 public:
89  sles_iter_impl() = delete;
91  operator=(sles_iter_impl const&) = delete;
92 
93  sles_iter_impl(sles_iter_impl const&) = default;
94 
96  {
97  }
98 
100  copy() const override
101  {
102  return std::make_unique<sles_iter_impl>(*this);
103  }
104 
105  bool
106  equal(base_type const& impl) const override
107  {
108  if (auto const p = dynamic_cast<sles_iter_impl const*>(&impl))
109  return iter_ == p->iter_;
110  return false;
111  }
112 
113  void
114  increment() override
115  {
116  ++iter_;
117  }
118 
120  dereference() const override
121  {
122  auto const item = *iter_;
123  SerialIter sit(item.slice());
124  return std::make_shared<SLE const>(sit, item.key());
125  }
126 };
127 
128 //------------------------------------------------------------------------------
129 
130 class Ledger::txs_iter_impl : public txs_type::iter_base
131 {
132 private:
133  bool metadata_;
135 
136 public:
137  txs_iter_impl() = delete;
139  operator=(txs_iter_impl const&) = delete;
140 
141  txs_iter_impl(txs_iter_impl const&) = default;
142 
144  : metadata_(metadata), iter_(std::move(iter))
145  {
146  }
147 
149  copy() const override
150  {
151  return std::make_unique<txs_iter_impl>(*this);
152  }
153 
154  bool
155  equal(base_type const& impl) const override
156  {
157  if (auto const p = dynamic_cast<txs_iter_impl const*>(&impl))
158  return iter_ == p->iter_;
159  return false;
160  }
161 
162  void
163  increment() override
164  {
165  ++iter_;
166  }
167 
169  dereference() const override
170  {
171  auto const item = *iter_;
172  if (metadata_)
173  return deserializeTxPlusMeta(item);
174  return {deserializeTx(item), nullptr};
175  }
176 };
177 
178 //------------------------------------------------------------------------------
179 
182  Config const& config,
183  std::vector<uint256> const& amendments,
184  Family& family)
185  : mImmutable(false)
186  , txMap_(std::make_shared<SHAMap>(SHAMapType::TRANSACTION, family))
187  , stateMap_(std::make_shared<SHAMap>(SHAMapType::STATE, family))
188  , rules_{config.features}
189 {
190  info_.seq = 1;
191  info_.drops = INITIAL_XRP;
192  info_.closeTimeResolution = ledgerGenesisTimeResolution;
193 
194  static auto const id = calcAccountID(
195  generateKeyPair(KeyType::secp256k1, generateSeed("masterpassphrase"))
196  .first);
197  {
198  auto const sle = std::make_shared<SLE>(keylet::account(id));
199  sle->setFieldU32(sfSequence, 1);
200  sle->setAccountID(sfAccount, id);
201  sle->setFieldAmount(sfBalance, info_.drops);
202  rawInsert(sle);
203  }
204 
205  if (!amendments.empty())
206  {
207  auto const sle = std::make_shared<SLE>(keylet::amendments());
208  sle->setFieldV256(sfAmendments, STVector256{amendments});
209  rawInsert(sle);
210  }
211 
212  {
213  auto sle = std::make_shared<SLE>(keylet::fees());
214  // Whether featureXRPFees is supported will depend on startup options.
215  if (std::find(amendments.begin(), amendments.end(), featureXRPFees) !=
216  amendments.end())
217  {
218  sle->at(sfBaseFeeDrops) = config.FEES.reference_fee;
219  sle->at(sfReserveBaseDrops) = config.FEES.account_reserve;
220  sle->at(sfReserveIncrementDrops) = config.FEES.owner_reserve;
221  }
222  else
223  {
224  if (auto const f =
225  config.FEES.reference_fee.dropsAs<std::uint64_t>())
226  sle->at(sfBaseFee) = *f;
227  if (auto const f =
228  config.FEES.account_reserve.dropsAs<std::uint32_t>())
229  sle->at(sfReserveBase) = *f;
230  if (auto const f =
231  config.FEES.owner_reserve.dropsAs<std::uint32_t>())
232  sle->at(sfReserveIncrement) = *f;
234  }
235  rawInsert(sle);
236  }
237 
238  stateMap_->flushDirty(hotACCOUNT_NODE);
239  setImmutable();
240 }
241 
243  LedgerInfo const& info,
244  bool& loaded,
245  bool acquire,
246  Config const& config,
247  Family& family,
248  beast::Journal j)
249  : mImmutable(true)
250  , txMap_(std::make_shared<SHAMap>(
252  info.txHash,
253  family))
254  , stateMap_(
255  std::make_shared<SHAMap>(SHAMapType::STATE, info.accountHash, family))
256  , rules_(config.features)
257  , info_(info)
258 {
259  loaded = true;
260 
261  if (info_.txHash.isNonZero() &&
262  !txMap_->fetchRoot(SHAMapHash{info_.txHash}, nullptr))
263  {
264  if (config.reporting())
265  {
266  // Reporting should never have incomplete data
267  Throw<std::runtime_error>("Missing tx map root for ledger");
268  }
269  loaded = false;
270  JLOG(j.warn()) << "Don't have transaction root for ledger" << info_.seq;
271  }
272 
273  if (info_.accountHash.isNonZero() &&
274  !stateMap_->fetchRoot(SHAMapHash{info_.accountHash}, nullptr))
275  {
276  if (config.reporting())
277  {
278  // Reporting should never have incomplete data
279  Throw<std::runtime_error>("Missing state map root for ledger");
280  }
281  loaded = false;
282  JLOG(j.warn()) << "Don't have state data root for ledger" << info_.seq;
283  }
284 
285  txMap_->setImmutable();
286  stateMap_->setImmutable();
287 
288  defaultFees(config);
289  if (!setup())
290  loaded = false;
291 
292  if (!loaded)
293  {
295  if (acquire && !config.reporting())
297  }
298 }
299 
300 // Create a new ledger that follows this one
301 Ledger::Ledger(Ledger const& prevLedger, NetClock::time_point closeTime)
302  : mImmutable(false)
303  , txMap_(std::make_shared<SHAMap>(
305  prevLedger.stateMap_->family()))
306  , stateMap_(prevLedger.stateMap_->snapShot(true))
307  , fees_(prevLedger.fees_)
308  , rules_(prevLedger.rules_)
309 {
310  info_.seq = prevLedger.info_.seq + 1;
311  info_.parentCloseTime = prevLedger.info_.closeTime;
312  info_.hash = prevLedger.info().hash + uint256(1);
313  info_.drops = prevLedger.info().drops;
315  info_.parentHash = prevLedger.info().hash;
317  prevLedger.info_.closeTimeResolution,
318  getCloseAgree(prevLedger.info()),
319  info_.seq);
320 
321  if (prevLedger.info_.closeTime == NetClock::time_point{})
322  {
324  }
325  else
326  {
327  info_.closeTime =
329  }
330 }
331 
332 Ledger::Ledger(LedgerInfo const& info, Config const& config, Family& family)
333  : mImmutable(true)
334  , txMap_(std::make_shared<SHAMap>(
336  info.txHash,
337  family))
338  , stateMap_(
339  std::make_shared<SHAMap>(SHAMapType::STATE, info.accountHash, family))
340  , rules_{config.features}
341  , info_(info)
342 {
343  info_.hash = calculateLedgerHash(info_);
344 }
345 
347  std::uint32_t ledgerSeq,
348  NetClock::time_point closeTime,
349  Config const& config,
350  Family& family)
351  : mImmutable(false)
352  , txMap_(std::make_shared<SHAMap>(SHAMapType::TRANSACTION, family))
353  , stateMap_(std::make_shared<SHAMap>(SHAMapType::STATE, family))
354  , rules_{config.features}
355 {
356  info_.seq = ledgerSeq;
357  info_.closeTime = closeTime;
358  info_.closeTimeResolution = ledgerDefaultTimeResolution;
359  defaultFees(config);
360  setup();
361 }
362 
363 void
365 {
366  // Force update, since this is the only
367  // place the hash transitions to valid
368  if (!mImmutable && rehash)
369  {
370  info_.txHash = txMap_->getHash().as_uint256();
371  info_.accountHash = stateMap_->getHash().as_uint256();
372  }
373 
374  if (rehash)
376 
377  mImmutable = true;
378  txMap_->setImmutable();
379  stateMap_->setImmutable();
380  setup();
381 }
382 
383 void
385  NetClock::time_point closeTime,
386  NetClock::duration closeResolution,
387  bool correctCloseTime)
388 {
389  // Used when we witnessed the consensus.
390  assert(!open());
391 
392  info_.closeTime = closeTime;
393  info_.closeTimeResolution = closeResolution;
394  info_.closeFlags = correctCloseTime ? 0 : sLCF_NoConsensusTime;
395  setImmutable();
396 }
397 
398 bool
399 Ledger::addSLE(SLE const& sle)
400 {
401  auto const s = sle.getSerializer();
402  SHAMapItem item(sle.key(), s.slice());
403  return stateMap_->addItem(SHAMapNodeType::tnACCOUNT_STATE, std::move(item));
404 }
405 
406 //------------------------------------------------------------------------------
407 
410 {
411  SerialIter sit(item.slice());
412  return std::make_shared<STTx const>(sit);
413 }
414 
417 {
419  result;
420  SerialIter sit(item.slice());
421  {
422  SerialIter s(sit.getSlice(sit.getVLDataLength()));
423  result.first = std::make_shared<STTx const>(s);
424  }
425  {
426  SerialIter s(sit.getSlice(sit.getVLDataLength()));
427  result.second = std::make_shared<STObject const>(s, sfMetadata);
428  }
429  return result;
430 }
431 
432 //------------------------------------------------------------------------------
433 
434 bool
435 Ledger::exists(Keylet const& k) const
436 {
437  // VFALCO NOTE Perhaps check the type for debug builds?
438  return stateMap_->hasItem(k.key);
439 }
440 
441 bool
442 Ledger::exists(uint256 const& key) const
443 {
444  return stateMap_->hasItem(key);
445 }
446 
448 Ledger::succ(uint256 const& key, std::optional<uint256> const& last) const
449 {
450  auto item = stateMap_->upper_bound(key);
451  if (item == stateMap_->end())
452  return std::nullopt;
453  if (last && item->key() >= last)
454  return std::nullopt;
455  return item->key();
456 }
457 
459 Ledger::read(Keylet const& k) const
460 {
461  if (k.key == beast::zero)
462  {
463  assert(false);
464  return nullptr;
465  }
466  auto const& item = stateMap_->peekItem(k.key);
467  if (!item)
468  return nullptr;
469  auto sle = std::make_shared<SLE>(SerialIter{item->slice()}, item->key());
470  if (!k.check(*sle))
471  return nullptr;
472  return sle;
473 }
474 
475 //------------------------------------------------------------------------------
476 
477 auto
478 Ledger::slesBegin() const -> std::unique_ptr<sles_type::iter_base>
479 {
480  return std::make_unique<sles_iter_impl>(stateMap_->begin());
481 }
482 
483 auto
484 Ledger::slesEnd() const -> std::unique_ptr<sles_type::iter_base>
485 {
486  return std::make_unique<sles_iter_impl>(stateMap_->end());
487 }
488 
489 auto
492 {
493  return std::make_unique<sles_iter_impl>(stateMap_->upper_bound(key));
494 }
495 
496 auto
497 Ledger::txsBegin() const -> std::unique_ptr<txs_type::iter_base>
498 {
499  return std::make_unique<txs_iter_impl>(!open(), txMap_->begin());
500 }
501 
502 auto
503 Ledger::txsEnd() const -> std::unique_ptr<txs_type::iter_base>
504 {
505  return std::make_unique<txs_iter_impl>(!open(), txMap_->end());
506 }
507 
508 bool
509 Ledger::txExists(uint256 const& key) const
510 {
511  return txMap_->hasItem(key);
512 }
513 
514 auto
515 Ledger::txRead(key_type const& key) const -> tx_type
516 {
517  assert(txMap_);
518  auto const& item = txMap_->peekItem(key);
519  if (!item)
520  return {};
521  if (!open())
522  {
523  auto result = deserializeTxPlusMeta(*item);
524  return {std::move(result.first), std::move(result.second)};
525  }
526  return {deserializeTx(*item), nullptr};
527 }
528 
529 auto
531 {
533  // VFALCO Unfortunately this loads the item
534  // from the NodeStore needlessly.
535  if (!stateMap_->peekItem(key, digest))
536  return std::nullopt;
537  return digest.as_uint256();
538 }
539 
540 //------------------------------------------------------------------------------
541 
542 void
544 {
545  if (!stateMap_->delItem(sle->key()))
546  LogicError("Ledger::rawErase: key not found");
547 }
548 
549 void
551 {
552  if (!stateMap_->delItem(key))
553  LogicError("Ledger::rawErase: key not found");
554 }
555 
556 void
558 {
559  Serializer ss;
560  sle->add(ss);
561  if (!stateMap_->addGiveItem(
563  std::make_shared<SHAMapItem const>(sle->key(), ss.slice())))
564  LogicError("Ledger::rawInsert: key already exists");
565 }
566 
567 void
569 {
570  Serializer ss;
571  sle->add(ss);
572  if (!stateMap_->updateGiveItem(
574  std::make_shared<SHAMapItem const>(sle->key(), ss.slice())))
575  LogicError("Ledger::rawReplace: key not found");
576 }
577 
578 void
580  uint256 const& key,
582  std::shared_ptr<Serializer const> const& metaData)
583 {
584  assert(metaData);
585 
586  // low-level - just add to table
587  Serializer s(txn->getDataLength() + metaData->getDataLength() + 16);
588  s.addVL(txn->peekData());
589  s.addVL(metaData->peekData());
590  if (!txMap().addGiveItem(
592  std::make_shared<SHAMapItem const>(key, s.slice())))
593  LogicError("duplicate_tx: " + to_string(key));
594 }
595 
596 uint256
598  uint256 const& key,
600  std::shared_ptr<Serializer const> const& metaData)
601 {
602  assert(metaData);
603 
604  // low-level - just add to table
605  Serializer s(txn->getDataLength() + metaData->getDataLength() + 16);
606  s.addVL(txn->peekData());
607  s.addVL(metaData->peekData());
608  auto item = std::make_shared<SHAMapItem const>(key, s.slice());
609  auto hash = sha512Half(HashPrefix::txNode, item->slice(), item->key());
610  if (!txMap().addGiveItem(SHAMapNodeType::tnTRANSACTION_MD, std::move(item)))
611  LogicError("duplicate_tx: " + to_string(key));
612 
613  return hash;
614 }
615 
616 bool
618 {
619  bool ret = true;
620 
621  try
622  {
624  }
625  catch (SHAMapMissingNode const&)
626  {
627  ret = false;
628  }
629  catch (std::exception const&)
630  {
631  Rethrow();
632  }
633 
634  try
635  {
636  if (auto const sle = read(keylet::fees()))
637  {
638  bool oldFees = false;
639  bool newFees = false;
640  {
641  auto const baseFee = sle->at(~sfBaseFee);
642  auto const reserveBase = sle->at(~sfReserveBase);
643  auto const reserveIncrement = sle->at(~sfReserveIncrement);
644  if (baseFee)
645  fees_.base = *baseFee;
646  if (reserveBase)
647  fees_.reserve = *reserveBase;
648  if (reserveIncrement)
649  fees_.increment = *reserveIncrement;
650  oldFees = baseFee || reserveBase || reserveIncrement;
651  }
652  {
653  auto const baseFeeXRP = sle->at(~sfBaseFeeDrops);
654  auto const reserveBaseXRP = sle->at(~sfReserveBaseDrops);
655  auto const reserveIncrementXRP =
656  sle->at(~sfReserveIncrementDrops);
657  auto assign = [&ret](
658  XRPAmount& dest,
659  std::optional<STAmount> const& src) {
660  if (src)
661  {
662  if (src->native())
663  dest = src->xrp();
664  else
665  ret = false;
666  }
667  };
668  assign(fees_.base, baseFeeXRP);
669  assign(fees_.reserve, reserveBaseXRP);
670  assign(fees_.increment, reserveIncrementXRP);
671  newFees = baseFeeXRP || reserveBaseXRP || reserveIncrementXRP;
672  }
673  if (oldFees && newFees)
674  // Should be all of one or the other, but not both
675  ret = false;
676  if (!rules_.enabled(featureXRPFees) && newFees)
677  // Can't populate the new fees before the amendment is enabled
678  ret = false;
679  }
680  }
681  catch (SHAMapMissingNode const&)
682  {
683  ret = false;
684  }
685  catch (std::exception const&)
686  {
687  Rethrow();
688  }
689 
690  return ret;
691 }
692 
693 void
695 {
696  assert(fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0);
697  if (fees_.base == 0)
698  fees_.base = config.FEES.reference_fee;
699  if (fees_.reserve == 0)
701  if (fees_.increment == 0)
703 }
704 
706 Ledger::peek(Keylet const& k) const
707 {
708  auto const& value = stateMap_->peekItem(k.key);
709  if (!value)
710  return nullptr;
711  auto sle = std::make_shared<SLE>(SerialIter{value->slice()}, value->key());
712  if (!k.check(*sle))
713  return nullptr;
714  return sle;
715 }
716 
719 {
720  hash_set<PublicKey> negUnl;
721  if (auto sle = read(keylet::negativeUNL());
722  sle && sle->isFieldPresent(sfDisabledValidators))
723  {
724  auto const& nUnlData = sle->getFieldArray(sfDisabledValidators);
725  for (auto const& n : nUnlData)
726  {
727  if (n.isFieldPresent(sfPublicKey))
728  {
729  auto d = n.getFieldVL(sfPublicKey);
730  auto s = makeSlice(d);
731  if (!publicKeyType(s))
732  {
733  continue;
734  }
735  negUnl.emplace(s);
736  }
737  }
738  }
739 
740  return negUnl;
741 }
742 
745 {
746  if (auto sle = read(keylet::negativeUNL());
747  sle && sle->isFieldPresent(sfValidatorToDisable))
748  {
749  auto d = sle->getFieldVL(sfValidatorToDisable);
750  auto s = makeSlice(d);
751  if (publicKeyType(s))
752  return PublicKey(s);
753  }
754 
755  return std::nullopt;
756 }
757 
760 {
761  if (auto sle = read(keylet::negativeUNL());
762  sle && sle->isFieldPresent(sfValidatorToReEnable))
763  {
764  auto d = sle->getFieldVL(sfValidatorToReEnable);
765  auto s = makeSlice(d);
766  if (publicKeyType(s))
767  return PublicKey(s);
768  }
769 
770  return std::nullopt;
771 }
772 
773 void
775 {
776  auto sle = peek(keylet::negativeUNL());
777  if (!sle)
778  return;
779 
780  bool const hasToDisable = sle->isFieldPresent(sfValidatorToDisable);
781  bool const hasToReEnable = sle->isFieldPresent(sfValidatorToReEnable);
782 
783  if (!hasToDisable && !hasToReEnable)
784  return;
785 
786  STArray newNUnl;
787  if (sle->isFieldPresent(sfDisabledValidators))
788  {
789  auto const& oldNUnl = sle->getFieldArray(sfDisabledValidators);
790  for (auto v : oldNUnl)
791  {
792  if (hasToReEnable && v.isFieldPresent(sfPublicKey) &&
793  v.getFieldVL(sfPublicKey) ==
794  sle->getFieldVL(sfValidatorToReEnable))
795  continue;
796  newNUnl.push_back(v);
797  }
798  }
799 
800  if (hasToDisable)
801  {
803  newNUnl.back().setFieldVL(
804  sfPublicKey, sle->getFieldVL(sfValidatorToDisable));
806  }
807 
808  if (!newNUnl.empty())
809  {
810  sle->setFieldArray(sfDisabledValidators, newNUnl);
811  if (hasToReEnable)
812  sle->makeFieldAbsent(sfValidatorToReEnable);
813  if (hasToDisable)
814  sle->makeFieldAbsent(sfValidatorToDisable);
815  rawReplace(sle);
816  }
817  else
818  {
819  rawErase(sle);
820  }
821 }
822 
823 //------------------------------------------------------------------------------
824 bool
825 Ledger::walkLedger(beast::Journal j, bool parallel) const
826 {
827  std::vector<SHAMapMissingNode> missingNodes1;
828  std::vector<SHAMapMissingNode> missingNodes2;
829 
830  if (stateMap_->getHash().isZero() && !info_.accountHash.isZero() &&
831  !stateMap_->fetchRoot(SHAMapHash{info_.accountHash}, nullptr))
832  {
833  missingNodes1.emplace_back(
835  }
836  else
837  {
838  if (parallel)
839  return stateMap_->walkMapParallel(missingNodes1, 32);
840  else
841  stateMap_->walkMap(missingNodes1, 32);
842  }
843 
844  if (!missingNodes1.empty())
845  {
846  if (auto stream = j.info())
847  {
848  stream << missingNodes1.size() << " missing account node(s)";
849  stream << "First: " << missingNodes1[0].what();
850  }
851  }
852 
853  if (txMap_->getHash().isZero() && info_.txHash.isNonZero() &&
854  !txMap_->fetchRoot(SHAMapHash{info_.txHash}, nullptr))
855  {
856  missingNodes2.emplace_back(
858  }
859  else
860  {
861  txMap_->walkMap(missingNodes2, 32);
862  }
863 
864  if (!missingNodes2.empty())
865  {
866  if (auto stream = j.info())
867  {
868  stream << missingNodes2.size() << " missing transaction node(s)";
869  stream << "First: " << missingNodes2[0].what();
870  }
871  }
872  return missingNodes1.empty() && missingNodes2.empty();
873 }
874 
875 bool
877 {
879  txMap_ && (info_.accountHash == stateMap_->getHash().as_uint256()) &&
880  (info_.txHash == txMap_->getHash().as_uint256()))
881  {
882  return true;
883  }
884 
885  Json::Value j = getJson({*this, {}});
886 
887  j[jss::accountTreeHash] = to_string(info_.accountHash);
888  j[jss::transTreeHash] = to_string(info_.txHash);
889 
890  JLOG(ledgerJ.fatal()) << "ledger is not sensible" << j;
891 
892  assert(false);
893 
894  return false;
895 }
896 
897 // update the skip list with the information from our previous ledger
898 // VFALCO TODO Document this skip list concept
899 void
901 {
902  if (info_.seq == 0) // genesis ledger has no previous ledger
903  return;
904 
905  std::uint32_t prevIndex = info_.seq - 1;
906 
907  // update record of every 256th ledger
908  if ((prevIndex & 0xff) == 0)
909  {
910  auto const k = keylet::skip(prevIndex);
911  auto sle = peek(k);
912  std::vector<uint256> hashes;
913 
914  bool created;
915  if (!sle)
916  {
917  sle = std::make_shared<SLE>(k);
918  created = true;
919  }
920  else
921  {
922  hashes = static_cast<decltype(hashes)>(sle->getFieldV256(sfHashes));
923  created = false;
924  }
925 
926  assert(hashes.size() <= 256);
927  hashes.push_back(info_.parentHash);
928  sle->setFieldV256(sfHashes, STVector256(hashes));
929  sle->setFieldU32(sfLastLedgerSequence, prevIndex);
930  if (created)
931  rawInsert(sle);
932  else
933  rawReplace(sle);
934  }
935 
936  // update record of past 256 ledger
937  auto const k = keylet::skip();
938  auto sle = peek(k);
939  std::vector<uint256> hashes;
940  bool created;
941  if (!sle)
942  {
943  sle = std::make_shared<SLE>(k);
944  created = true;
945  }
946  else
947  {
948  hashes = static_cast<decltype(hashes)>(sle->getFieldV256(sfHashes));
949  created = false;
950  }
951  assert(hashes.size() <= 256);
952  if (hashes.size() == 256)
953  hashes.erase(hashes.begin());
954  hashes.push_back(info_.parentHash);
955  sle->setFieldV256(sfHashes, STVector256(hashes));
956  sle->setFieldU32(sfLastLedgerSequence, prevIndex);
957  if (created)
958  rawInsert(sle);
959  else
960  rawReplace(sle);
961 }
962 
963 bool
965 {
966  return info_.seq % FLAG_LEDGER_INTERVAL == 0;
967 }
968 bool
970 {
971  return (info_.seq + 1) % FLAG_LEDGER_INTERVAL == 0;
972 }
973 
974 bool
976 {
977  return seq % FLAG_LEDGER_INTERVAL == 0;
978 }
979 
980 static bool
982  Application& app,
983  std::shared_ptr<Ledger const> const& ledger,
984  bool current)
985 {
986  auto j = app.journal("Ledger");
987  auto seq = ledger->info().seq;
988  if (!app.pendingSaves().startWork(seq))
989  {
990  // The save was completed synchronously
991  JLOG(j.debug()) << "Save aborted";
992  return true;
993  }
994 
995  auto const db = dynamic_cast<SQLiteDatabase*>(&app.getRelationalDatabase());
996  if (!db)
997  Throw<std::runtime_error>("Failed to get relational database");
998 
999  auto const res = db->saveValidatedLedger(ledger, current);
1000 
1001  // Clients can now trust the database for
1002  // information about this ledger sequence.
1003  app.pendingSaves().finishWork(seq);
1004  return res;
1005 }
1006 
1010 bool
1012  Application& app,
1013  std::shared_ptr<Ledger const> const& ledger,
1014  bool isSynchronous,
1015  bool isCurrent)
1016 {
1017  if (!app.getHashRouter().setFlags(ledger->info().hash, SF_SAVED))
1018  {
1019  // We have tried to save this ledger recently
1020  auto stream = app.journal("Ledger").debug();
1021  JLOG(stream) << "Double pend save for " << ledger->info().seq;
1022 
1023  if (!isSynchronous || !app.pendingSaves().pending(ledger->info().seq))
1024  {
1025  // Either we don't need it to be finished
1026  // or it is finished
1027  return true;
1028  }
1029  }
1030 
1031  assert(ledger->isImmutable());
1032 
1033  if (!app.pendingSaves().shouldWork(ledger->info().seq, isSynchronous))
1034  {
1035  auto stream = app.journal("Ledger").debug();
1036  JLOG(stream) << "Pend save with seq in pending saves "
1037  << ledger->info().seq;
1038 
1039  return true;
1040  }
1041 
1042  JobType const jobType{isCurrent ? jtPUBLEDGER : jtPUBOLDLEDGER};
1043  char const* const jobName{
1044  isCurrent ? "Ledger::pendSave" : "Ledger::pendOldSave"};
1045 
1046  // See if we can use the JobQueue.
1047  if (!isSynchronous &&
1048  app.getJobQueue().addJob(jobType, jobName, [&app, ledger, isCurrent]() {
1049  saveValidatedLedger(app, ledger, isCurrent);
1050  }))
1051  {
1052  return true;
1053  }
1054 
1055  // The JobQueue won't do the Job. Do the save synchronously.
1056  return saveValidatedLedger(app, ledger, isCurrent);
1057 }
1058 
1059 void
1061 {
1062  stateMap_->unshare();
1063  txMap_->unshare();
1064 }
1065 
1066 void
1068 {
1069  stateMap_->invariants();
1070  txMap_->invariants();
1071 }
1072 //------------------------------------------------------------------------------
1073 
1074 /*
1075  * Make ledger using info loaded from database.
1076  *
1077  * @param LedgerInfo: Ledger information.
1078  * @param app: Link to the Application.
1079  * @param acquire: Acquire the ledger if not found locally.
1080  * @return Shared pointer to the ledger.
1081  */
1083 loadLedgerHelper(LedgerInfo const& info, Application& app, bool acquire)
1084 {
1085  bool loaded;
1086  auto ledger = std::make_shared<Ledger>(
1087  info,
1088  loaded,
1089  acquire,
1090  app.config(),
1091  app.getNodeFamily(),
1092  app.journal("Ledger"));
1093 
1094  if (!loaded)
1095  ledger.reset();
1096 
1097  return ledger;
1098 }
1099 
1100 static void
1102  std::shared_ptr<Ledger> const& ledger,
1103  Config const& config,
1104  beast::Journal j)
1105 {
1106  if (!ledger)
1107  return;
1108 
1109  assert(
1110  ledger->info().seq < XRP_LEDGER_EARLIEST_FEES ||
1111  ledger->read(keylet::fees()));
1112  ledger->setImmutable();
1113 
1114  JLOG(j.trace()) << "Loaded ledger: " << to_string(ledger->info().hash);
1115 
1116  ledger->setFull();
1117 }
1118 
1121 {
1122  const std::optional<LedgerInfo> info =
1124  if (!info)
1125  return {std::shared_ptr<Ledger>(), {}, {}};
1126  return {loadLedgerHelper(*info, app, true), info->seq, info->hash};
1127 }
1128 
1130 loadByIndex(std::uint32_t ledgerIndex, Application& app, bool acquire)
1131 {
1132  if (std::optional<LedgerInfo> info =
1133  app.getRelationalDatabase().getLedgerInfoByIndex(ledgerIndex))
1134  {
1135  std::shared_ptr<Ledger> ledger = loadLedgerHelper(*info, app, acquire);
1136  finishLoadByIndexOrHash(ledger, app.config(), app.journal("Ledger"));
1137  return ledger;
1138  }
1139  return {};
1140 }
1141 
1143 loadByHash(uint256 const& ledgerHash, Application& app, bool acquire)
1144 {
1145  if (std::optional<LedgerInfo> info =
1146  app.getRelationalDatabase().getLedgerInfoByHash(ledgerHash))
1147  {
1148  std::shared_ptr<Ledger> ledger = loadLedgerHelper(*info, app, acquire);
1149  finishLoadByIndexOrHash(ledger, app.config(), app.journal("Ledger"));
1150  assert(!ledger || ledger->info().hash == ledgerHash);
1151  return ledger;
1152  }
1153  return {};
1154 }
1155 
1156 std::vector<
1159 {
1160  if (!app.config().reporting())
1161  {
1162  assert(false);
1163  Throw<std::runtime_error>(
1164  "flatFetchTransactions: not running in reporting mode");
1165  }
1166 
1167  std::vector<
1169  txns;
1170  auto start = std::chrono::system_clock::now();
1171  auto nodeDb =
1172  dynamic_cast<NodeStore::DatabaseNodeImp*>(&(app.getNodeStore()));
1173  if (!nodeDb)
1174  {
1175  assert(false);
1176  Throw<std::runtime_error>(
1177  "Called flatFetchTransactions but database is not DatabaseNodeImp");
1178  }
1179  auto objs = nodeDb->fetchBatch(nodestoreHashes);
1180 
1181  auto end = std::chrono::system_clock::now();
1182  JLOG(app.journal("Ledger").debug())
1183  << " Flat fetch time : " << ((end - start).count() / 1000000000.0)
1184  << " number of transactions " << nodestoreHashes.size();
1185  assert(objs.size() == nodestoreHashes.size());
1186  for (size_t i = 0; i < objs.size(); ++i)
1187  {
1188  uint256& nodestoreHash = nodestoreHashes[i];
1189  auto& obj = objs[i];
1190  if (obj)
1191  {
1192  auto node = SHAMapTreeNode::makeFromPrefix(
1193  makeSlice(obj->getData()), SHAMapHash{nodestoreHash});
1194  if (!node)
1195  {
1196  assert(false);
1197  Throw<std::runtime_error>(
1198  "flatFetchTransactions : Error making SHAMap node");
1199  }
1200  auto item = (static_cast<SHAMapLeafNode*>(node.get()))->peekItem();
1201  if (!item)
1202  {
1203  assert(false);
1204  Throw<std::runtime_error>(
1205  "flatFetchTransactions : Error reading SHAMap node");
1206  }
1207  auto txnPlusMeta = deserializeTxPlusMeta(*item);
1208  if (!txnPlusMeta.first || !txnPlusMeta.second)
1209  {
1210  assert(false);
1211  Throw<std::runtime_error>(
1212  "flatFetchTransactions : Error deserializing SHAMap node");
1213  }
1214  txns.push_back(std::move(txnPlusMeta));
1215  }
1216  else
1217  {
1218  assert(false);
1219  Throw<std::runtime_error>(
1220  "flatFetchTransactions : Containing SHAMap node not found");
1221  }
1222  }
1223  return txns;
1224 }
1225 std::vector<
1228 {
1229  if (!app.config().reporting())
1230  {
1231  assert(false);
1232  return {};
1233  }
1234 
1235  auto const db =
1236  dynamic_cast<PostgresDatabase*>(&app.getRelationalDatabase());
1237  if (!db)
1238  Throw<std::runtime_error>("Failed to get relational database");
1239 
1240  auto nodestoreHashes = db->getTxHashes(ledger.info().seq);
1241 
1242  return flatFetchTransactions(app, nodestoreHashes);
1243 }
1244 } // namespace ripple
ripple::SQLiteDatabase
Definition: SQLiteDatabase.h:27
ripple::STArray::empty
bool empty() const
Definition: STArray.h:254
beast::Journal::fatal
Stream fatal() const
Definition: Journal.h:339
ripple::ReadView::info
virtual LedgerInfo const & info() const =0
Returns information about the ledger.
ripple::Ledger::slesUpperBound
std::unique_ptr< sles_type::iter_base > slesUpperBound(uint256 const &key) const override
Definition: Ledger.cpp:490
ripple::FeeSetup::reference_fee
XRPAmount reference_fee
The cost of a reference transaction in drops.
Definition: Config.h:72
ripple::Application
Definition: Application.h:115
ripple::Ledger::sles_iter_impl::sles_iter_impl
sles_iter_impl(SHAMap::const_iterator iter)
Definition: Ledger.cpp:95
ripple::Ledger::slesBegin
std::unique_ptr< sles_type::iter_base > slesBegin() const override
Definition: Ledger.cpp:478
ripple::Application::getNodeFamily
virtual Family & getNodeFamily()=0
ripple::Ledger::addSLE
bool addSLE(SLE const &sle)
Definition: Ledger.cpp:399
ripple::STLedgerEntry::key
uint256 const & key() const
Returns the 'key' (or 'index') of this item.
Definition: STLedgerEntry.h:113
ripple::isFlagLedger
bool isFlagLedger(LedgerIndex seq)
Returns true if the given ledgerIndex is a flag ledgerIndex.
Definition: Ledger.cpp:975
ripple::Ledger::rawReplace
void rawReplace(std::shared_ptr< SLE > const &sle) override
Unconditionally replace a state item.
Definition: Ledger.cpp:568
ripple::HashPrefix::ledgerMaster
@ ledgerMaster
ledger master data for signing
ripple::Ledger::txMap_
std::shared_ptr< SHAMap > txMap_
Definition: Ledger.h:404
ripple::sfBaseFeeDrops
const SF_AMOUNT sfBaseFeeDrops
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:241
ripple::sfReserveBase
const SF_UINT32 sfReserveBase
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::featureXRPFees
const uint256 featureXRPFees
ripple::Ledger::mImmutable
bool mImmutable
Definition: Ledger.h:402
ripple::Ledger::sles_iter_impl
Definition: Ledger.cpp:83
ripple::STLedgerEntry
Definition: STLedgerEntry.h:30
ripple::sfMetadata
const SField sfMetadata
ripple::Ledger::isVotingLedger
bool isVotingLedger() const
Returns true if the ledger directly precedes a flag ledger.
Definition: Ledger.cpp:969
ripple::Ledger::succ
std::optional< uint256 > succ(uint256 const &key, std::optional< uint256 > const &last=std::nullopt) const override
Definition: Ledger.cpp:448
ripple::Ledger::txRead
tx_type txRead(key_type const &key) const override
Read a transaction from the tx map.
Definition: Ledger.cpp:515
ripple::Rules::enabled
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition: Rules.cpp:94
std::shared_ptr
STL class.
ripple::LedgerInfo::parentHash
uint256 parentHash
Definition: ReadView.h:94
ripple::keylet::amendments
Keylet const & amendments() noexcept
The index of the amendment table.
Definition: Indexes.cpp:163
ripple::loadByIndex
std::shared_ptr< Ledger > loadByIndex(std::uint32_t ledgerIndex, Application &app, bool acquire)
Definition: Ledger.cpp:1130
ripple::HashPrefix::txNode
@ txNode
transaction plus metadata
utility
ripple::Ledger::fees_
Fees fees_
Definition: Ledger.h:410
std::exception
STL class.
ripple::base_uint::isNonZero
bool isNonZero() const
Definition: base_uint.h:537
beast::Journal::trace
Stream trace() const
Severity stream access functions.
Definition: Journal.h:309
ripple::Ledger::unshare
void unshare() const
Definition: Ledger.cpp:1060
ripple::Ledger::slesEnd
std::unique_ptr< sles_type::iter_base > slesEnd() const override
Definition: Ledger.cpp:484
ripple::ReadView::txs_type
Definition: ReadView.h:146
ripple::sfFirstLedgerSequence
const SF_UINT32 sfFirstLedgerSequence
ripple::SHAMapNodeType::tnACCOUNT_STATE
@ tnACCOUNT_STATE
std::unordered_set
STL class.
ripple::PendingSaves::pending
bool pending(LedgerIndex seq)
Return true if a ledger is in the progress of being saved.
Definition: PendingSaves.h:84
std::pair
ripple::SHAMapType::TRANSACTION
@ TRANSACTION
ripple::LedgerInfo::hash
uint256 hash
Definition: ReadView.h:91
ripple::XRPAmount::drops
constexpr value_type drops() const
Returns the number of drops.
Definition: XRPAmount.h:172
ripple::sfSequence
const SF_UINT32 sfSequence
ripple::hotACCOUNT_NODE
@ hotACCOUNT_NODE
Definition: NodeObject.h:35
ripple::Ledger::walkLedger
bool walkLedger(beast::Journal j, bool parallel=false) const
Definition: Ledger.cpp:825
vector
std::find
T find(T... args)
std::vector::size
T size(T... args)
ripple::Ledger::defaultFees
void defaultFees(Config const &config)
Definition: Ledger.cpp:694
ripple::Ledger::sles_iter_impl::dereference
sles_type::value_type dereference() const override
Definition: Ledger.cpp:120
std::chrono::duration
ripple::NodeStore::DatabaseNodeImp
Definition: DatabaseNodeImp.h:30
ripple::keylet::skip
Keylet const & skip() noexcept
The index of the "short" skip list.
Definition: Indexes.cpp:145
ripple::getLatestLedger
std::tuple< std::shared_ptr< Ledger >, std::uint32_t, uint256 > getLatestLedger(Application &app)
Definition: Ledger.cpp:1120
ripple::FLAG_LEDGER_INTERVAL
constexpr std::uint32_t FLAG_LEDGER_INTERVAL
Definition: Ledger.h:418
ripple::STObject::getSerializer
Serializer getSerializer() const
Definition: STObject.h:898
std::unordered_set::emplace
T emplace(T... args)
ripple::Ledger::exists
bool exists(Keylet const &k) const override
Determine if a state item exists.
Definition: Ledger.cpp:435
beast::Journal::warn
Stream warn() const
Definition: Journal.h:327
ripple::Ledger::txs_iter_impl::equal
bool equal(base_type const &impl) const override
Definition: Ledger.cpp:155
ripple::STArray::push_back
void push_back(STObject const &object)
Definition: STArray.h:212
ripple::Ledger::peek
std::shared_ptr< SLE > peek(Keylet const &k) const
Definition: Ledger.cpp:706
ripple::Ledger::invariants
void invariants() const
Definition: Ledger.cpp:1067
ripple::roundCloseTime
std::chrono::time_point< Clock, Duration > roundCloseTime(std::chrono::time_point< Clock, Duration > closeTime, std::chrono::duration< Rep, Period > closeResolution)
Calculates the close time for a ledger, given a close time resolution.
Definition: LedgerTiming.h:129
std::tuple
ripple::Ledger::txs_iter_impl::operator=
txs_iter_impl & operator=(txs_iter_impl const &)=delete
ripple::JobQueue::addJob
bool addJob(JobType type, std::string const &name, JobHandler &&jobHandler)
Adds a job to the JobQueue.
Definition: JobQueue.h:166
ripple::LedgerInfo::seq
LedgerIndex seq
Definition: ReadView.h:83
ripple::Ledger::rawTxInsert
void rawTxInsert(uint256 const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData) override
Definition: Ledger.cpp:579
ripple::STObject::setFieldVL
void setFieldVL(SField const &field, Blob const &)
Definition: STObject.cpp:695
ripple::PendingSaves::startWork
bool startWork(LedgerIndex seq)
Start working on a ledger.
Definition: PendingSaves.h:51
ripple::Ledger::txs_iter_impl::txs_iter_impl
txs_iter_impl(bool metadata, SHAMap::const_iterator iter)
Definition: Ledger.cpp:143
ripple::Fees::reserve
XRPAmount reserve
Definition: ReadView.h:52
ripple::RelationalDatabase::getNewestLedgerInfo
virtual std::optional< LedgerInfo > getNewestLedgerInfo()=0
getNewestLedgerInfo Returns the info of the newest saved ledger.
ripple::Ledger::rawErase
void rawErase(std::shared_ptr< SLE > const &sle) override
Delete an existing state item.
Definition: Ledger.cpp:543
ripple::SHAMapType::STATE
@ STATE
ripple::RelationalDatabase::getLedgerInfoByIndex
virtual std::optional< LedgerInfo > getLedgerInfoByIndex(LedgerIndex ledgerSeq)=0
getLedgerInfoByIndex Returns a ledger by its sequence.
ripple::Ledger::updateNegativeUNL
void updateNegativeUNL()
update the Negative UNL ledger component.
Definition: Ledger.cpp:774
ripple::SHAMapLeafNode
Definition: SHAMapLeafNode.h:32
ripple::LedgerInfo::txHash
uint256 txHash
Definition: ReadView.h:92
ripple::Ledger::info_
LedgerInfo info_
Definition: Ledger.h:412
ripple::finishLoadByIndexOrHash
static void finishLoadByIndexOrHash(std::shared_ptr< Ledger > const &ledger, Config const &config, beast::Journal j)
Definition: Ledger.cpp:1101
ripple::XRP_LEDGER_EARLIEST_FEES
static constexpr std::uint32_t XRP_LEDGER_EARLIEST_FEES
The XRP Ledger mainnet's earliest ledger with a FeeSettings object.
Definition: SystemParameters.h:73
ripple::deserializeTx
std::shared_ptr< STTx const > deserializeTx(SHAMapItem const &item)
Deserialize a SHAMapItem containing a single STTx.
Definition: Ledger.cpp:409
ripple::SHAMapHash
Definition: SHAMapHash.h:32
ripple::generateKeyPair
std::pair< PublicKey, SecretKey > generateKeyPair(KeyType type, Seed const &seed)
Generate a key pair deterministically.
Definition: SecretKey.cpp:351
ripple::INITIAL_XRP
constexpr XRPAmount INITIAL_XRP
Configure the native currency.
Definition: SystemParameters.h:43
ripple::SHAMapMissingNode
Definition: SHAMapMissingNode.h:55
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:550
ripple::detail::ReadViewFwdRange< std::shared_ptr< SLE const > >::value_type
std::shared_ptr< SLE const > value_type
Definition: ReadViewFwdRange.h:137
ripple::Ledger::validatorToDisable
std::optional< PublicKey > validatorToDisable() const
get the to be disabled validator's master public key if any
Definition: Ledger.cpp:744
ripple::Ledger::txsEnd
std::unique_ptr< txs_type::iter_base > txsEnd() const override
Definition: Ledger.cpp:503
ripple::Fees::increment
XRPAmount increment
Definition: ReadView.h:53
std::vector::push_back
T push_back(T... args)
ripple::digest
static Hasher::result_type digest(void const *data, std::size_t size) noexcept
Definition: tokens.cpp:47
ripple::LedgerInfo::closeTime
NetClock::time_point closeTime
Definition: ReadView.h:114
ripple::publicKeyType
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:207
ripple::Keylet::key
uint256 key
Definition: Keylet.h:40
ripple::base_uint< 256 >
ripple::jtPUBOLDLEDGER
@ jtPUBOLDLEDGER
Definition: Job.h:44
ripple::Ledger::info
LedgerInfo const & info() const override
Returns information about the ledger.
Definition: Ledger.h:148
std::chrono::time_point::time_since_epoch
T time_since_epoch(T... args)
ripple::Config::reporting
bool reporting() const
Definition: Config.h:336
ripple::Ledger::txExists
bool txExists(uint256 const &key) const override
Definition: Ledger.cpp:509
ripple::saveValidatedLedger
static bool saveValidatedLedger(Application &app, std::shared_ptr< Ledger const > const &ledger, bool current)
Definition: Ledger.cpp:981
ripple::loadByHash
std::shared_ptr< Ledger > loadByHash(uint256 const &ledgerHash, Application &app, bool acquire)
Definition: Ledger.cpp:1143
ripple::base_uint::isZero
bool isZero() const
Definition: base_uint.h:532
ripple::Ledger
Holds a ledger.
Definition: Ledger.h:76
ripple::Ledger::setFull
void setFull() const
Definition: Ledger.h:291
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::keylet::account
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition: Indexes.cpp:133
ripple::SHAMapItem
Definition: SHAMapItem.h:31
ripple::Config
Definition: Config.h:89
ripple::Application::pendingSaves
virtual PendingSaves & pendingSaves()=0
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:416
ripple::calculateLedgerHash
uint256 calculateLedgerHash(LedgerInfo const &info)
Definition: Ledger.cpp:65
ripple::Ledger::txs_iter_impl::copy
std::unique_ptr< base_type > copy() const override
Definition: Ledger.cpp:149
ripple::Rethrow
void Rethrow()
Rethrow the exception currently being handled.
Definition: contract.h:48
ripple::sfReserveIncrement
const SF_UINT32 sfReserveIncrement
ripple::Application::config
virtual Config & config()=0
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:148
ripple::Ledger::txs_iter_impl::iter_
SHAMap::const_iterator iter_
Definition: Ledger.cpp:134
ripple::SHAMap::const_iterator
Definition: SHAMap.h:630
ripple::Ledger::setAccepted
void setAccepted(NetClock::time_point closeTime, NetClock::duration closeResolution, bool correctCloseTime)
Definition: Ledger.cpp:384
ripple::calcAccountID
AccountID calcAccountID(PublicKey const &pk)
Definition: AccountID.cpp:158
ripple::SHAMap
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
Definition: SHAMap.h:95
ripple::STArray
Definition: STArray.h:28
ripple::Application::getRelationalDatabase
virtual RelationalDatabase & getRelationalDatabase()=0
ripple::Ledger::sles_iter_impl::iter_
SHAMap::const_iterator iter_
Definition: Ledger.cpp:86
ripple::create_genesis_t
Definition: Ledger.h:44
ripple::SHAMapNodeType::tnTRANSACTION_MD
@ tnTRANSACTION_MD
ripple::Ledger::isFlagLedger
bool isFlagLedger() const
Returns true if the ledger is a flag ledger.
Definition: Ledger.cpp:964
ripple::Ledger::sles_iter_impl::equal
bool equal(base_type const &impl) const override
Definition: Ledger.cpp:106
ripple::LedgerInfo::closeFlags
int closeFlags
Definition: ReadView.h:105
ripple::Ledger::sles_iter_impl::operator=
sles_iter_impl & operator=(sles_iter_impl const &)=delete
ripple::Application::getJobQueue
virtual JobQueue & getJobQueue()=0
ripple::sfValidatorToDisable
const SF_VL sfValidatorToDisable
ripple::RelationalDatabase::getLedgerInfoByHash
virtual std::optional< LedgerInfo > getLedgerInfoByHash(uint256 const &ledgerHash)=0
getLedgerInfoByHash Returns the info of the ledger with given hash.
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
ripple::Ledger::rawInsert
void rawInsert(std::shared_ptr< SLE > const &sle) override
Unconditionally insert a state item.
Definition: Ledger.cpp:557
beast::Journal::info
Stream info() const
Definition: Journal.h:321
std::chrono::time_point
std::vector::erase
T erase(T... args)
ripple::Ledger::assertSensible
bool assertSensible(beast::Journal ledgerJ) const
Definition: Ledger.cpp:876
ripple::Family
Definition: Family.h:32
ripple::ValStatus::current
@ current
This was a new validation and was added.
ripple::SerialIter
Definition: Serializer.h:310
ripple::PendingSaves::finishWork
void finishWork(LedgerIndex seq)
Finish working on a ledger.
Definition: PendingSaves.h:74
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::FeeSetup::account_reserve
XRPAmount account_reserve
The account reserve requirement in drops.
Definition: Config.h:75
ripple::Ledger::setup
bool setup()
Definition: Ledger.cpp:617
std::uint32_t
ripple::Ledger::sles_iter_impl::sles_iter_impl
sles_iter_impl()=delete
ripple::Ledger::txs_iter_impl::txs_iter_impl
txs_iter_impl()=delete
ripple::Ledger::isImmutable
bool isImmutable() const
Definition: Ledger.h:275
ripple::SHAMapItem::slice
Slice slice() const
Definition: SHAMapItem.h:51
ripple::jtPUBLEDGER
@ jtPUBLEDGER
Definition: Job.h:69
ripple::sfReserveIncrementDrops
const SF_AMOUNT sfReserveIncrementDrops
ripple::Ledger::validatorToReEnable
std::optional< PublicKey > validatorToReEnable() const
get the to be re-enabled validator's master public key if any
Definition: Ledger.cpp:759
ripple::PendingSaves::shouldWork
bool shouldWork(LedgerIndex seq, bool isSynchronous)
Check if a ledger should be dispatched.
Definition: PendingSaves.h:99
ripple::sfReserveBaseDrops
const SF_AMOUNT sfReserveBaseDrops
ripple::Config::FEE_UNITS_DEPRECATED
static constexpr std::uint32_t FEE_UNITS_DEPRECATED
Definition: Config.h:164
ripple::LedgerInfo::drops
XRPAmount drops
Definition: ReadView.h:96
ripple::Ledger::setImmutable
void setImmutable(bool rehash=true)
Definition: Ledger.cpp:364
ripple::KeyType::secp256k1
@ secp256k1
ripple::Serializer
Definition: Serializer.h:39
ripple::getJson
Json::Value getJson(LedgerFill const &fill)
Return a new Json::Value representing the ledger with given options.
Definition: LedgerToJson.cpp:291
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:459
ripple::SHAMapTreeNode::makeFromPrefix
static std::shared_ptr< SHAMapTreeNode > makeFromPrefix(Slice rawNode, SHAMapHash const &hash)
Definition: SHAMapTreeNode.cpp:148
ripple::Ledger::txMap
SHAMap const & txMap() const
Definition: Ledger.h:318
ripple::sfBaseFee
const SF_UINT64 sfBaseFee
ripple::getCloseAgree
bool getCloseAgree(LedgerInfo const &info)
Definition: ReadView.h:351
ripple::sfHashes
const SF_VECTOR256 sfHashes
ripple::generateSeed
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition: Seed.cpp:69
ripple::Ledger::txsBegin
std::unique_ptr< txs_type::iter_base > txsBegin() const override
Definition: Ledger.cpp:497
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:125
std::vector::emplace_back
T emplace_back(T... args)
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::Config::features
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:281
ripple::Application::getNodeStore
virtual NodeStore::Database & getNodeStore()=0
ripple::Application::journal
virtual beast::Journal journal(std::string const &name)=0
ripple::ShardState::acquire
@ acquire
ripple::STArray::emplace_back
void emplace_back(Args &&... args)
Definition: STArray.h:206
ripple::ReadView::seq
LedgerIndex seq() const
Returns the sequence number of the base ledger.
Definition: ReadView.h:193
std::vector::begin
T begin(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::LedgerInfo::closeTimeResolution
NetClock::duration closeTimeResolution
Definition: ReadView.h:108
ripple::sha512Half
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition: digest.h:216
ripple::create_genesis
const create_genesis_t create_genesis
Definition: Ledger.cpp:62
cassert
ripple::Ledger::stateMap_
std::shared_ptr< SHAMap > stateMap_
Definition: Ledger.h:405
ripple::sfDisabledValidator
const SField sfDisabledValidator
ripple::Ledger::updateSkipList
void updateSkipList()
Definition: Ledger.cpp:900
ripple::FeeSetup::owner_reserve
XRPAmount owner_reserve
The per-owned item reserve requirement in drops.
Definition: Config.h:78
ripple::SerialIter::getVLDataLength
int getVLDataLength()
Definition: Serializer.cpp:470
ripple::PostgresDatabase
Definition: PostgresDatabase.h:27
ripple::Ledger::open
bool open() const override
Returns true if this reflects an open ledger.
Definition: Ledger.h:142
ripple::sfBalance
const SF_AMOUNT sfBalance
std::chrono::duration::count
T count(T... args)
ripple::sfReferenceFeeUnits
const SF_UINT32 sfReferenceFeeUnits
ripple::Ledger::txs_iter_impl::metadata_
bool metadata_
Definition: Ledger.cpp:133
ripple::STVector256
Definition: STVector256.h:29
ripple::makeRulesGivenLedger
Rules makeRulesGivenLedger(DigestAwareReadView const &ledger, Rules const &current)
Definition: ReadView.cpp:69
ripple::Serializer::addVL
int addVL(Blob const &vector)
Definition: Serializer.cpp:200
ripple::Ledger::negativeUNL
hash_set< PublicKey > negativeUNL() const
get Negative UNL validators' master public keys
Definition: Ledger.cpp:718
std::vector::empty
T empty(T... args)
ripple::SHAMapType
SHAMapType
Definition: SHAMapMissingNode.h:32
ripple::Ledger::txs_iter_impl
Definition: Ledger.cpp:130
std::optional
ripple::STArray::back
STObject & back()
Definition: STArray.h:193
beast::Journal::debug
Stream debug() const
Definition: Journal.h:315
ripple::JobType
JobType
Definition: Job.h:35
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::keylet::fees
Keylet const & fees() noexcept
The (fixed) index of the object containing the ledger fees.
Definition: Indexes.cpp:171
ripple::ledgerGenesisTimeResolution
constexpr auto ledgerGenesisTimeResolution
Close time resolution in genesis ledger.
Definition: LedgerTiming.h:47
ripple::Keylet::check
bool check(STLedgerEntry const &) const
Returns true if the SLE matches the type.
Definition: Keylet.cpp:26
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::LedgerInfo
Information about the notional ledger backing the view.
Definition: ReadView.h:75
ripple::getNextLedgerTimeResolution
std::chrono::duration< Rep, Period > getNextLedgerTimeResolution(std::chrono::duration< Rep, Period > previousResolution, bool previousAgree, Seq ledgerSeq)
Calculates the close time resolution for the specified ledger.
Definition: LedgerTiming.h:80
ripple::Family::missingNodeAcquireByHash
virtual void missingNodeAcquireByHash(uint256 const &refHash, std::uint32_t refNum)=0
Acquire ledger that has a missing node by ledger hash.
ripple::Ledger::rawTxInsertWithHash
uint256 rawTxInsertWithHash(uint256 const &key, std::shared_ptr< Serializer const > const &txn, std::shared_ptr< Serializer const > const &metaData)
Definition: Ledger.cpp:597
ripple::sfLastLedgerSequence
const SF_UINT32 sfLastLedgerSequence
ripple::ledgerDefaultTimeResolution
constexpr auto ledgerDefaultTimeResolution
Initial resolution of ledger close time.
Definition: LedgerTiming.h:44
ripple::keylet::negativeUNL
Keylet const & negativeUNL() noexcept
The (fixed) index of the object containing the ledger negativeUNL.
Definition: Indexes.cpp:179
ripple::Ledger::txs_iter_impl::dereference
txs_type::value_type dereference() const override
Definition: Ledger.cpp:169
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:1011
ripple::Ledger::Ledger
Ledger(Ledger const &)=delete
std::unique_ptr
STL class.
ripple::Ledger::digest
std::optional< digest_type > digest(key_type const &key) const override
Return the digest associated with the key.
Definition: Ledger.cpp:530
ripple::loadLedgerHelper
std::shared_ptr< Ledger > loadLedgerHelper(LedgerInfo const &info, Application &app, bool acquire)
Definition: Ledger.cpp:1083
ripple::Config::FEES
FeeSetup FEES
Definition: Config.h:208
ripple::Ledger::txs_iter_impl::increment
void increment() override
Definition: Ledger.cpp:163
ripple::STObject::setFieldU32
void setFieldU32(SField const &field, std::uint32_t)
Definition: STObject.cpp:659
ripple::Ledger::sles_iter_impl::copy
std::unique_ptr< base_type > copy() const override
Definition: Ledger.cpp:100
ripple::sfDisabledValidators
const SField sfDisabledValidators
ripple::sfPublicKey
const SF_VL sfPublicKey
ripple::Application::getHashRouter
virtual HashRouter & getHashRouter()=0
ripple::Ledger::sles_iter_impl::increment
void increment() override
Definition: Ledger.cpp:114
ripple::HashRouter::setFlags
bool setFlags(uint256 const &key, int flags)
Set the flags on a hash.
Definition: HashRouter.cpp:102
ripple::LedgerInfo::accountHash
uint256 accountHash
Definition: ReadView.h:93
ripple::Ledger::rules_
Rules rules_
Definition: Ledger.h:411
ripple::Fees::base
XRPAmount base
Definition: ReadView.h:51
ripple::SerialIter::getSlice
Slice getSlice(std::size_t bytes)
Definition: Serializer.cpp:495
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::sfAmendments
const SF_VECTOR256 sfAmendments
ripple::sLCF_NoConsensusTime
static const std::uint32_t sLCF_NoConsensusTime
Definition: ReadView.h:348
ripple::open
void open(soci::session &s, BasicConfig const &config, std::string const &dbName)
Open a soci session.
Definition: SociDB.cpp:98
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::sfValidatorToReEnable
const SF_VL sfValidatorToReEnable
ripple::LedgerInfo::parentCloseTime
NetClock::time_point parentCloseTime
Definition: ReadView.h:84
ripple::flatFetchTransactions
std::vector< std::pair< std::shared_ptr< STTx const >, std::shared_ptr< STObject const > > > flatFetchTransactions(Application &app, std::vector< uint256 > &nodestoreHashes)
Definition: Ledger.cpp:1158
std::chrono::system_clock::now
T now(T... args)