rippled
Loading...
Searching...
No Matches
NegativeUNLVote.h
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2020 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_MISC_NEGATIVEUNLVOTE_H_INCLUDED
21#define RIPPLE_APP_MISC_NEGATIVEUNLVOTE_H_INCLUDED
22
23#include <xrpld/app/ledger/Ledger.h>
24#include <xrpl/beast/utility/Journal.h>
25#include <xrpl/protocol/Protocol.h>
26#include <xrpl/protocol/PublicKey.h>
27#include <xrpl/protocol/UintTypes.h>
28
29#include <optional>
30
31namespace ripple {
32
33template <class Adaptor>
34class Validations;
35class RCLValidationsAdaptor;
36using RCLValidations = Validations<RCLValidationsAdaptor>;
37class SHAMap;
38namespace test {
39class NegativeUNLVoteInternal_test;
40class NegativeUNLVoteScoreTable_test;
41} // namespace test
42
46class NegativeUNLVote final
47{
48public:
55 static constexpr size_t negativeUNLLowWaterMark =
56 FLAG_LEDGER_INTERVAL * 50 / 100;
61 static constexpr size_t negativeUNLHighWaterMark =
62 FLAG_LEDGER_INTERVAL * 80 / 100;
67 static constexpr size_t negativeUNLMinLocalValsToVote =
68 FLAG_LEDGER_INTERVAL * 90 / 100;
73 static constexpr size_t newValidatorDisableSkip = FLAG_LEDGER_INTERVAL * 2;
77 static constexpr float negativeUNLMaxListed = 0.25;
78
84 ToDisable, // UNLModify Tx is to disable a validator
85 ToReEnable // UNLModify Tx is to re-enable a validator
86 };
87
95 ~NegativeUNLVote() = default;
96
109 void
110 doVoting(
111 std::shared_ptr<Ledger const> const& prevLedger,
112 hash_set<PublicKey> const& unlKeys,
113 RCLValidations& validations,
114 std::shared_ptr<SHAMap> const& initialSet);
115
123 void
124 newValidators(LedgerIndex seq, hash_set<NodeID> const& nowTrusted);
125
126private:
131
136 {
139 };
140
149 void
150 addTx(
151 LedgerIndex seq,
152 PublicKey const& vp,
153 NegativeUNLModify modify,
154 std::shared_ptr<SHAMap> const& initialSet);
155
165 NodeID
166 choose(uint256 const& randomPadData, std::vector<NodeID> const& candidates);
167
184 std::shared_ptr<Ledger const> const& prevLedger,
185 hash_set<NodeID> const& unl,
186 RCLValidations& validations);
187
197 Candidates const
199 hash_set<NodeID> const& unl,
200 hash_set<NodeID> const& negUnl,
201 hash_map<NodeID, std::uint32_t> const& scoreTable);
202
208 void
210
213};
214
215} // namespace ripple
216
217#endif
A generic endpoint for log messages.
Definition: Journal.h:59
Manager to create NegativeUNL votes.
static constexpr size_t negativeUNLHighWaterMark
An unreliable validator must have more than negativeUNLHighWaterMark validations in the last flag led...
NodeID choose(uint256 const &randomPadData, std::vector< NodeID > const &candidates)
Pick one candidate from a vector of candidates.
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...
NegativeUNLModify
A flag indicating whether a UNLModify Tx is to disable or to re-enable a validator.
void purgeNewValidators(LedgerIndex seq)
Purge validators that are not new anymore.
Candidates const 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 constexpr size_t newValidatorDisableSkip
We don't want to disable new validators immediately after adding them.
static constexpr size_t negativeUNLLowWaterMark
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 newValidators(LedgerIndex seq, hash_set< NodeID > const &nowTrusted)
Notify NegativeUNLVote that new validators are added.
static constexpr float negativeUNLMaxListed
We only want to put 25% of the UNL on the NegativeUNL.
void addTx(LedgerIndex seq, PublicKey const &vp, NegativeUNLModify modify, std::shared_ptr< SHAMap > const &initialSet)
Add a ttUNL_MODIFY Tx to the transaction set.
static constexpr size_t negativeUNLMinLocalValsToVote
The minimum number of validations of the local node for it to participate in the voting.
A public key.
Definition: PublicKey.h:62
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:26
std::uint32_t constexpr FLAG_LEDGER_INTERVAL
Definition: Ledger.h:426
Validations< RCLValidationsAdaptor > RCLValidations
Alias for RCL-specific instantiation of generic Validations.
std::vector< NodeID > toReEnableCandidates
std::vector< NodeID > toDisableCandidates