rippled
RCLConsensus.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_APP_CONSENSUS_RCLCONSENSUS_H_INCLUDED
21 #define RIPPLE_APP_CONSENSUS_RCLCONSENSUS_H_INCLUDED
22 
23 #include <ripple/app/consensus/RCLCensorshipDetector.h>
24 #include <ripple/app/consensus/RCLCxLedger.h>
25 #include <ripple/app/consensus/RCLCxPeerPos.h>
26 #include <ripple/app/consensus/RCLCxTx.h>
27 #include <ripple/app/misc/FeeVote.h>
28 #include <ripple/app/misc/NegativeUNLVote.h>
29 #include <ripple/basics/CountedObject.h>
30 #include <ripple/basics/Log.h>
31 #include <ripple/beast/utility/Journal.h>
32 #include <ripple/consensus/Consensus.h>
33 #include <ripple/core/JobQueue.h>
34 #include <ripple/overlay/Message.h>
35 #include <ripple/protocol/RippleLedgerHash.h>
36 #include <ripple/protocol/STValidation.h>
37 #include <ripple/shamap/SHAMap.h>
38 #include <atomic>
39 #include <mutex>
40 #include <set>
41 namespace ripple {
42 
43 class InboundTransactions;
44 class LocalTxs;
45 class LedgerMaster;
46 class ValidatorKeys;
47 
51 {
54  constexpr static unsigned int censorshipWarnInternal = 15;
55 
56  // Implements the Adaptor template interface required by Consensus.
57  class Adaptor
58  {
65 
66  NodeID const nodeID_;
69 
70  // A randomly selected non-zero value used to tag our validations
72 
73  // Ledger we most recently needed to acquire
76 
77  // The timestamp of the last validation we used
79 
80  // These members are queried via public accesors and are atomic for
81  // thread safety.
87 
90 
91  public:
93  using NodeID_t = NodeID;
95  using TxSet_t = RCLTxSet;
97 
99 
100  Adaptor(
101  Application& app,
102  std::unique_ptr<FeeVote>&& feeVote,
103  LedgerMaster& ledgerMaster,
104  LocalTxs& localTxs,
105  InboundTransactions& inboundTransactions,
106  ValidatorKeys const& validatorKeys,
107  beast::Journal journal);
108 
109  bool
110  validating() const
111  {
112  return validating_;
113  }
114 
117  {
118  return prevProposers_;
119  }
120 
123  {
124  return prevRoundTime_;
125  }
126 
128  mode() const
129  {
130  return mode_;
131  }
132 
139  bool
141  RCLCxLedger const& prevLedger,
142  hash_set<NodeID> const& nowTrusted);
143 
144  bool
145  haveValidated() const;
146 
148  getValidLedgerIndex() const;
149 
151  getQuorumKeys() const;
152 
154  laggards(Ledger_t::Seq const seq, hash_set<NodeKey_t>& trustedKeys)
155  const;
156 
161  bool
162  validator() const;
163 
171  void
172  updateOperatingMode(std::size_t const positions) const;
173 
176  ConsensusParms const&
177  parms() const
178  {
179  return parms_;
180  }
181 
182  private:
183  //---------------------------------------------------------------------
184  // The following members implement the generic Consensus requirements
185  // and are marked private to indicate ONLY Consensus<Adaptor> will call
186  // them (via friendship). Since they are called only from
187  // Consensus<Adaptor> methods and since RCLConsensus::consensus_ should
188  // only be accessed under lock, these will only be called under lock.
189  //
190  // In general, the idea is that there is only ONE thread that is running
191  // consensus code at anytime. The only special case is the dispatched
192  // onAccept call, which does not take a lock and relies on Consensus not
193  // changing state until a future call to startRound.
194  friend class Consensus<Adaptor>;
195 
203  boost::optional<RCLCxLedger>
204  acquireLedger(LedgerHash const& hash);
205 
210  void
211  share(RCLCxPeerPos const& peerPos);
212 
219  void
220  share(RCLCxTx const& tx);
221 
230  boost::optional<RCLTxSet>
231  acquireTxSet(RCLTxSet::ID const& setId);
232 
235  bool
236  hasOpenTransactions() const;
237 
244  proposersValidated(LedgerHash const& h) const;
245 
255  proposersFinished(RCLCxLedger const& ledger, LedgerHash const& h) const;
256 
261  void
262  propose(RCLCxPeerPos::Proposal const& proposal);
263 
268  void
269  share(RCLTxSet const& txns);
270 
282  uint256
284  uint256 ledgerID,
285  RCLCxLedger const& ledger,
287 
293  void
295 
303  Result
304  onClose(
305  RCLCxLedger const& ledger,
306  NetClock::time_point const& closeTime,
308 
321  void
322  onAccept(
323  Result const& result,
324  RCLCxLedger const& prevLedger,
325  NetClock::duration const& closeResolution,
326  ConsensusCloseTimes const& rawCloseTimes,
327  ConsensusMode const& mode,
328  Json::Value&& consensusJson);
329 
335  void
337  Result const& result,
338  RCLCxLedger const& prevLedger,
339  NetClock::duration const& closeResolution,
340  ConsensusCloseTimes const& rawCloseTimes,
341  ConsensusMode const& mode,
342  Json::Value&& consensusJson);
343 
350  void
351  notify(
352  protocol::NodeEvent ne,
353  RCLCxLedger const& ledger,
354  bool haveCorrectLCL);
355 
360  void
361  doAccept(
362  Result const& result,
363  RCLCxLedger const& prevLedger,
364  NetClock::duration closeResolution,
365  ConsensusCloseTimes const& rawCloseTimes,
366  ConsensusMode const& mode,
367  Json::Value&& consensusJson);
368 
391  buildLCL(
392  RCLCxLedger const& previousLedger,
393  CanonicalTXSet& retriableTxs,
394  NetClock::time_point closeTime,
395  bool closeTimeCorrect,
396  NetClock::duration closeResolution,
397  std::chrono::milliseconds roundTime,
398  std::set<TxID>& failedTxs);
399 
410  void
411  validate(
412  RCLCxLedger const& ledger,
413  RCLTxSet const& txns,
414  bool proposing);
415  };
416 
417 public:
419  RCLConsensus(
420  Application& app,
421  std::unique_ptr<FeeVote>&& feeVote,
422  LedgerMaster& ledgerMaster,
423  LocalTxs& localTxs,
424  InboundTransactions& inboundTransactions,
425  Consensus<Adaptor>::clock_type const& clock,
426  ValidatorKeys const& validatorKeys,
427  beast::Journal journal);
428 
429  RCLConsensus(RCLConsensus const&) = delete;
430 
431  RCLConsensus&
432  operator=(RCLConsensus const&) = delete;
433 
435  bool
436  validating() const
437  {
438  return adaptor_.validating();
439  }
440 
445  {
446  return adaptor_.prevProposers();
447  }
448 
458  {
459  return adaptor_.prevRoundTime();
460  }
461 
464  mode() const
465  {
466  return adaptor_.mode();
467  }
468 
470  phase() const
471  {
472  return consensus_.phase();
473  }
474 
477  getJson(bool full) const;
478 
482  void
483  startRound(
484  NetClock::time_point const& now,
485  RCLCxLedger::ID const& prevLgrId,
486  RCLCxLedger const& prevLgr,
487  hash_set<NodeID> const& nowUntrusted,
488  hash_set<NodeID> const& nowTrusted);
489 
491  void
492  timerEntry(NetClock::time_point const& now);
493 
495  void
496  gotTxSet(NetClock::time_point const& now, RCLTxSet const& txSet);
497 
498  // @see Consensus::prevLedgerID
500  prevLedgerID() const
501  {
503  return consensus_.prevLedgerID();
504  }
505 
507  void
508  simulate(
509  NetClock::time_point const& now,
510  boost::optional<std::chrono::milliseconds> consensusDelay);
511 
513  bool
514  peerProposal(
515  NetClock::time_point const& now,
516  RCLCxPeerPos const& newProposal);
517 
518  ConsensusParms const&
519  parms() const
520  {
521  return adaptor_.parms();
522  }
523 
524 private:
525  // Since Consensus does not provide intrinsic thread-safety, this mutex
526  // guards all calls to consensus_. adaptor_ uses atomics internally
527  // to allow concurrent access of its data members that have getters.
529 
533 };
534 } // namespace ripple
535 
536 #endif
ripple::RCLConsensus::prevLedgerID
RCLCxLedger::ID prevLedgerID() const
Definition: RCLConsensus.h:500
ripple::RCLConsensus::phase
ConsensusPhase phase() const
Definition: RCLConsensus.h:470
ripple::Application
Definition: Application.h:97
ripple::RCLConsensus::Adaptor::prevRoundTime_
std::atomic< std::chrono::milliseconds > prevRoundTime_
Definition: RCLConsensus.h:84
ripple::RCLCxPeerPos
A peer's signed, proposed position for use in RCLConsensus.
Definition: RCLCxPeerPos.h:42
ripple::RCLConsensus::Adaptor::valCookie_
const std::uint64_t valCookie_
Definition: RCLConsensus.h:71
ripple::RCLCxLedger::Seq
LedgerIndex Seq
Sequence number of a ledger.
Definition: RCLCxLedger.h:41
ripple::RCLConsensus::Adaptor::prevRoundTime
std::chrono::milliseconds prevRoundTime() const
Definition: RCLConsensus.h:122
ripple::RCLConsensus::Adaptor
Definition: RCLConsensus.h:57
ripple::RCLConsensus::getJson
Json::Value getJson(bool full) const
Definition: RCLConsensus.cpp:880
ripple::RCLConsensus::Adaptor::mode_
std::atomic< ConsensusMode > mode_
Definition: RCLConsensus.h:86
ripple::RCLConsensus::Adaptor::feeVote_
std::unique_ptr< FeeVote > feeVote_
Definition: RCLConsensus.h:60
ripple::RCLConsensus::startRound
void startRound(NetClock::time_point const &now, RCLCxLedger::ID const &prevLgrId, RCLCxLedger const &prevLgr, hash_set< NodeID > const &nowUntrusted, hash_set< NodeID > const &nowTrusted)
Adjust the set of trusted validators and kick-off the next round of consensus.
Definition: RCLConsensus.cpp:1034
ripple::NodeID
base_uint< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
Definition: UintTypes.h:59
ripple::RCLConsensus::consensus_
Consensus< Adaptor > consensus_
Definition: RCLConsensus.h:531
std::unordered_set
STL class.
std::pair
ripple::RCLConsensus::Adaptor::preStartRound
bool preStartRound(RCLCxLedger const &prevLedger, hash_set< NodeID > const &nowTrusted)
Called before kicking off a new consensus round.
Definition: RCLConsensus.cpp:944
ripple::RCLConsensus::mutex_
std::recursive_mutex mutex_
Definition: RCLConsensus.h:528
ripple::LedgerMaster
Definition: LedgerMaster.h:54
ripple::RCLConsensus::Adaptor::hasOpenTransactions
bool hasOpenTransactions() const
Whether the open ledger has any transactions.
Definition: RCLConsensus.cpp:244
ripple::Consensus
Generic implementation of consensus algorithm.
Definition: Consensus.h:283
ripple::RCLConsensus::gotTxSet
void gotTxSet(NetClock::time_point const &now, RCLTxSet const &txSet)
Definition: RCLConsensus.cpp:908
std::chrono::milliseconds
ripple::RCLConsensus::Adaptor::valSecret_
const SecretKey valSecret_
Definition: RCLConsensus.h:68
ripple::RCLConsensus::Adaptor::getPrevLedger
uint256 getPrevLedger(uint256 ledgerID, RCLCxLedger const &ledger, ConsensusMode mode)
Get the ID of the previous ledger/last closed ledger(LCL) on the network.
Definition: RCLConsensus.cpp:266
std::recursive_mutex
STL class.
std::lock_guard
STL class.
ripple::RCLConsensus::j_
const beast::Journal j_
Definition: RCLConsensus.h:532
ripple::RCLConsensus::timerEntry
void timerEntry(NetClock::time_point const &now)
Definition: RCLConsensus.cpp:892
ripple::RCLConsensus::Adaptor::nUnlVote_
NegativeUNLVote nUnlVote_
Definition: RCLConsensus.h:89
ripple::RCLConsensus::Adaptor::valPublic_
const PublicKey valPublic_
Definition: RCLConsensus.h:67
ripple::RCLConsensus::Adaptor::onClose
Result onClose(RCLCxLedger const &ledger, NetClock::time_point const &closeTime, ConsensusMode mode)
Close the open ledger and return initial consensus position.
Definition: RCLConsensus.cpp:288
ripple::ConsensusResult
Encapsulates the result of consensus.
Definition: ConsensusTypes.h:201
ripple::RCLConsensus::Adaptor::parms
ConsensusParms const & parms() const
Consensus simulation parameters.
Definition: RCLConsensus.h:177
ripple::ValidatorKeys
Validator keys and manifest as set in configuration file.
Definition: ValidatorKeys.h:36
ripple::CanonicalTXSet
Holds transactions which were deferred to the next pass of consensus.
Definition: CanonicalTXSet.h:37
ripple::RCLConsensus::Adaptor::doAccept
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.
Definition: RCLConsensus.cpp:432
ripple::RCLConsensus::RCLConsensus
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.
Definition: RCLConsensus.cpp:52
ripple::RCLConsensus::Adaptor::onAccept
void onAccept(Result const &result, RCLCxLedger const &prevLedger, NetClock::duration const &closeResolution, ConsensusCloseTimes const &rawCloseTimes, ConsensusMode const &mode, Json::Value &&consensusJson)
Process the accepted ledger.
Definition: RCLConsensus.cpp:403
ripple::ConsensusMode::observing
@ observing
We are observing peer positions, but not proposing our position.
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:73
ripple::RCLConsensus::Adaptor::updateOperatingMode
void updateOperatingMode(std::size_t const positions) const
Update operating mode based on current peer positions.
Definition: RCLConsensus.cpp:1027
ripple::RCLConsensus
Manages the generic consensus algorithm for use by the RCL.
Definition: RCLConsensus.h:50
ripple::RCLConsensus::Adaptor::haveValidated
bool haveValidated() const
Definition: RCLConsensus.cpp:995
ripple::RCLConsensus::Adaptor::prevProposers
std::size_t prevProposers() const
Definition: RCLConsensus.h:116
ripple::RCLConsensus::Adaptor::laggards
std::size_t laggards(Ledger_t::Seq const seq, hash_set< NodeKey_t > &trustedKeys) const
Definition: RCLConsensus.cpp:1013
ripple::RCLConsensus::Adaptor::share
void share(RCLCxPeerPos const &peerPos)
Share the given proposal with all peers.
Definition: RCLConsensus.cpp:140
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::RCLConsensus::peerProposal
bool peerProposal(NetClock::time_point const &now, RCLCxPeerPos const &newProposal)
Definition: RCLConsensus.cpp:935
ripple::RCLTxSet
Represents a set of transactions in RCLConsensus.
Definition: RCLCxTx.h:65
ripple::RCLConsensus::Adaptor::validate
void validate(RCLCxLedger const &ledger, RCLTxSet const &txns, bool proposing)
Validate the given ledger and share with peers as necessary.
Definition: RCLConsensus.cpp:778
ripple::RCLConsensus::Adaptor::mode
ConsensusMode mode() const
Definition: RCLConsensus.h:128
ripple::ConsensusPhase
ConsensusPhase
Phases of consensus for a single ledger round.
Definition: ConsensusTypes.h:103
ripple::RCLConsensus::Adaptor::Adaptor
Adaptor(Application &app, std::unique_ptr< FeeVote > &&feeVote, LedgerMaster &ledgerMaster, LocalTxs &localTxs, InboundTransactions &inboundTransactions, ValidatorKeys const &validatorKeys, beast::Journal journal)
Definition: RCLConsensus.cpp:75
std::chrono::time_point
ripple::RCLConsensus::mode
ConsensusMode mode() const
Definition: RCLConsensus.h:464
ripple::LocalTxs
Definition: LocalTxs.h:33
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::RCLConsensus::Adaptor::acquireLedger
boost::optional< RCLCxLedger > acquireLedger(LedgerHash const &hash)
Attempt to acquire a specific ledger.
Definition: RCLConsensus.cpp:105
std::uint64_t
ripple::RCLConsensus::Adaptor::censorshipDetector_
RCLCensorshipDetector< TxID, LedgerIndex > censorshipDetector_
Definition: RCLConsensus.h:88
ripple::SecretKey
A secret key.
Definition: SecretKey.h:36
atomic
ripple::RCLConsensus::Adaptor::notify
void notify(protocol::NodeEvent ne, RCLCxLedger const &ledger, bool haveCorrectLCL)
Notify peers of a consensus state change.
Definition: RCLConsensus.cpp:698
ripple::RCLConsensus::adaptor_
Adaptor adaptor_
Definition: RCLConsensus.h:530
ripple::RCLConsensus::Adaptor::validator
bool validator() const
Whether I am a validator.
Definition: RCLConsensus.cpp:1021
ripple::RCLConsensus::parms
ConsensusParms const & parms() const
Definition: RCLConsensus.h:519
ripple::RCLConsensus::Adaptor::parms_
ConsensusParms parms_
Definition: RCLConsensus.h:75
beast::abstract_clock< std::chrono::steady_clock >
ripple::RCLConsensus::Adaptor::j_
const beast::Journal j_
Definition: RCLConsensus.h:64
ripple::RCLConsensus::Adaptor::buildLCL
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.
Definition: RCLConsensus.cpp:737
ripple::RCLConsensus::censorshipWarnInternal
constexpr static unsigned int censorshipWarnInternal
Warn for transactions that haven't been included every so many ledgers.
Definition: RCLConsensus.h:54
ripple::RCLConsensus::Adaptor::onModeChange
void onModeChange(ConsensusMode before, ConsensusMode after)
Notified of change in consensus mode.
Definition: RCLConsensus.cpp:864
ripple::RCLCxLedger
Represents a ledger in RCLConsensus.
Definition: RCLCxLedger.h:35
ripple::RCLConsensus::operator=
RCLConsensus & operator=(RCLConsensus const &)=delete
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::RCLConsensus::prevRoundTime
std::chrono::milliseconds prevRoundTime() const
Get duration of the previous round.
Definition: RCLConsensus.h:457
ripple::ConsensusMode
ConsensusMode
Represents how a node currently participates in Consensus.
Definition: ConsensusTypes.h:55
ripple::RCLConsensus::Adaptor::getValidLedgerIndex
LedgerIndex getValidLedgerIndex() const
Definition: RCLConsensus.cpp:1001
ripple::RCLCensorshipDetector
Definition: RCLCensorshipDetector.h:32
ripple::ConsensusParms
Consensus algorithm parameters.
Definition: ConsensusParms.h:33
ripple::RCLConsensus::Adaptor::acquiringLedger_
LedgerHash acquiringLedger_
Definition: RCLConsensus.h:74
ripple::RCLConsensus::Adaptor::acquireTxSet
boost::optional< RCLTxSet > acquireTxSet(RCLTxSet::ID const &setId)
Acquire the transaction set associated with a proposal.
Definition: RCLConsensus.cpp:234
ripple::RCLConsensus::Adaptor::validating_
std::atomic< bool > validating_
Definition: RCLConsensus.h:82
ripple::RCLConsensus::prevProposers
std::size_t prevProposers() const
Get the number of proposing peers that participated in the previous round.
Definition: RCLConsensus.h:444
ripple::RCLConsensus::Adaptor::ledgerMaster_
LedgerMaster & ledgerMaster_
Definition: RCLConsensus.h:61
ripple::RCLConsensus::Adaptor::proposersValidated
std::size_t proposersValidated(LedgerHash const &h) const
Number of proposers that have validated the given ledger.
Definition: RCLConsensus.cpp:250
mutex
ripple::after
static bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: Escrow.cpp:88
std::size_t
ripple::NegativeUNLVote
Manager to create NegativeUNL votes.
Definition: NegativeUNLVote.h:46
ripple::RCLConsensus::Adaptor::inboundTransactions_
InboundTransactions & inboundTransactions_
Definition: RCLConsensus.h:63
ripple::RCLConsensus::validating
bool validating() const
Whether we are validating consensus ledgers.
Definition: RCLConsensus.h:436
ripple::RCLCxTx
Represents a transaction in RCLConsensus.
Definition: RCLCxTx.h:35
ripple::RCLConsensus::Adaptor::app_
Application & app_
Definition: RCLConsensus.h:59
std::unique_ptr
STL class.
ripple::RCLConsensus::Adaptor::propose
void propose(RCLCxPeerPos::Proposal const &proposal)
Propose the given position to my peers.
Definition: RCLConsensus.cpp:185
ripple::RCLConsensus::Adaptor::localTxs_
LocalTxs & localTxs_
Definition: RCLConsensus.h:62
ripple::RCLConsensus::Adaptor::lastValidationTime_
NetClock::time_point lastValidationTime_
Definition: RCLConsensus.h:78
ripple::RCLConsensus::Adaptor::nodeID_
const NodeID nodeID_
Definition: RCLConsensus.h:66
ripple::RCLConsensus::Adaptor::proposersFinished
std::size_t proposersFinished(RCLCxLedger const &ledger, LedgerHash const &h) const
Number of proposers that have validated a ledger descended from requested ledger.
Definition: RCLConsensus.cpp:256
ripple::RCLConsensus::Adaptor::prevProposers_
std::atomic< std::size_t > prevProposers_
Definition: RCLConsensus.h:83
ripple::RCLConsensus::Adaptor::onForceAccept
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.
Definition: RCLConsensus.cpp:385
set
ripple::RCLConsensus::Adaptor::getQuorumKeys
std::pair< std::size_t, hash_set< NodeKey_t > > getQuorumKeys() const
Definition: RCLConsensus.cpp:1007
ripple::RCLConsensus::Adaptor::validating
bool validating() const
Definition: RCLConsensus.h:110
ripple::ConsensusCloseTimes
Stores the set of initial close times.
Definition: ConsensusTypes.h:174
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::InboundTransactions
Manages the acquisition and lifetime of transaction sets.
Definition: InboundTransactions.h:36
ripple::RCLConsensus::simulate
void simulate(NetClock::time_point const &now, boost::optional< std::chrono::milliseconds > consensusDelay)
Definition: RCLConsensus.cpp:926
ripple::ConsensusProposal< NodeID, uint256, uint256 >