1#include <xrpld/app/consensus/RCLConsensus.h>
2#include <xrpld/app/consensus/RCLValidations.h>
3#include <xrpld/app/ledger/BuildLedger.h>
4#include <xrpld/app/ledger/InboundLedgers.h>
5#include <xrpld/app/ledger/InboundTransactions.h>
6#include <xrpld/app/ledger/Ledger.h>
7#include <xrpld/app/ledger/LedgerMaster.h>
8#include <xrpld/app/ledger/LocalTxs.h>
9#include <xrpld/app/ledger/OpenLedger.h>
10#include <xrpld/app/misc/AmendmentTable.h>
11#include <xrpld/app/misc/HashRouter.h>
12#include <xrpld/app/misc/LoadFeeTrack.h>
13#include <xrpld/app/misc/NegativeUNLVote.h>
14#include <xrpld/app/misc/NetworkOPs.h>
15#include <xrpld/app/misc/TxQ.h>
16#include <xrpld/app/misc/ValidatorKeys.h>
17#include <xrpld/app/misc/ValidatorList.h>
18#include <xrpld/consensus/LedgerTiming.h>
19#include <xrpld/overlay/Overlay.h>
20#include <xrpld/overlay/predicates.h>
22#include <xrpl/basics/random.h>
23#include <xrpl/beast/core/LexicalCast.h>
24#include <xrpl/beast/utility/instrumentation.h>
25#include <xrpl/protocol/BuildInfo.h>
26#include <xrpl/protocol/Feature.h>
27#include <xrpl/protocol/digest.h>
44 : adaptor_(app,
std::move(feeVote),
ledgerMaster, localTxs, inboundTransactions, validatorKeys, journal)
45 , consensus_(clock, adaptor_, journal)
59 , feeVote_(
std::move(feeVote))
62 , inboundTransactions_{inboundTransactions}
64 , validatorKeys_(validatorKeys)
66 , nUnlVote_(validatorKeys_.nodeID, j_)
68 XRPL_ASSERT(
valCookie_,
"xrpl::RCLConsensus::Adaptor::Adaptor : nonzero cookie");
76 JLOG(
j_.
info()) <<
"Validator identity: "
81 JLOG(
j_.
debug()) <<
"Validator ephemeral signing key: "
92 auto built = ledgerMaster_.getLedgerByHash(hash);
95 if (acquiringLedger_ != hash)
98 JLOG(
j_.
warn()) <<
"Need consensus ledger " << hash;
101 acquiringLedger_ = hash;
103 app_.getJobQueue().addJob(
jtADVANCE,
"GetConsL1", [
id = hash, &app = app_,
this]() {
104 JLOG(
j_.
debug()) <<
"JOB advanceLedger getConsensusLedger1 started";
112 !built->open() && built->isImmutable(),
"xrpl::RCLConsensus::Adaptor::acquireLedger : valid ledger state");
113 XRPL_ASSERT(built->header().hash == hash,
"xrpl::RCLConsensus::Adaptor::acquireLedger : ledger hash match");
116 inboundTransactions_.newRound(built->header().seq);
124 protocol::TMProposeSet prop;
128 prop.set_proposeseq(
proposal.proposeSeq());
129 prop.set_closetime(
proposal.closeTime().time_since_epoch().count());
131 prop.set_currenttxhash(
proposal.position().begin(),
proposal.position().size());
132 prop.set_previousledger(
proposal.prevLedger().begin(),
proposal.position().size());
135 prop.set_nodepubkey(pk.data(), pk.size());
138 prop.set_signature(sig.data(), sig.size());
147 if (app_.getHashRouter().shouldRelay(tx.
id()))
149 JLOG(
j_.
debug()) <<
"Relaying disputed tx " << tx.
id();
150 auto const slice = tx.
tx_->slice();
151 protocol::TMTransaction msg;
152 msg.set_rawtransaction(slice.data(), slice.size());
153 msg.set_status(protocol::tsNEW);
154 msg.set_receivetimestamp(app_.timeKeeper().now().time_since_epoch().count());
156 app_.overlay().relay(tx.
id(), msg, skip);
160 JLOG(
j_.
debug()) <<
"Not relaying disputed tx " << tx.
id();
166 JLOG(
j_.
trace()) << (
proposal.isBowOut() ?
"We bow out: " :
"We propose: ")
169 protocol::TMProposeSet prop;
171 prop.set_currenttxhash(
proposal.position().begin(),
proposal.position().size());
172 prop.set_previousledger(
proposal.prevLedger().begin(),
proposal.prevLedger().size());
173 prop.set_proposeseq(
proposal.proposeSeq());
174 prop.set_closetime(
proposal.closeTime().time_since_epoch().count());
176 if (!validatorKeys_.keys)
178 JLOG(
j_.
warn()) <<
"RCLConsensus::Adaptor::propose: ValidatorKeys "
183 auto const& keys = *validatorKeys_.keys;
185 prop.set_nodepubkey(keys.publicKey.data(), keys.publicKey.size());
189 prop.set_signature(sig.data(), sig.size());
194 app_.getHashRouter().addSuppression(suppression);
196 app_.overlay().broadcast(prop);
202 inboundTransactions_.giveSet(txns.
id(), txns.
map_,
false);
208 if (
auto txns = inboundTransactions_.getSet(setId,
true))
218 return !app_.openLedger().empty();
224 return app_.getValidations().numTrustedForLedger(h);
241 if (netLgr != ledgerID)
244 app_.getOPs().consensusViewChange();
259 notify(protocol::neCLOSING_LEDGER, ledger, !wrongLCL);
261 auto const& prevLedger = ledger.ledger_;
263 ledgerMaster_.applyHeldTransactions();
265 ledgerMaster_.setBuildingLedger(prevLedger->header().seq + 1);
267 auto initialLedger = app_.openLedger().current();
270 initialSet->setUnbacked();
273 for (
auto const& tx : initialLedger->txs)
275 JLOG(
j_.
trace()) <<
"Adding open ledger TX " << tx.first->getTransactionID();
282 if (app_.config().standalone() || (
proposing && !wrongLCL))
284 if (prevLedger->isFlagLedger())
288 auto validations = app_.validators().negativeUNLFilter(
289 app_.getValidations().getTrustedForLedger(prevLedger->header().parentHash, prevLedger->seq() - 1));
290 if (validations.size() >= app_.validators().quorum())
292 feeVote_->doVoting(prevLedger, validations, initialSet);
293 app_.getAmendmentTable().doVoting(prevLedger, validations, initialSet,
j_);
296 else if (prevLedger->isVotingLedger())
301 nUnlVote_.doVoting(prevLedger, app_.validators().getTrustedMasterKeys(), app_.getValidations(), initialSet);
306 initialSet = initialSet->snapShot(
false);
310 LedgerIndex const seq = prevLedger->header().seq + 1;
313 initialSet->visitLeaves([&proposed, seq](boost::intrusive_ptr<SHAMapItem const>
const& item) {
317 censorshipDetector_.propose(std::move(proposed));
321 auto const setHash = initialSet->getHash().as_uint256();
324 std::move(initialSet),
326 initialLedger->header().parentHash,
330 app_.timeKeeper().closeTime(),
331 validatorKeys_.nodeID}};
343 doAccept(result, prevLedger, closeResolution, rawCloseTimes,
mode, std::move(consensusJson));
356 app_.getJobQueue().addJob(
jtACCEPT,
"AcceptLedger", [=,
this, cj = std::move(consensusJson)]()
mutable {
363 this->doAccept(result, prevLedger, closeResolution, rawCloseTimes,
mode, std::move(cj));
364 this->app_.getOPs().endConsensus(clog.
ss());
380 bool closeTimeCorrect;
391 using namespace std::chrono_literals;
392 consensusCloseTime = prevLedger.
closeTime() + 1s;
393 closeTimeCorrect =
false;
399 closeTimeCorrect =
true;
402 JLOG(
j_.
debug()) <<
"Report: Prop=" << (
proposing ?
"yes" :
"no") <<
" val=" << (validating_ ?
"yes" :
"no")
403 <<
" corLCL=" << (haveCorrectLCL ?
"yes" :
"no") <<
" fail=" << (consensusFail ?
"yes" :
"no");
404 JLOG(
j_.
debug()) <<
"Report: Prev = " << prevLedger.
id() <<
":" << prevLedger.
seq();
415 JLOG(
j_.
debug()) <<
"Building canonical tx set: " << retriableTxs.key();
417 for (
auto const& item : *result.
txns.map_)
422 JLOG(
j_.
debug()) <<
" Tx: " << item.key();
426 failed.
insert(item.key());
427 JLOG(
j_.
warn()) <<
" Tx: " << item.key() <<
" throws: " << ex.
what();
431 auto built = buildLCL(
440 auto const newLCLHash = built.id();
441 JLOG(
j_.
debug()) <<
"Built ledger #" << built.seq() <<
": " << newLCLHash;
444 notify(protocol::neACCEPTED_LEDGER, built, haveCorrectLCL);
453 result.
txns.map_->visitLeaves(
454 [&
accepted](boost::intrusive_ptr<SHAMapItem const>
const& item) {
accepted.push_back(item->key()); });
457 for (
auto const& r : retriableTxs)
458 failed.
insert(r.first.getTXID());
460 censorshipDetector_.check(
462 [curr = built.seq(), j = app_.journal(
"CensorshipDetector"), &failed](
uint256 const& id,
LedgerIndex seq) {
463 if (failed.
count(
id))
466 auto const wait = curr - seq;
471 ss <<
"Potential Censorship: Eligible tx " <<
id <<
", which we are tracking since ledger " << seq
472 <<
" has not been included as of ledger " << curr <<
".";
474 JLOG(j.warn()) << ss.
str();
482 validating_ = ledgerMaster_.isCompatible(*built.ledger_,
j_.
warn(),
"Not validating");
484 if (validating_ && !consensusFail && app_.getValidations().canValidateSeq(built.seq()))
487 JLOG(
j_.
info()) <<
"CNF Val " << newLCLHash;
490 JLOG(
j_.
info()) <<
"CNF buildLCL " << newLCLHash;
493 ledgerMaster_.consensusBuilt(built.ledger_, result.
txns.id(), std::move(consensusJson));
508 bool anyDisputes =
false;
509 for (
auto const& [_, dispute] : result.
disputes)
512 if (!dispute.getOurVote())
517 JLOG(
j_.
debug()) <<
"Test applying disputed transaction that did"
518 <<
" not get in " << dispute.tx().id();
528 retriableTxs.insert(txn);
534 JLOG(
j_.
debug()) <<
"Failed to apply transaction we voted "
546 auto const lastVal = ledgerMaster_.getValidatedLedger();
551 rules.
emplace(app_.config().features);
552 app_.openLedger().accept(
556 localTxs_.getTxSet(),
563 return app_.getTxQ().accept(app_, view);
568 app_.getOPs().reportFeeChange();
573 ledgerMaster_.switchLCL(built.ledger_);
577 ledgerMaster_.getClosedLedger()->header().hash == built.id(),
578 "xrpl::RCLConsensus::Adaptor::doAccept : ledger hash match");
580 app_.openLedger().current()->header().parentHash == built.id(),
581 "xrpl::RCLConsensus::Adaptor::doAccept : parent hash match");
590 auto closeTime = rawCloseTimes.
self;
592 JLOG(
j_.
info()) <<
"We closed at " << closeTime.time_since_epoch().count();
594 usec64_t closeTotal = std::chrono::duration_cast<usec64_t>(closeTime.time_since_epoch());
597 for (
auto const& [t, v] : rawCloseTimes.
peers)
601 closeTotal += std::chrono::duration_cast<usec64_t>(t.time_since_epoch()) * v;
604 closeTotal += usec64_t(closeCount / 2);
605 closeTotal /= closeCount;
610 auto offset = time_point{closeTotal} - std::chrono::time_point_cast<duration>(closeTime);
611 JLOG(
j_.
info()) <<
"Our close offset is estimated at " << offset.count() <<
" (" << closeCount <<
")";
613 app_.timeKeeper().adjustCloseTime(offset);
620 protocol::TMStatusChange s;
623 s.set_newevent(protocol::neLOST_SYNC);
627 s.set_ledgerseq(ledger.
seq());
628 s.set_networktime(app_.timeKeeper().now().time_since_epoch().count());
633 if (!ledgerMaster_.getFullValidatedRange(uMin, uMax))
641 uMin =
std::max(uMin, ledgerMaster_.getEarliestFetch());
643 s.set_firstseq(uMin);
646 JLOG(
j_.
trace()) <<
"send status change to peer";
654 bool closeTimeCorrect,
660 if (
auto const replayData = ledgerMaster_.releaseReplay())
663 replayData->parent()->header().hash == previousLedger.
id(),
664 "xrpl::RCLConsensus::Adaptor::buildLCL : parent hash match");
668 previousLedger.
ledger_, closeTime, closeTimeCorrect, closeResolution, app_, retriableTxs, failedTxs,
j_);
672 using namespace std::chrono_literals;
673 app_.getTxQ().processClosedLedger(app_, *built, roundTime > 5s);
676 if (ledgerMaster_.storeLedger(built))
677 JLOG(
j_.
debug()) <<
"Consensus built ledger we already had";
678 else if (app_.getInboundLedgers().find(built->header().hash))
679 JLOG(
j_.
debug()) <<
"Consensus built ledger we were acquiring";
681 JLOG(
j_.
debug()) <<
"Consensus built new ledger";
688 using namespace std::chrono_literals;
690 auto validationTime = app_.timeKeeper().
closeTime();
691 if (validationTime <= lastValidationTime_)
692 validationTime = lastValidationTime_ + 1s;
693 lastValidationTime_ = validationTime;
695 if (!validatorKeys_.keys)
697 JLOG(
j_.
warn()) <<
"RCLConsensus::Adaptor::validate: ValidatorKeys "
702 auto const& keys = *validatorKeys_.keys;
705 lastValidationTime_, keys.publicKey, keys.secretKey, validatorKeys_.nodeID, [&](
STValidation& v) {
706 v.setFieldH256(sfLedgerHash, ledger.id());
707 v.setFieldH256(sfConsensusHash, txns.id());
709 v.setFieldU32(sfLedgerSequence, ledger.seq());
712 v.setFlag(vfFullValidation);
717 if (auto const vl = ledgerMaster_.getValidatedLedger())
718 v.setFieldH256(sfValidatedHash, vl->header().hash);
720 v.setFieldU64(sfCookie, valCookie_);
723 if (ledger.ledger_->isVotingLedger())
724 v.setFieldU64(sfServerVersion, BuildInfo::getEncodedVersion());
728 auto const& ft = app_.getFeeTrack();
729 auto const fee = std::max(ft.getLocalFee(), ft.getClusterFee());
730 if (fee > ft.getLoadBase())
731 v.setFieldU32(sfLoadFee, fee);
736 if (ledger.
ledger_->isVotingLedger())
739 feeVote_->doValidation(ledger.ledger_->fees(), ledger.ledger_->rules(), v);
744 auto const amendments = app_.getAmendmentTable().doValidation(getEnabledAmendments(*ledger.ledger_));
746 if (!amendments.empty())
747 v.setFieldV256(sfAmendments, STVector256(sfAmendments, amendments));
751 auto const serialized = v->getSerialized();
759 protocol::TMValidation val;
760 val.set_validation(serialized.data(), serialized.size());
761 app_.overlay().broadcast(val);
764 app_.getOPs().pubValidation(v);
804 ss <<
"During consensus timerEntry: " << mn.
what();
806 CLOG(clog) << ss.
str();
822 JLOG(
j_.
error()) <<
"During consensus gotTxSet: " << mn.
what();
840 return consensus_.peerProposal(now, newProposal);
848 validating_ = validatorKeys_.keys && prevLgr.
seq() >= app_.getMaxDisallowedLedger() && !app_.getOPs().isBlocked();
852 if (validating_ && !app_.config().standalone() && app_.validators().count())
854 auto const when = app_.validators().expires();
856 if (!when || *when < app_.timeKeeper().now())
858 JLOG(
j_.
error()) <<
"Voluntarily bowing out of consensus process "
859 "because of an expired validator list.";
868 JLOG(
j_.
info()) <<
"Entering consensus process, validating, synced=" << (synced ?
"yes" :
"no");
873 JLOG(
j_.
info()) <<
"Entering consensus process, watching, synced=" << (synced ?
"yes" :
"no");
877 inboundTransactions_.newRound(prevLgr.
seq());
880 if (!nowTrusted.
empty())
881 nUnlVote_.newValidators(prevLgr.
seq() + 1, nowTrusted);
884 return validating_ && synced;
890 return ledgerMaster_.haveValidated();
896 return ledgerMaster_.getValidLedgerIndex();
902 return app_.validators().getQuorumKeys();
908 return app_.getValidations().laggards(seq, trustedKeys);
914 return validatorKeys_.keys.has_value();
920 if (!positions && app_.getOPs().isFull())
939 if (!validating && !j.
info())
952 auto const duration =
956 << (duration.count() % 1000) <<
"s. " <<
ss_->
str();
Decorator for streaming out compact json.
virtual void writeAlways(Severity level, std::string const &text)=0
Bypass filter and write text to the sink at the specified severity.
A generic endpoint for log messages.
Sink & sink() const
Returns the Sink associated with this Journal.
Stream trace() const
Severity stream access functions.
Holds transactions which were deferred to the next pass of consensus.
NetClock::time_point const & closeTime() const
The current position on the consensus close time.
static std::uint32_t const seqJoin
std::chrono::milliseconds read() const
Manages the acquisition and lifetime of transaction sets.
Writable ledger view that accumulates state and tx changes.
Slice slice() const noexcept
Result onClose(RCLCxLedger const &ledger, NetClock::time_point const &closeTime, ConsensusMode mode)
Close the open ledger and return initial consensus position.
bool preStartRound(RCLCxLedger const &prevLedger, hash_set< NodeID > const &nowTrusted)
Called before kicking off a new consensus round.
bool validator() const
Whether I am a validator.
LedgerIndex getValidLedgerIndex() const
Adaptor(Application &app, std::unique_ptr< FeeVote > &&feeVote, LedgerMaster &ledgerMaster, LocalTxs &localTxs, InboundTransactions &inboundTransactions, ValidatorKeys const &validatorKeys, beast::Journal journal)
void updateOperatingMode(std::size_t const positions) const
Update operating mode based on current peer positions.
std::size_t proposersFinished(RCLCxLedger const &ledger, LedgerHash const &h) const
Number of proposers that have validated a ledger descended from requested ledger.
void validate(RCLCxLedger const &ledger, RCLTxSet const &txns, bool proposing)
Validate the given ledger and share with peers as necessary.
void doAccept(Result const &result, RCLCxLedger const &prevLedger, NetClock::duration closeResolution, ConsensusCloseTimes const &rawCloseTimes, ConsensusMode const &mode, Json::Value &&consensusJson)
Accept a new ledger based on the given transactions.
void propose(RCLCxPeerPos::Proposal const &proposal)
Propose the given position to my peers.
RCLCxLedger buildLCL(RCLCxLedger const &previousLedger, CanonicalTXSet &retriableTxs, NetClock::time_point closeTime, bool closeTimeCorrect, NetClock::duration closeResolution, std::chrono::milliseconds roundTime, std::set< TxID > &failedTxs)
Build the new last closed ledger.
std::size_t proposersValidated(LedgerHash const &h) const
Number of proposers that have validated the given ledger.
void notify(protocol::NodeEvent ne, RCLCxLedger const &ledger, bool haveCorrectLCL)
Notify peers of a consensus state change.
void onAccept(Result const &result, RCLCxLedger const &prevLedger, NetClock::duration const &closeResolution, ConsensusCloseTimes const &rawCloseTimes, ConsensusMode const &mode, Json::Value &&consensusJson, bool const validating)
Process the accepted ledger.
std::atomic< ConsensusMode > mode_
std::pair< std::size_t, hash_set< NodeKey_t > > getQuorumKeys() const
std::optional< RCLTxSet > acquireTxSet(RCLTxSet::ID const &setId)
Acquire the transaction set associated with a proposal.
ValidatorKeys const & validatorKeys_
uint256 getPrevLedger(uint256 ledgerID, RCLCxLedger const &ledger, ConsensusMode mode)
Get the ID of the previous ledger/last closed ledger(LCL) on the network.
std::size_t laggards(Ledger_t::Seq const seq, hash_set< NodeKey_t > &trustedKeys) const
void onForceAccept(Result const &result, RCLCxLedger const &prevLedger, NetClock::duration const &closeResolution, ConsensusCloseTimes const &rawCloseTimes, ConsensusMode const &mode, Json::Value &&consensusJson)
Process the accepted ledger that was a result of simulation/force accept.
std::optional< RCLCxLedger > acquireLedger(LedgerHash const &hash)
Attempt to acquire a specific ledger.
bool hasOpenTransactions() const
Whether the open ledger has any transactions.
RCLCensorshipDetector< TxID, LedgerIndex > censorshipDetector_
bool haveValidated() const
void onModeChange(ConsensusMode before, ConsensusMode after)
Notified of change in consensus mode.
std::uint64_t const valCookie_
void share(RCLCxPeerPos const &peerPos)
Share the given proposal with all peers.
Consensus< Adaptor > consensus_
void timerEntry(NetClock::time_point const &now, std::unique_ptr< std::stringstream > const &clog={})
void startRound(NetClock::time_point const &now, RCLCxLedger::ID const &prevLgrId, RCLCxLedger const &prevLgr, hash_set< NodeID > const &nowUntrusted, hash_set< NodeID > const &nowTrusted, std::unique_ptr< std::stringstream > const &clog)
Adjust the set of trusted validators and kick-off the next round of consensus.
bool validating() const
Whether we are validating consensus ledgers.
bool peerProposal(NetClock::time_point const &now, RCLCxPeerPos const &newProposal)
void simulate(NetClock::time_point const &now, std::optional< std::chrono::milliseconds > consensusDelay)
Json::Value getJson(bool full) const
std::recursive_mutex mutex_
static constexpr unsigned int censorshipWarnInternal
Warn for transactions that haven't been included every so many ledgers.
RCLConsensus(Application &app, std::unique_ptr< FeeVote > &&feeVote, LedgerMaster &ledgerMaster, LocalTxs &localTxs, InboundTransactions &inboundTransactions, Consensus< Adaptor >::clock_type const &clock, ValidatorKeys const &validatorKeys, beast::Journal journal)
Constructor.
ConsensusMode mode() const
void gotTxSet(NetClock::time_point const &now, RCLTxSet const &txSet)
Represents a ledger in RCLConsensus.
std::shared_ptr< Ledger const > ledger_
The ledger instance.
Seq const & seq() const
Sequence number of the ledger.
ID const & parentID() const
Unique identifier (hash) of this ledger's parent.
ID const & id() const
Unique identifier (hash) of this ledger.
NetClock::time_point closeTime() const
The close time of this ledger.
A peer's signed, proposed position for use in RCLConsensus.
uint256 const & suppressionID() const
Unique id used by hash router to suppress duplicates.
PublicKey const & publicKey() const
Public key of peer that sent the proposal.
Slice signature() const
Signature of the proposal (not necessarily verified)
Proposal const & proposal() const
Represents a transaction in RCLConsensus.
boost::intrusive_ptr< SHAMapItem const > tx_
The SHAMapItem that represents the transaction.
ID const & id() const
The unique identifier/hash of the transaction.
Represents a set of transactions in RCLConsensus.
std::shared_ptr< SHAMap > map_
The SHAMap representing the transactions.
ID id() const
The unique ID/hash of the transaction set.
Wraps a ledger instance for use in generic Validations LedgerTrie.
beast::Journal journal() const
Collects logging information.
std::unique_ptr< std::stringstream > const & ss()
std::chrono::steady_clock::time_point start_
RclConsensusLogger(char const *label, bool validating, beast::Journal j)
std::unique_ptr< std::stringstream > ss_
Slice slice() const noexcept
std::size_t getNodesAfter(Ledger const &ledger, ID const &ledgerID)
Count the number of current trusted validators working on a ledger after the specified one.
Adaptor const & adaptor() const
Return the adaptor instance.
std::optional< std::pair< Seq, ID > > getPreferred(Ledger const &curr)
Return the sequence number and ID of the preferred working ledger.
Validator keys and manifest as set in configuration file.
std::optional< Keys > keys
T emplace_back(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::chrono::time_point< Clock, Duration > effCloseTime(std::chrono::time_point< Clock, Duration > closeTime, std::chrono::duration< Rep, Period > resolution, std::chrono::time_point< Clock, Duration > priorCloseTime)
Calculate the effective ledger close time.
ConsensusMode
Represents how a node currently participates in Consensus.
@ wrongLedger
We have the wrong ledger and are attempting to acquire it.
@ proposing
We are normal participant in consensus and propose our position.
@ observing
We are observing peer positions, but not proposing our position.
csprng_engine & crypto_prng()
The default cryptographically secure PRNG.
boost::intrusive_ptr< SHAMapItem > make_shamapitem(uint256 const &tag, Slice data)
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
std::string to_string(base_uint< Bits, Tag > const &a)
Rules makeRulesGivenLedger(DigestAwareReadView const &ledger, Rules const ¤t)
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
std::enable_if_t< std::is_integral< Integral >::value, Integral > rand_int()
@ MovedOn
The network has consensus without us.
@ Yes
We have consensus along with the network.
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
std::shared_ptr< Ledger > buildLedger(std::shared_ptr< Ledger const > const &parent, NetClock::time_point closeTime, bool const closeTimeCorrect, NetClock::duration closeResolution, Application &app, CanonicalTXSet &txns, std::set< TxID > &failedTxs, beast::Journal j)
Build a new ledger by applying consensus transactions.
Buffer signDigest(PublicKey const &pk, SecretKey const &sk, uint256 const &digest)
Generate a signature for a message digest.
@ ledgerMaster
ledger master data for signing
@ proposal
proposal for signing
uint256 proposalUniqueId(uint256 const &proposeHash, uint256 const &previousLedger, std::uint32_t proposeSeq, NetClock::time_point closeTime, Slice const &publicKey, Slice const &signature)
Calculate a unique identifier for a signed proposal.
void handleNewValidation(Application &app, std::shared_ptr< STValidation > const &val, std::string const &source, BypassAccept const bypassAccept, std::optional< beast::Journal > j)
Handle a new validation.
void Rethrow()
Rethrow the exception currently being handled.
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)
@ CONNECTED
convinced we are talking to the network
@ FULL
we have the ledger and can even validate
bool isPseudoTx(STObject const &tx)
Check whether a transaction is a pseudo-transaction.
@ accepted
Manifest is valid.
Stores the set of initial close times.
NetClock::time_point self
Our close time estimate.
std::map< NetClock::time_point, int > peers
Close time estimates, keep ordered for predictable traverse.
Encapsulates the result of consensus.
TxSet_t txns
The set of transactions consensus agrees go in the ledger.
hash_map< typename Tx_t::ID, Dispute_t > disputes
Transactions which are under dispute with our peers.
Proposal_t position
Our proposed position on transactions/close time.
Sends a message to all peers.