rippled
ConsensusProposal.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012-2017 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 PROVID_tED "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 #ifndef RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED
20 #define RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED
21 
22 #include <ripple/basics/base_uint.h>
23 #include <ripple/basics/chrono.h>
24 #include <ripple/json/json_value.h>
25 #include <ripple/protocol/HashPrefix.h>
26 #include <ripple/protocol/jss.h>
27 #include <cstdint>
28 #include <optional>
29 
30 namespace ripple {
54 template <class NodeID_t, class LedgerID_t, class Position_t>
56 {
57 public:
58  using NodeID = NodeID_t;
59 
60  //< Sequence value when a peer initially joins consensus
61  static std::uint32_t const seqJoin = 0;
62 
63  //< Sequence number when a peer wants to bow out and leave consensus
64  static std::uint32_t const seqLeave = 0xffffffff;
65 
76  LedgerID_t const& prevLedger,
77  std::uint32_t seq,
78  Position_t const& position,
81  NodeID_t const& nodeID)
85  , time_(now)
86  , proposeSeq_(seq)
87  , nodeID_(nodeID)
88  {
89  }
90 
92  NodeID_t const&
93  nodeID() const
94  {
95  return nodeID_;
96  }
97 
99  Position_t const&
100  position() const
101  {
102  return position_;
103  }
104 
106  LedgerID_t const&
107  prevLedger() const
108  {
109  return previousLedger_;
110  }
111 
120  proposeSeq() const
121  {
122  return proposeSeq_;
123  }
124 
126  NetClock::time_point const&
127  closeTime() const
128  {
129  return closeTime_;
130  }
131 
133  NetClock::time_point const&
134  seenTime() const
135  {
136  return time_;
137  }
138 
142  bool
143  isInitial() const
144  {
145  return proposeSeq_ == seqJoin;
146  }
147 
149  bool
150  isBowOut() const
151  {
152  return proposeSeq_ == seqLeave;
153  }
154 
156  bool
158  {
159  return time_ <= cutoff;
160  }
161 
169  void
171  Position_t const& newPosition,
172  NetClock::time_point newCloseTime,
174  {
175  signingHash_.reset();
176  position_ = newPosition;
177  closeTime_ = newCloseTime;
178  time_ = now;
179  if (proposeSeq_ != seqLeave)
180  ++proposeSeq_;
181  }
182 
189  void
191  {
192  signingHash_.reset();
193  time_ = now;
195  }
196 
199  getJson() const
200  {
201  using std::to_string;
202 
204  ret[jss::previous_ledger] = to_string(prevLedger());
205 
206  if (!isBowOut())
207  {
208  ret[jss::transaction_hash] = to_string(position());
209  ret[jss::propose_seq] = proposeSeq();
210  }
211 
212  ret[jss::close_time] =
213  to_string(closeTime().time_since_epoch().count());
214 
215  return ret;
216  }
217 
219  uint256 const&
220  signingHash() const
221  {
222  if (!signingHash_)
223  {
227  closeTime().time_since_epoch().count(),
228  prevLedger(),
229  position());
230  }
231 
232  return signingHash_.value();
233  }
234 
235 private:
237  LedgerID_t previousLedger_;
238 
240  Position_t position_;
241 
244 
245  // !The time this position was last updated
247 
250 
252  NodeID_t nodeID_;
253 
256 };
257 
258 template <class NodeID_t, class LedgerID_t, class Position_t>
259 bool
263 {
264  return a.nodeID() == b.nodeID() && a.proposeSeq() == b.proposeSeq() &&
265  a.prevLedger() == b.prevLedger() && a.position() == b.position() &&
266  a.closeTime() == b.closeTime() && a.seenTime() == b.seenTime();
267 }
268 } // namespace ripple
269 #endif
ripple::ConsensusProposal::time_
NetClock::time_point time_
Definition: ConsensusProposal.h:246
ripple::ConsensusProposal::proposeSeq
std::uint32_t proposeSeq() const
Get the sequence number of this proposal.
Definition: ConsensusProposal.h:120
ripple::ConsensusProposal::isStale
bool isStale(NetClock::time_point cutoff) const
Get whether this position is stale relative to the provided cutoff.
Definition: ConsensusProposal.h:157
ripple::ConsensusProposal::closeTime_
NetClock::time_point closeTime_
The ledger close time this position is taking.
Definition: ConsensusProposal.h:243
ripple::ConsensusProposal::getJson
Json::Value getJson() const
Get JSON representation for debugging.
Definition: ConsensusProposal.h:199
ripple::ConsensusProposal::nodeID_
NodeID_t nodeID_
The identifier of the node taking this position.
Definition: ConsensusProposal.h:252
ripple::ConsensusProposal::seqLeave
static const std::uint32_t seqLeave
Definition: ConsensusProposal.h:64
ripple::ConsensusProposal::bowOut
void bowOut(NetClock::time_point now)
Leave consensus.
Definition: ConsensusProposal.h:190
ripple::ConsensusProposal::changePosition
void changePosition(Position_t const &newPosition, NetClock::time_point newCloseTime, NetClock::time_point now)
Update the position during the consensus process.
Definition: ConsensusProposal.h:170
ripple::operator==
bool operator==(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:165
ripple::base_uint< 256 >
ripple::ConsensusProposal::prevLedger
LedgerID_t const & prevLedger() const
Get the prior accepted ledger this position is based on.
Definition: ConsensusProposal.h:107
ripple::ConsensusProposal::ConsensusProposal
ConsensusProposal(LedgerID_t const &prevLedger, std::uint32_t seq, Position_t const &position, NetClock::time_point closeTime, NetClock::time_point now, NodeID_t const &nodeID)
Constructor.
Definition: ConsensusProposal.h:75
Json::objectValue
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
std::to_string
T to_string(T... args)
std::chrono::time_point
ripple::HashPrefix::proposal
@ proposal
proposal for signing
cstdint
std::uint32_t
ripple::ConsensusProposal::proposeSeq_
std::uint32_t proposeSeq_
The sequence number of these positions taken by this node.
Definition: ConsensusProposal.h:249
ripple::ConsensusProposal::previousLedger_
LedgerID_t previousLedger_
Unique identifier of prior ledger this proposal is based on.
Definition: ConsensusProposal.h:237
ripple::ConsensusProposal::signingHash_
std::optional< uint256 > signingHash_
The signing hash for this proposal.
Definition: ConsensusProposal.h:255
ripple::ConsensusProposal::nodeID
NodeID_t const & nodeID() const
Identifying which peer took this position.
Definition: ConsensusProposal.h:93
ripple::ConsensusProposal::closeTime
NetClock::time_point const & closeTime() const
The current position on the consensus close time.
Definition: ConsensusProposal.h:127
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
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::ConsensusProposal::isBowOut
bool isBowOut() const
Get whether this node left the consensus process.
Definition: ConsensusProposal.h:150
ripple::ConsensusProposal::seqJoin
static const std::uint32_t seqJoin
Definition: ConsensusProposal.h:61
ripple::ConsensusProposal::seenTime
NetClock::time_point const & seenTime() const
Get when this position was taken.
Definition: ConsensusProposal.h:134
ripple::ConsensusProposal::signingHash
uint256 const & signingHash() const
The digest for this proposal, used for signing purposes.
Definition: ConsensusProposal.h:220
optional
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::ConsensusProposal::position_
Position_t position_
Unique identifier of the position this proposal is taking.
Definition: ConsensusProposal.h:240
ripple::ConsensusProposal< NodeID_t, typename Ledger_t::ID, typename TxSet_t::ID >::NodeID
NodeID_t NodeID
Definition: ConsensusProposal.h:58
ripple::ConsensusProposal::position
Position_t const & position() const
Get the proposed position.
Definition: ConsensusProposal.h:100
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::ConsensusProposal::isInitial
bool isInitial() const
Whether this is the first position taken during the current consensus round.
Definition: ConsensusProposal.h:143
ripple::ConsensusProposal
Represents a proposed position taken during a round of consensus.
Definition: ConsensusProposal.h:55