xrpld
Loading...
Searching...
No Matches
NegativeUNLVote.h
1#pragma once
2
3#include <xrpl/beast/utility/Journal.h>
4#include <xrpl/ledger/Ledger.h>
5#include <xrpl/protocol/Protocol.h>
6#include <xrpl/protocol/PublicKey.h>
7#include <xrpl/protocol/UintTypes.h>
8
9#include <optional>
10
11namespace xrpl {
12
13template <class Adaptor>
14class Validations;
17class SHAMap;
18namespace test {
21} // namespace test
22
26class NegativeUNLVote final
27{
28public:
35 static constexpr size_t kNegativeUnlLowWaterMark = kFlagLedgerInterval * 50 / 100;
40 static constexpr size_t kNegativeUnlHighWaterMark = kFlagLedgerInterval * 80 / 100;
45 static constexpr size_t kNegativeUnlMinLocalValsToVote = kFlagLedgerInterval * 90 / 100;
50 static constexpr size_t kNewValidatorDisableSkip = kFlagLedgerInterval * 2;
54 static constexpr float kNegativeUnlMaxListed = 0.25;
55
60 enum class NegativeUNLModify {
61 ToDisable, // UNLModify Tx is to disable a validator
62 ToReEnable // UNLModify Tx is to re-enable a validator
63 };
64
72 ~NegativeUNLVote() = default;
73
86 void
88 std::shared_ptr<Ledger const> const& prevLedger,
89 hash_set<PublicKey> const& unlKeys,
90 RCLValidations& validations,
91 std::shared_ptr<SHAMap> const& initialSet);
92
100 void
101 newValidators(LedgerIndex seq, hash_set<NodeID> const& nowTrusted);
102
103private:
108
117
126 void
127 addTx(
128 LedgerIndex seq,
129 PublicKey const& vp,
130 NegativeUNLModify modify,
131 std::shared_ptr<SHAMap> const& initialSet);
132
142 static NodeID
143 choose(uint256 const& randomPadData, std::vector<NodeID> const& candidates);
144
161 std::shared_ptr<Ledger const> const& prevLedger,
162 hash_set<NodeID> const& unl,
163 RCLValidations& validations);
164
176 hash_set<NodeID> const& unl,
177 hash_set<NodeID> const& negUnl,
178 hash_map<NodeID, std::uint32_t> const& scoreTable);
179
185 void
187
190};
191
192} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:38
void newValidators(LedgerIndex seq, hash_set< NodeID > const &nowTrusted)
Notify NegativeUNLVote that new validators are added.
static constexpr size_t kNegativeUnlHighWaterMark
An unreliable validator must have more than negativeUNLHighWaterMark validations in the last flag led...
static constexpr size_t kNegativeUnlMinLocalValsToVote
The minimum number of validations of the local node for it to participate in the voting.
Candidates findAllCandidates(hash_set< NodeID > const &unl, hash_set< NodeID > const &negUnl, hash_map< NodeID, std::uint32_t > const &scoreTable)
Process the score table and find all disabling and re-enabling candidates.
static NodeID choose(uint256 const &randomPadData, std::vector< NodeID > const &candidates)
Pick one candidate from a vector of candidates.
~NegativeUNLVote()=default
static constexpr size_t kNewValidatorDisableSkip
We don't want to disable new validators immediately after adding them.
NegativeUNLVote(NodeID const &myId, beast::Journal j)
Constructor.
void purgeNewValidators(LedgerIndex seq)
Purge validators that are not new anymore.
NegativeUNLModify
A flag indicating whether a UNLModify Tx is to disable or to re-enable a validator.
static constexpr float kNegativeUnlMaxListed
We only want to put 25% of the UNL on the NegativeUNL.
std::optional< hash_map< NodeID, std::uint32_t > > buildScoreTable(std::shared_ptr< Ledger const > const &prevLedger, hash_set< NodeID > const &unl, RCLValidations &validations)
Build a reliability measurement score table of validators' validation messages in the last flag ledge...
static constexpr size_t kNegativeUnlLowWaterMark
A validator is considered unreliable if its validations is less than negativeUNLLowWaterMark in the l...
void doVoting(std::shared_ptr< Ledger const > const &prevLedger, hash_set< PublicKey > const &unlKeys, RCLValidations &validations, std::shared_ptr< SHAMap > const &initialSet)
Cast our local vote on the NegativeUNL candidates.
hash_map< NodeID, LedgerIndex > newValidators_
void addTx(LedgerIndex seq, PublicKey const &vp, NegativeUNLModify modify, std::shared_ptr< SHAMap > const &initialSet)
Add a ttUNL_MODIFY Tx to the transaction set.
A public key.
Definition PublicKey.h:42
Generic validations adaptor class for RCL.
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
Definition SHAMap.h:77
Maintains current and recent ledger validations.
Test the private member functions of NegativeUNLVote.
Rest the build score table function of NegativeUNLVote.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
std::uint32_t LedgerIndex
A ledger index.
Definition Protocol.h:259
std::unordered_set< Value, Hash, Pred, Allocator > hash_set
Validations< RCLValidationsAdaptor > RCLValidations
Alias for RCL-specific instantiation of generic Validations.
std::unordered_map< Key, Value, Hash, Pred, Allocator > hash_map
BaseUInt< 256 > uint256
Definition base_uint.h:562
BaseUInt< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
Definition UintTypes.h:39
constexpr std::uint32_t kFlagLedgerInterval
Definition Protocol.h:261
std::vector< NodeID > toDisableCandidates
std::vector< NodeID > toReEnableCandidates