20#include <xrpld/app/consensus/RCLValidations.h> 
   21#include <xrpld/app/ledger/Ledger.h> 
   22#include <xrpld/app/ledger/LedgerMaster.h> 
   23#include <xrpld/app/ledger/LedgerReplayer.h> 
   24#include <xrpld/app/ledger/OpenLedger.h> 
   25#include <xrpld/app/ledger/OrderBookDB.h> 
   26#include <xrpld/app/ledger/PendingSaves.h> 
   27#include <xrpld/app/main/Application.h> 
   28#include <xrpld/app/misc/AmendmentTable.h> 
   29#include <xrpld/app/misc/LoadFeeTrack.h> 
   30#include <xrpld/app/misc/NetworkOPs.h> 
   31#include <xrpld/app/misc/SHAMapStore.h> 
   32#include <xrpld/app/misc/Transaction.h> 
   33#include <xrpld/app/misc/TxQ.h> 
   34#include <xrpld/app/misc/ValidatorList.h> 
   35#include <xrpld/app/paths/PathRequests.h> 
   36#include <xrpld/app/rdb/RelationalDatabase.h> 
   37#include <xrpld/core/TimeKeeper.h> 
   38#include <xrpld/overlay/Overlay.h> 
   39#include <xrpld/overlay/Peer.h> 
   41#include <xrpl/basics/Log.h> 
   42#include <xrpl/basics/MathUtilities.h> 
   43#include <xrpl/basics/UptimeClock.h> 
   44#include <xrpl/basics/contract.h> 
   45#include <xrpl/basics/safe_cast.h> 
   46#include <xrpl/basics/scope.h> 
   47#include <xrpl/beast/utility/instrumentation.h> 
   48#include <xrpl/protocol/BuildInfo.h> 
   49#include <xrpl/protocol/HashPrefix.h> 
   50#include <xrpl/protocol/digest.h> 
   51#include <xrpl/resource/Fees.h> 
   80    bool const ret = [&]() {
 
   82        if (candidateLedger >= currentLedger)
 
   86        if (currentLedger - candidateLedger <= ledgerHistory)
 
   91        return minimumOnline.
has_value() && candidateLedger >= *minimumOnline;
 
   94    JLOG(j.
trace()) << 
"Missing ledger " << candidateLedger
 
   95                    << (ret ? 
" should" : 
" should NOT") << 
" be acquired";
 
 
  106    , mLedgerHistory(collector, app)
 
  107    , standalone_(app_.config().standalone())
 
  109          app_.getSHAMapStore().clampFetchDepth(app_.config().FETCH_DEPTH))
 
  110    , ledger_history_(app_.config().LEDGER_HISTORY)
 
  115          std::chrono::seconds{45},
 
  117          app_.journal(
"TaggedCache"))
 
 
  142    if (validLedger && !
areCompatible(*validLedger, view, s, reason))
 
 
  168    using namespace std::chrono_literals;
 
  178    ret = (ret > 0s) ? ret : 0s;
 
 
  192    using namespace std::chrono_literals;
 
  203    ret = (ret > 0s) ? ret : 0s;
 
 
  217    using namespace std::chrono_literals;
 
  221        reason = 
"No recently-published ledger";
 
  226    if (!validClose || !pubClose)
 
  228        reason = 
"No published ledger";
 
  231    if (validClose > (pubClose + 90))
 
  233        reason = 
"Published ledger lags validated ledger";
 
 
  249                l->info().hash, l->info().seq));
 
  250        times.
reserve(validations.size());
 
  251        for (
auto const& val : validations)
 
  254        if (!validations.empty())
 
  255            consensusHash = validations.front()->getConsensusHash();
 
  264        auto const t0 = times[(times.
size() - 1) / 2];
 
  265        auto const t1 = times[times.
size() / 2];
 
  266        signTime = t0 + (t1 - t0) / 2;
 
  270        signTime = l->info().closeTime;
 
  279        "ripple::LedgerMaster::setValidLedger : valid ledger sequence");
 
  292                                       "activated: server blocked.";
 
  306            if (
auto const first =
 
  310                                           "reached majority. Upgrade before " 
  312                                        << 
" to prevent your server from " 
  313                                           "becoming amendment blocked.";
 
 
  344    XRPL_ASSERT(ledger, 
"ripple::LedgerMaster::canBeCurrent : non-null input");
 
  350    if (validLedger && (ledger->info().seq < validLedger->info().seq))
 
  353            << 
"Candidate for current ledger has low seq " << ledger->info().seq
 
  354            << 
" < " << validLedger->info().seq;
 
  364    auto ledgerClose = ledger->info().parentCloseTime;
 
  366    using namespace std::chrono_literals;
 
  367    if ((validLedger || (ledger->info().seq > 10)) &&
 
  372            << 
"Candidate for current ledger has close time " 
  373            << 
to_string(ledgerClose) << 
" at network time " 
  374            << 
to_string(closeTime) << 
" seq " << ledger->info().seq;
 
  387        if (closeTime > validLedger->info().parentCloseTime)
 
  388            maxSeq += std::chrono::duration_cast<std::chrono::seconds>(
 
  389                          closeTime - validLedger->info().parentCloseTime)
 
  393        if (ledger->info().seq > maxSeq)
 
  396                << 
"Candidate for current ledger has high seq " 
  397                << ledger->info().seq << 
" > " << maxSeq;
 
  402            << 
"Acceptable seq range: " << validLedger->info().seq
 
  403            << 
" <= " << ledger->info().seq << 
" <= " << maxSeq;
 
 
  412    XRPL_ASSERT(lastClosed, 
"ripple::LedgerMaster::switchLCL : non-null input");
 
  413    if (!lastClosed->isImmutable())
 
  416    if (lastClosed->open())
 
  417        LogicError(
"The new last closed ledger is open!");
 
 
  444    bool validated = ledger->info().validated;
 
 
  507    auto const seq = ledger.
info().
seq;
 
  515        if (!hash || ledger.
info().
hash != *hash)
 
  522                    "ripple::LedgerMaster::isValidated : nonzero hash");
 
 
  567        minVal = 1 + *maybeMin;
 
 
  584    if (!pendingSaves.empty() && ((minVal != 0) || (maxVal != 0)))
 
  589        while (pendingSaves.count(maxVal) > 0)
 
  591        while (pendingSaves.count(minVal) > 0)
 
  595        for (
auto v : pendingSaves)
 
  597            if ((v.first >= minVal) && (v.first <= maxVal))
 
  599                if (v.first > ((minVal + maxVal) / 2))
 
  600                    maxVal = v.first - 1;
 
  602                    minVal = v.first + 1;
 
 
  632    uint256 prevHash = ledger->info().parentHash;
 
  651        auto it(ledgerHashes.
find(seq));
 
  653        if (it == ledgerHashes.
end())
 
  664                (seq < 500) ? 0 : (seq - 499), seq);
 
  665            it = ledgerHashes.
find(seq);
 
  667            if (it == ledgerHashes.
end())
 
  670            if (!nodeStore.fetchNodeObject(
 
  671                    ledgerHashes.
begin()->second.ledgerHash,
 
  672                    ledgerHashes.
begin()->first))
 
  676                                       << 
" mismatches node store";
 
  681        if (it->second.ledgerHash != prevHash)
 
  684        prevHash = it->second.parentHash;
 
 
  706    if (!haveHash || haveHash->isZero())
 
  709            << 
"No hash for fetch pack. Missing Index " << missing;
 
  719        for (
auto const& peer : peerList)
 
  721            if (peer->hasRange(missing, missing + 1))
 
  723                int score = peer->getScore(
true);
 
  724                if (!target || (score > maxScore))
 
  735        protocol::TMGetObjectByHash tmBH;
 
  736        tmBH.set_query(
true);
 
  737        tmBH.set_type(protocol::TMGetObjectByHash::otFETCH_PACK);
 
  738        tmBH.set_ledgerhash(haveHash->begin(), 32);
 
  741        target->send(packet);
 
  742        JLOG(
m_journal.
trace()) << 
"Requested fetch pack for " << missing;
 
 
  765                    << 
"fixMismatch encounters partial ledger. Exception: " 
  776                if (otherLedger && (otherLedger->info().hash == *hash))
 
  782                            << 
"Match at " << lSeq << 
", " << invalidate
 
  783                            << 
" prior ledgers invalidated";
 
  799            << 
"All " << invalidate << 
" prior ledgers invalidated";
 
 
  811                            << 
" accepted :" << ledger->info().hash;
 
  813        ledger->stateMap().getHash().isNonZero(),
 
  814        "ripple::LedgerMaster::setFullLedger : nonzero ledger state hash");
 
  816    ledger->setValidated();
 
  827        if (prevHash.
isNonZero() && prevHash != ledger->info().parentHash)
 
  849        if (ledger->info().seq != 0 && 
haveLedger(ledger->info().seq - 1))
 
  855                (prevLedger->info().hash != ledger->info().parentHash))
 
  858                    << 
"Acquired ledger invalidates previous ledger: " 
  859                    << (prevLedger ? 
"hashMismatch" : 
"missingLedger");
 
 
  888        valCount = validations.size();
 
 
  954            ledger->info().hash, ledger->info().seq));
 
  955    auto const tvc = validations.size();
 
  959            << 
"Only " << tvc << 
" validations for " << ledger->info().hash;
 
  964                           << ledger->info().seq << 
" with >= " << minVal
 
  967    ledger->setValidated();
 
  982        fees.reserve(fees.size() + fees2.size());
 
  992            s << 
"Received fees from validations: (" << fees.size() << 
") ";
 
  993            for (
auto const fee1 : fees)
 
  999        fee = fees[fees.size() / 2];  
 
 1010    if (ledger->seq() % 256 == 0)
 
 1021        bool needPrint = 
false;
 
 1029                ledger->info().parentHash, ledger->info().seq - 1);
 
 1032            for (
auto const& v : vals)
 
 1034                if (v->isFieldPresent(sfServerVersion))
 
 1036                    auto version = v->getFieldU64(sfServerVersion);
 
 1037                    higherVersionCount +=
 
 1047            if (higherVersionCount > 0 && rippledCount > 0)
 
 1053                needPrint = unlSize > 0 &&
 
 1073            auto const upgradeMsg =
 
 1074                "Check for upgrade: " 
 1075                "A majority of trusted validators are " 
 1076                "running a newer version.";
 
 
 1102        JLOG(stream) << 
"Consensus built old ledger: " << ledger->info().seq
 
 1113        JLOG(stream) << 
"Consensus ledger fully validated";
 
 1127        valSeq() : valCount_(0), ledgerSeq_(0)
 
 1138            if (ledgerSeq_ == 0)
 
 1148    for (
auto const& v : validations)
 
 1150        valSeq& vs = count[v->getLedgerHash()];
 
 1151        vs.mergeValidation(v->getFieldU32(sfLedgerSequence));
 
 1156    auto maxLedger = ledger->info().hash;
 
 1160    for (
auto& v : count)
 
 1161        if (v.second.valCount_ > neededValidations)
 
 1164            if (v.second.ledgerSeq_ == 0)
 
 1167                    v.second.ledgerSeq_ = l->info().seq;
 
 1170            if (v.second.ledgerSeq_ > maxSeq)
 
 1172                maxSeq = v.second.ledgerSeq_;
 
 1173                maxLedger = v.first;
 
 1180        JLOG(stream) << 
"Consensus triggered check of ledger";
 
 
 1194    if (l && l->info().seq >= index)
 
 
 1218        JLOG(
m_journal.
trace()) << 
"No valid journal, nothing to publish.";
 
 1244        JLOG(
m_journal.
trace()) << 
"No valid journal, nothing to publish.";
 
 1260                << 
"Trying to fetch/publish valid ledger " << seq;
 
 1274            else if (hash->isZero())
 
 1278                                        << 
" does not have hash for " << seq;
 
 1280                    "ripple::LedgerMaster::findNewLedgersToPublish : ledger " 
 1298            if (ledger && (ledger->info().seq == pubSeq))
 
 1300                ledger->setValidated();
 
 1307            << 
"ready to publish " << ret.
size() << 
" ledgers.";
 
 1312            << 
"Exception while trying to find ledgers to publish: " 
 1325        auto finishLedger = valLedger;
 
 1326        while (startLedger->seq() + 1 < finishLedger->seq())
 
 1329                    finishLedger->info().parentHash);
 
 1332                finishLedger = parent;
 
 1336                auto numberLedgers =
 
 1337                    finishLedger->seq() - startLedger->seq() + 1;
 
 1339                    << 
"Publish LedgerReplays " << numberLedgers
 
 1340                    << 
" ledgers, from seq=" << startLedger->info().seq << 
", " 
 1341                    << startLedger->info().hash
 
 1342                    << 
" to seq=" << finishLedger->info().seq << 
", " 
 1343                    << finishLedger->info().hash;
 
 1346                    finishLedger->info().hash,
 
 
 1371                "ripple::LedgerMaster::tryAdvance : has valid ledger");
 
 
 1399            JLOG(
m_journal.
debug()) << 
"Need network ledger for updating paths";
 
 1434                lastLedger->info().closeTime;
 
 1438                    << 
"Published ledger too old for updating paths";
 
 1451                if (!pathRequests.requestsPending())
 
 1456                        << 
"No path requests found. Nothing to do for updating " 
 1463            pathRequests.updateAll(lastLedger);
 
 1466            if (!pathRequests.requestsPending())
 
 1469                    << 
"No path requests left. No need for further updating " 
 1479            if (lastLedger->open())
 
 1483                    lastLedger->info().parentHash,
 
 1484                    lastLedger->info().seq - 1,
 
 1491                    lastLedger->info().hash,
 
 1492                    lastLedger->info().seq,
 
 
 1538            << 
"newPFWork: Creating job. path find threads: " 
 
 1578        return ledger->rules();
 
 
 1613    if (nodeObject && (nodeObject->getData().size() >= 120))
 
 1616            nodeObject->getData().data(), nodeObject->getData().size());
 
 
 1634    if (
hash.isNonZero())
 
 
 1657    if (!referenceLedger || (referenceLedger->info().seq < index))
 
 1672    XRPL_ASSERT(refHash, 
"ripple::LedgerMaster::walkHashBySeq : found ledger");
 
 1694                    *refHash, refIndex, reason))
 
 1699                    "ripple::LedgerMaster::walkHashBySeq : has complete " 
 
 1715            if (
valid->info().seq == index)
 
 1736    if (ret && (ret->info().seq == index))
 
 
 1750    if (ret && (ret->info().hash == 
hash))
 
 
 1814            "ripple::LedgerMaster::fetchForHistory : found ledger");
 
 1826                        << 
"fetchForHistory want fetch pack " << missing;
 
 1832                        << 
"fetchForHistory no fetch pack for " << missing;
 
 1836                    << 
"fetchForHistory found failed acquire";
 
 1840            auto seq = ledger->info().seq;
 
 1843                "ripple::LedgerMaster::fetchForHistory : sequence match");
 
 1852            if (fillInProgress == 0 &&
 
 1854                    ledger->info().parentHash)
 
 1862                    jtADVANCE, 
"tryFill", [
this, ledger]() {
 
 1874            fetchSz = missing >= fetchSz
 
 1886                            "ripple::LedgerMaster::fetchForHistory : " 
 1887                            "prefetched ledger");
 
 1895                    << 
"Threw while prefetching: " << ex.
what();
 
 1902            << 
"Can't find ledger following prevMissing " << missing;
 
 1908            << 
"Acquire reason: " 
 
 1923        bool progress = 
false;
 
 1926        if (pubLedgers.empty())
 
 1947                        << 
"tryAdvance discovered missing " << *missing;
 
 1957                            << 
"advanceThread should acquire";
 
 1968                            << 
"tryAdvance found last valid changed";
 
 1981            JLOG(
m_journal.
trace()) << 
"tryAdvance found " << pubLedgers.size()
 
 1982                                    << 
" ledgers to publish";
 
 1983            for (
auto const& ledger : pubLedgers)
 
 1988                        << 
"tryAdvance publishing seq " << ledger->info().seq;
 
 2001            progress = 
newPFWork(
"pf:newLedger", sl);
 
 
 2069    protocol::TMGetObjectByHash* into,
 
 2071    bool withLeaves = 
true)
 
 2073    XRPL_ASSERT(cnt, 
"ripple::populateFetchPack : nonzero count input");
 
 2079        [&s, withLeaves, &cnt, into, seq](
SHAMapTreeNode const& n) -> 
bool {
 
 2080            if (!withLeaves && n.
isLeaf())
 
 2088            protocol::TMIndexedObject* obj = into->add_objects();
 
 2089            obj->set_ledgerseq(seq);
 
 2090            obj->set_hash(
hash.data(), 
hash.size());
 
 
 2104    using namespace std::chrono_literals;
 
 2117    auto peer = wPeer.
lock();
 
 2127            << 
"Peer requests fetch pack for ledger we don't have: " << have;
 
 2135            << 
"Peer requests fetch pack from open ledger: " << have;
 
 2142        JLOG(
m_journal.
debug()) << 
"Peer requests fetch pack that is too early";
 
 2152            << 
"Peer requests fetch pack for ledger whose predecessor we " 
 2153            << 
"don't have: " << have;
 
 2163        protocol::TMGetObjectByHash reply;
 
 2164        reply.set_query(
false);
 
 2166        if (request->has_seq())
 
 2167            reply.set_seq(request->seq());
 
 2169        reply.set_ledgerhash(request->ledgerhash());
 
 2170        reply.set_type(protocol::TMGetObjectByHash::otFETCH_PACK);
 
 2189                addRaw(want->info(), hdr);
 
 2192                protocol::TMIndexedObject* obj = reply.add_objects();
 
 2194                    want->info().hash.data(), want->info().hash.size());
 
 2196                obj->set_ledgerseq(lSeq);
 
 2200                want->stateMap(), &have->stateMap(), 16384, &reply, lSeq);
 
 2204            if (want->info().txHash.isNonZero())
 
 2207            if (reply.objects().size() >= 512)
 
 2210            have = std::move(want);
 
 2217            << 
"Built fetch pack with " << reply.objects().size() << 
" nodes (" 
 2218            << msg->getBufferSize() << 
" bytes)";
 
 2225            << 
"Exception building fetch pach. Exception: " << ex.
what();
 
 
 2251    if (!lgr || lgr->txs.empty())
 
 2254    for (
auto it = lgr->txs.begin(); it != lgr->txs.end(); ++it)
 
 2255        if (it->first && it->second &&
 
 2256            it->second->isFieldPresent(sfTransactionIndex) &&
 
 2257            it->second->getFieldU32(sfTransactionIndex) == txnIndex)
 
 2258            return it->first->getTransactionID();
 
 
T back_inserter(T... args)
 
Provide a light-weight way to check active() before string formatting.
 
A generic endpoint for log messages.
 
Stream trace() const
Severity stream access functions.
 
typename Clock::time_point time_point
 
virtual std::optional< NetClock::time_point > firstUnsupportedExpected() const =0
 
virtual bool hasUnsupportedEnabled() const =0
returns true if one or more amendments on the network have been enabled that this server does not sup...
 
void doValidatedLedger(std::shared_ptr< ReadView const > const &lastValidatedLedger)
Called when a new fully-validated ledger is accepted.
 
virtual Config & config()=0
 
virtual Overlay & overlay()=0
 
virtual LoadFeeTrack & getFeeTrack()=0
 
virtual OpenLedger & openLedger()=0
 
virtual beast::Journal journal(std::string const &name)=0
 
virtual SHAMapStore & getSHAMapStore()=0
 
virtual bool isStopping() const =0
 
virtual NodeStore::Database & getNodeStore()=0
 
virtual RCLValidations & getValidations()=0
 
virtual OrderBookDB & getOrderBookDB()=0
 
virtual LedgerReplayer & getLedgerReplayer()=0
 
virtual TimeKeeper & timeKeeper()=0
 
virtual JobQueue & getJobQueue()=0
 
virtual NetworkOPs & getOPs()=0
 
virtual InboundLedgers & getInboundLedgers()=0
 
virtual ValidatorList & validators()=0
 
virtual LedgerMaster & getLedgerMaster()=0
 
virtual RelationalDatabase & getRelationalDatabase()=0
 
virtual PathRequests & getPathRequests()=0
 
virtual LedgerIndex getMaxDisallowedLedger()=0
Ensure that a newly-started validator does not sign proposals older than the last ledger it persisted...
 
virtual AmendmentTable & getAmendmentTable()=0
 
virtual PendingSaves & pendingSaves()=0
 
Holds transactions which were deferred to the next pass of consensus.
 
void insert(std::shared_ptr< STTx const > const &txn)
 
std::shared_ptr< STTx const > popAcctTransaction(std::shared_ptr< STTx const > const &tx)
 
std::unordered_set< uint256, beast::uhash<> > features
 
virtual std::shared_ptr< Ledger const > acquire(uint256 const &hash, std::uint32_t seq, InboundLedger::Reason)=0
 
virtual bool isFailure(uint256 const &h)=0
 
int getJobCount(JobType t) const
Jobs waiting at this priority.
 
bool addJob(JobType type, std::string const &name, JobHandler &&jobHandler)
Adds a job to the JobQueue.
 
float getCacheHitRate()
Get the ledgers_by_hash cache hit rate.
 
void builtLedger(std::shared_ptr< Ledger const > const &, uint256 const &consensusHash, Json::Value)
Report that we have locally built a particular ledger.
 
void sweep()
Remove stale cache entries.
 
LedgerHash getLedgerHash(LedgerIndex ledgerIndex)
Get a ledger's hash given its sequence number.
 
void clearLedgerCachePrior(LedgerIndex seq)
 
std::shared_ptr< Ledger const > getLedgerBySeq(LedgerIndex ledgerIndex)
Get a ledger given its sequence number.
 
bool insert(std::shared_ptr< Ledger const > const &ledger, bool validated)
Track a ledger.
 
bool fixIndex(LedgerIndex ledgerIndex, LedgerHash const &ledgerHash)
Repair a hash to index mapping.
 
void validatedLedger(std::shared_ptr< Ledger const > const &, std::optional< uint256 > const &consensusHash)
Report that we have validated a particular ledger.
 
std::shared_ptr< Ledger const > getLedgerByHash(LedgerHash const &ledgerHash)
Retrieve a ledger given its hash.
 
std::shared_ptr< Ledger const > get()
 
void set(std::shared_ptr< Ledger const > ledger)
 
bool haveLedger(std::uint32_t seq)
 
std::shared_ptr< Ledger const > getValidatedLedger()
 
void clearLedgerCachePrior(LedgerIndex seq)
 
RangeSet< std::uint32_t > mCompleteLedgers
 
void setBuildingLedger(LedgerIndex index)
 
std::unique_ptr< LedgerReplay > releaseReplay()
 
void failedSave(std::uint32_t seq, uint256 const &hash)
 
void takeReplay(std::unique_ptr< LedgerReplay > replay)
 
std::uint32_t const ledger_history_
 
void addHeldTransaction(std::shared_ptr< Transaction > const &trans)
 
void checkAccept(std::shared_ptr< Ledger const > const &ledger)
 
std::optional< NetClock::time_point > getCloseTimeByHash(LedgerHash const &ledgerHash, LedgerIndex ledgerIndex)
 
std::size_t getNeededValidations()
Determines how many validations are needed to fully validate a ledger.
 
std::unique_ptr< LedgerReplay > replayData
 
void setLedgerRangePresent(std::uint32_t minV, std::uint32_t maxV)
 
TimeKeeper::time_point upgradeWarningPrevTime_
 
LedgerHistory mLedgerHistory
 
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
 
void fixMismatch(ReadView const &ledger)
 
std::atomic< LedgerIndex > mPubLedgerSeq
 
void clearPriorLedgers(LedgerIndex seq)
 
std::shared_ptr< Ledger const  > mPubLedger
 
void makeFetchPack(std::weak_ptr< Peer > const &wPeer, std::shared_ptr< protocol::TMGetObjectByHash > const &request, uint256 haveLedgerHash, UptimeClock::time_point uptime)
 
std::atomic< LedgerIndex > mBuildingLedgerSeq
 
std::shared_ptr< ReadView const > getCurrentLedger()
 
void tryFill(std::shared_ptr< Ledger const > ledger)
 
std::uint32_t const fetch_depth_
 
bool canBeCurrent(std::shared_ptr< Ledger const > const &ledger)
Check the sequence number and parent close time of a ledger against our clock and last validated ledg...
 
bool isValidated(ReadView const &ledger)
 
std::uint32_t getEarliestFetch()
 
std::recursive_mutex m_mutex
 
std::optional< LedgerHash > walkHashBySeq(std::uint32_t index, InboundLedger::Reason reason)
Walk to a ledger's hash using the skip list.
 
uint256 getHashBySeq(std::uint32_t index)
Get a ledger's hash by sequence number using the cache.
 
std::shared_ptr< STTx const > popAcctTransaction(std::shared_ptr< STTx const > const &tx)
Get the next transaction held for a particular account if any.
 
LedgerIndex const max_ledger_difference_
 
bool fixIndex(LedgerIndex ledgerIndex, LedgerHash const &ledgerHash)
 
TaggedCache< uint256, Blob > fetch_packs_
 
bool newPFWork(char const *name, std::unique_lock< std::recursive_mutex > &)
A thread needs to be dispatched to handle pathfinding work of some kind.
 
bool isCaughtUp(std::string &reason)
 
void setPubLedger(std::shared_ptr< Ledger const > const &l)
 
std::optional< uint256 > txnIdFromIndex(uint32_t ledgerSeq, uint32_t txnIndex)
 
bool getValidatedRange(std::uint32_t &minVal, std::uint32_t &maxVal)
 
void clearLedger(std::uint32_t seq)
 
std::pair< uint256, LedgerIndex > mLastValidLedger
 
std::shared_ptr< Ledger const > getClosedLedger()
 
std::optional< LedgerIndex > minSqlSeq()
 
void setFullLedger(std::shared_ptr< Ledger const > const &ledger, bool isSynchronous, bool isCurrent)
 
LedgerMaster(Application &app, Stopwatch &stopwatch, beast::insight::Collector::ptr const &collector, beast::Journal journal)
 
std::atomic< std::uint32_t > mValidLedgerSign
 
CanonicalTXSet mHeldTransactions
 
std::uint32_t const ledger_fetch_size_
 
void applyHeldTransactions()
Apply held transactions to the open ledger This is normally called as we close the ledger.
 
std::chrono::seconds getPublishedLedgerAge()
 
std::shared_ptr< Ledger const  > mHistLedger
 
std::recursive_mutex mCompleteLock
 
std::string getCompleteLedgers()
 
std::atomic< LedgerIndex > mValidLedgerSeq
 
std::size_t getFetchPackCacheSize() const
 
bool getFullValidatedRange(std::uint32_t &minVal, std::uint32_t &maxVal)
 
std::optional< Blob > getFetchPack(uint256 const &hash) override
Retrieves partial ledger data of the coresponding hash from peers.
 
void gotFetchPack(bool progress, std::uint32_t seq)
 
std::recursive_mutex & peekMutex()
 
void consensusBuilt(std::shared_ptr< Ledger const > const &ledger, uint256 const &consensusHash, Json::Value consensus)
Report that the consensus process built a particular ledger.
 
Rules getValidatedRules()
 
std::shared_ptr< Ledger const  > mPathLedger
 
void setValidLedger(std::shared_ptr< Ledger const > const &l)
 
std::optional< LedgerHash > getLedgerHashForHistory(LedgerIndex index, InboundLedger::Reason reason)
 
void addFetchPack(uint256 const &hash, std::shared_ptr< Blob > data)
 
std::atomic< std::uint32_t > mPubLedgerClose
 
void switchLCL(std::shared_ptr< Ledger const > const &lastClosed)
 
LedgerHolder mValidLedger
 
std::shared_ptr< ReadView const > getPublishedLedger()
 
std::atomic_flag mGotFetchPackThread
 
void doAdvance(std::unique_lock< std::recursive_mutex > &)
 
LedgerHolder mClosedLedger
 
bool storeLedger(std::shared_ptr< Ledger const > ledger)
 
std::vector< std::shared_ptr< Ledger const > > findNewLedgersToPublish(std::unique_lock< std::recursive_mutex > &)
 
LedgerIndex getCurrentLedgerIndex()
 
bool isCompatible(ReadView const &, beast::Journal::Stream, char const *reason)
 
std::shared_ptr< Ledger const > getLedgerBySeq(std::uint32_t index)
 
void fetchForHistory(std::uint32_t missing, bool &progress, InboundLedger::Reason reason, std::unique_lock< std::recursive_mutex > &)
 
std::shared_ptr< Ledger const > getLedgerByHash(uint256 const &hash)
 
LedgerIndex getValidLedgerIndex()
 
std::chrono::seconds getValidatedLedgerAge()
 
void replay(InboundLedger::Reason r, uint256 const &finishLedgerHash, std::uint32_t totalNumLedgers)
Replay a range of ledgers.
 
void setRemoteFee(std::uint32_t f)
 
bool isLoadedLocal() const
 
std::uint32_t getLoadBase() const
 
virtual bool isBlocked()=0
 
virtual void setAmendmentWarned()=0
 
virtual void setAmendmentBlocked()=0
 
virtual void clearNeedNetworkLedger()=0
 
virtual bool isAmendmentWarned()=0
 
virtual bool isNeedNetworkLedger()=0
 
virtual void updateLocalTx(ReadView const &newValidLedger)=0
 
virtual void clearAmendmentWarned()=0
 
virtual void processTransactionSet(CanonicalTXSet const &set)=0
Process a set of transactions synchronously, and ensuring that they are processed in one batch.
 
virtual void pubLedger(std::shared_ptr< ReadView const > const &lpAccepted)=0
 
Persistency layer for NodeObject.
 
std::shared_ptr< NodeObject > fetchNodeObject(uint256 const &hash, std::uint32_t ledgerSeq=0, FetchType fetchType=FetchType::synchronous, bool duplicate=false)
Fetch a node object.
 
virtual std::int32_t getWriteLoad() const =0
Retrieve the estimated number of pending write operations.
 
std::uint32_t earliestLedgerSeq() const noexcept
 
std::shared_ptr< OpenView const > current() const
Returns a view to the current open ledger.
 
void setup(std::shared_ptr< ReadView const > const &ledger)
 
virtual PeerSequence getActivePeers() const =0
Returns a sequence representing the current list of peers.
 
virtual void checkTracking(std::uint32_t index)=0
Calls the checkTracking function on each peer.
 
bool requestsPending() const
 
std::map< LedgerIndex, bool > getSnapshot() const
Get a snapshot of the pending saves.
 
virtual bool open() const =0
Returns true if this reflects an open ledger.
 
virtual LedgerInfo const & info() const =0
Returns information about the ledger.
 
virtual std::optional< LedgerHashPair > getHashesByIndex(LedgerIndex ledgerIndex)=0
getHashesByIndex Returns the hashes of the ledger and its parent as specified by the ledgerIndex.
 
virtual std::optional< LedgerIndex > getMinLedgerSeq()=0
getMinLedgerSeq Returns the minimum ledger sequence in the Ledgers table.
 
virtual uint256 getHashByIndex(LedgerIndex ledgerIndex)=0
getHashByIndex Returns the hash of the ledger with the given sequence.
 
Rules controlling protocol behavior.
 
uint256 const & as_uint256() const
 
virtual void onLedgerClosed(std::shared_ptr< Ledger const > const &ledger)=0
Called by LedgerMaster every time a ledger validates.
 
virtual std::optional< LedgerIndex > minimumOnline() const =0
The minimum ledger to try and maintain in our database.
 
virtual bool isLeaf() const =0
Determines if this is a leaf node.
 
SHAMapHash const & getHash() const
Return the hash of this node.
 
virtual void serializeWithPrefix(Serializer &) const =0
Serialize the node in a format appropriate for hashing.
 
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
 
void visitDifferences(SHAMap const *have, std::function< bool(SHAMapTreeNode const &)> const &) const
Visit every node in this SHAMap that is not present in the specified SHAMap.
 
void const * getDataPtr() const
 
time_point now() const override
Returns the current time, using the server's clock.
 
time_point closeTime() const
Returns the predicted close time, in network time.
 
std::vector< WrappedValidationType > getTrustedForLedger(ID const &ledgerID, Seq const &seq)
Get trusted full validations for a specific ledger.
 
std::vector< WrappedValidationType > currentTrusted()
Get the currently trusted full validations.
 
std::vector< std::uint32_t > fees(ID const &ledgerID, std::uint32_t baseFee)
Returns fees reported by trusted full validators in the given ledger.
 
std::vector< std::shared_ptr< STValidation > > negativeUNLFilter(std::vector< std::shared_ptr< STValidation > > &&validations) const
Remove validations that are from validators on the negative UNL.
 
std::size_t quorum() const
Get quorum value for current trusted key set.
 
QuorumKeys getQuorumKeys() const
Get the quorum and all of the trusted keys.
 
Automatically unlocks and re-locks a unique_lock object.
 
bool isNewerVersion(std::uint64_t version)
Check if the version is newer than the local node's rippled software version.
 
bool isRippledVersion(std::uint64_t version)
Check if the encoded software version is a rippled software version.
 
Charge const feeMalformedRequest
Schedule of fees charged for imposing load on the server.
 
Charge const feeRequestNoReply
 
TER valid(STTx const &tx, ReadView const &view, AccountID const &src, beast::Journal j)
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
bool areCompatible(ReadView const &validLedger, ReadView const &testLedger, beast::Journal::Stream &s, char const *reason)
Return false if the test ledger is provably incompatible with the valid ledger, that is,...
 
LedgerIndex getCandidateLedger(LedgerIndex requested)
Find a ledger index from which we could easily get the requested ledger.
 
static bool shouldAcquire(std::uint32_t const currentLedger, std::uint32_t const ledgerHistory, std::optional< LedgerIndex > const minimumOnline, std::uint32_t const candidateLedger, beast::Journal j)
 
std::optional< T > prevMissing(RangeSet< T > const &rs, T t, T minVal=0)
Find the largest value not in the set that is less than a given value.
 
bool isCurrent(ValidationParms const &p, NetClock::time_point now, NetClock::time_point signTime, NetClock::time_point seenTime)
Whether a validation is still current.
 
std::optional< uint256 > hashOfSeq(ReadView const &ledger, LedgerIndex seq, beast::Journal journal)
Return the hash of a ledger by sequence.
 
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
 
static constexpr int MAX_LEDGER_GAP
 
constexpr std::size_t calculatePercent(std::size_t count, std::size_t total)
Calculate one number divided by another number in percentage.
 
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)
 
Stopwatch & stopwatch()
Returns an instance of a wall clock.
 
std::string to_string(base_uint< Bits, Tag > const &a)
 
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
 
static void populateFetchPack(SHAMap const &want, SHAMap const *have, std::uint32_t cnt, protocol::TMGetObjectByHash *into, std::uint32_t seq, bool withLeaves=true)
Populate a fetch pack with data from the map the recipient wants.
 
static constexpr std::chrono::minutes MAX_LEDGER_AGE_ACQUIRE
 
@ ledgerMaster
ledger master data for signing
 
static constexpr int MAX_WRITE_LOAD_ACQUIRE
 
void addRaw(LedgerHeader const &, Serializer &, bool includeHash=false)
 
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
 
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
 
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.
 
T test_and_set(T... args)
 
T time_since_epoch(T... args)