rippled
Loading...
Searching...
No Matches
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 <xrpl/basics/base_uint.h>
23#include <xrpl/basics/chrono.h>
24#include <xrpl/json/json_value.h>
25#include <xrpl/protocol/HashPrefix.h>
26#include <xrpl/protocol/jss.h>
27#include <cstdint>
28#include <optional>
29
30namespace ripple {
54template <class NodeID_t, class LedgerID_t, class Position_t>
56{
57public:
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)
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&
108 {
109 return previousLedger_;
110 }
111
121 {
122 return proposeSeq_;
123 }
124
127 closeTime() const
128 {
129 return closeTime_;
130 }
131
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&
221 {
222 if (!signingHash_)
223 {
227 closeTime().time_since_epoch().count(),
228 prevLedger(),
229 position());
230 }
231
232 return signingHash_.value();
233 }
234
235private:
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
258template <class NodeID_t, class LedgerID_t, class Position_t>
259bool
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
Represents a JSON value.
Definition: json_value.h:147
Represents a proposed position taken during a round of consensus.
void changePosition(Position_t const &newPosition, NetClock::time_point newCloseTime, NetClock::time_point now)
Update the position during the consensus process.
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.
LedgerID_t const & prevLedger() const
Get the prior accepted ledger this position is based on.
NetClock::time_point time_
bool isBowOut() const
Get whether this node left the consensus process.
uint256 const & signingHash() const
The digest for this proposal, used for signing purposes.
NetClock::time_point closeTime_
The ledger close time this position is taking.
NodeID_t const & nodeID() const
Identifying which peer took this position.
std::uint32_t proposeSeq_
The sequence number of these positions taken by this node.
std::optional< uint256 > signingHash_
The signing hash for this proposal.
static std::uint32_t const seqJoin
NetClock::time_point const & closeTime() const
The current position on the consensus close time.
LedgerID_t previousLedger_
Unique identifier of prior ledger this proposal is based on.
Json::Value getJson() const
Get JSON representation for debugging.
void bowOut(NetClock::time_point now)
Leave consensus.
static std::uint32_t const seqLeave
NodeID_t nodeID_
The identifier of the node taking this position.
Position_t position_
Unique identifier of the position this proposal is taking.
Position_t const & position() const
Get the proposed position.
NetClock::time_point const & seenTime() const
Get when this position was taken.
bool isStale(NetClock::time_point cutoff) const
Get whether this position is stale relative to the provided cutoff.
std::uint32_t proposeSeq() const
Get the sequence number of this proposal.
bool isInitial() const
Whether this is the first position taken during the current consensus round.
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:629
@ proposal
proposal for signing
constexpr bool operator==(base_uint< Bits, Tag > const &lhs, base_uint< Bits, Tag > const &rhs)
Definition: base_uint.h:584
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition: digest.h:223
T to_string(T... args)