Bitcoin ABC 0.30.9
P2P Digital Currency
processor.h
Go to the documentation of this file.
1// Copyright (c) 2018-2019 The Bitcoin developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#ifndef BITCOIN_AVALANCHE_PROCESSOR_H
6#define BITCOIN_AVALANCHE_PROCESSOR_H
7
8#include <avalanche/config.h>
9#include <avalanche/node.h>
10#include <avalanche/proof.h>
12#include <avalanche/protocol.h>
14#include <avalanche/voterecord.h> // For AVALANCHE_MAX_INFLIGHT_POLL
15#include <blockindex.h>
17#include <common/bloom.h>
18#include <eventloop.h>
19#include <interfaces/chain.h>
20#include <interfaces/handler.h>
21#include <key.h>
22#include <net.h>
24#include <rwcollection.h>
25#include <util/variant.h>
26#include <validationinterface.h>
27
28#include <boost/multi_index/composite_key.hpp>
29#include <boost/multi_index/hashed_index.hpp>
30#include <boost/multi_index/member.hpp>
31#include <boost/multi_index/ordered_index.hpp>
32#include <boost/multi_index_container.hpp>
33
34#include <atomic>
35#include <chrono>
36#include <cstdint>
37#include <memory>
38#include <unordered_map>
39#include <variant>
40#include <vector>
41
42class ArgsManager;
43class CConnman;
44class CNode;
45class CScheduler;
46class Config;
47class PeerManager;
48struct bilingual_str;
49
53static constexpr size_t AVALANCHE_MAX_ELEMENT_POLL = 16;
54
59static constexpr size_t AVALANCHE_CONTENDER_MAX_POLLABLE = 12;
60
64static constexpr std::chrono::milliseconds AVALANCHE_DEFAULT_QUERY_TIMEOUT{
65 10000};
66
77
78namespace avalanche {
79
80class Delegation;
81class PeerManager;
82class ProofRegistrationState;
83struct VoteRecord;
84
85enum struct VoteStatus : uint8_t {
86 Invalid,
90 Stale,
91};
92
94 std::variant<const ProofRef, const CBlockIndex *, const CTransactionRef>;
95
99
100public:
102 : item(std::move(itemIn)), status(statusIn) {}
103
104 const VoteStatus &getStatus() const { return status; }
105 const AnyVoteItem &getVoteItem() const { return item; }
106};
107
109 bool operator()(const AnyVoteItem &lhs, const AnyVoteItem &rhs) const {
110 // If the variants are of different types, sort them by variant index
111 if (lhs.index() != rhs.index()) {
112 return lhs.index() < rhs.index();
113 }
114
115 return std::visit(
117 [](const ProofRef &lhs, const ProofRef &rhs) {
118 return ProofComparatorByScore()(lhs, rhs);
119 },
120 [](const CBlockIndex *lhs, const CBlockIndex *rhs) {
121 // Reverse ordering so we get the highest work first
122 return CBlockIndexWorkComparator()(rhs, lhs);
123 },
124 [](const CTransactionRef &lhs, const CTransactionRef &rhs) {
125 return lhs->GetId() < rhs->GetId();
126 },
127 [](const auto &lhs, const auto &rhs) {
128 // This serves 2 purposes:
129 // - This makes sure that we don't forget to implement a
130 // comparison case when adding a new variant type.
131 // - This avoids having to write all the cross type cases
132 // which are already handled by the index sort above.
133 // Because the compiler has no way to determine that, we
134 // cannot use static assertions here without having to
135 // define the whole type matrix also.
136 assert(false);
137 // Return any bool, it's only there to make the compiler
138 // happy.
139 return false;
140 },
141 },
142 lhs, rhs);
143 }
144};
145using VoteMap = std::map<AnyVoteItem, VoteRecord, VoteMapComparator>;
146
148
149namespace {
150 struct AvalancheTest;
151}
152
153// FIXME Implement a proper notification handler for node disconnection instead
154// of implementing the whole NetEventsInterface for a single interesting event.
155class Processor final : public NetEventsInterface {
160
165
169 std::atomic<uint64_t> round;
170
175 std::unique_ptr<PeerManager> peerManager GUARDED_BY(cs_peerManager);
176
177 struct Query {
179 uint64_t round;
181
188 mutable std::vector<CInv> invs;
189 };
190
191 using QuerySet = boost::multi_index_container<
192 Query,
193 boost::multi_index::indexed_by<
194 // index by nodeid/round
195 boost::multi_index::hashed_unique<boost::multi_index::composite_key<
196 Query,
197 boost::multi_index::member<Query, NodeId, &Query::nodeid>,
198 boost::multi_index::member<Query, uint64_t, &Query::round>>>,
199 // sorted by timeout
200 boost::multi_index::ordered_non_unique<
201 boost::multi_index::tag<query_timeout>,
202 boost::multi_index::member<Query, SteadyMilliseconds,
203 &Query::timeout>>>>;
204
206
208 struct PeerData;
209 std::unique_ptr<PeerData> peerData;
211
214
220 std::atomic<bool> quorumIsEstablished{false};
221 std::atomic<bool> m_canShareLocalProof{false};
223 std::atomic<int64_t> avaproofsNodeCounter{0};
224
226 const uint32_t staleVoteThreshold;
227 const uint32_t staleVoteFactor;
228
231 std::unique_ptr<interfaces::Handler> chainNotificationsHandler;
232
234 const CBlockIndex *finalizationTip GUARDED_BY(cs_finalizationTip){nullptr};
235
241 std::unordered_set<NodeId>
242 delayedAvahelloNodeIds GUARDED_BY(cs_delayedAvahelloNodeIds);
243
246 // Ordered list of acceptable winners, only the first is used for mining
247 std::vector<std::pair<ProofId, CScript>> winners;
248 };
249
251 std::unordered_map<BlockHash, StakingReward, SaltedUint256Hasher>
253
256
259 CScheduler &scheduler, std::unique_ptr<PeerData> peerDataIn,
260 CKey sessionKeyIn, uint32_t minQuorumTotalScoreIn,
261 double minQuorumConnectedScoreRatioIn,
262 int64_t minAvaproofsNodeCountIn, uint32_t staleVoteThresholdIn,
263 uint32_t staleVoteFactorIn, Amount stakeUtxoDustThresholdIn,
264 bool preConsensus, bool stakingPreConsensus);
265
266public:
267 const bool m_preConsensus{false};
268 const bool m_stakingPreConsensus{false};
269
270 ~Processor();
271
272 static std::unique_ptr<Processor>
273 MakeProcessor(const ArgsManager &argsman, interfaces::Chain &chain,
275 CTxMemPool *mempoolIn, CScheduler &scheduler,
277
278 bool addToReconcile(const AnyVoteItem &item)
285 bool reconcileOrFinalize(const ProofRef &proof)
287 bool isAccepted(const AnyVoteItem &item) const;
288 int getConfidence(const AnyVoteItem &item) const;
289
290 bool isRecentlyFinalized(const uint256 &itemId) const
293
294 // TODO: Refactor the API to remove the dependency on avalanche/protocol.h
295 void sendResponse(CNode *pfrom, Response response) const;
296 bool registerVotes(NodeId nodeid, const Response &response,
297 std::vector<VoteItemUpdate> &updates, int &banscore,
298 std::string &error)
301
302 template <typename Callable>
303 auto withPeerManager(Callable &&func) const
306 return func(*peerManager);
307 }
308
316 bool sendHello(CNode *pfrom)
320
321 ProofRef getLocalProof() const;
323
324 /*
325 * Return whether the avalanche service flag should be set.
326 */
328
332 return finalizationTip != nullptr;
333 }
334
335 bool startEventLoop(CScheduler &scheduler);
336 bool stopEventLoop();
337
340 int64_t getAvaproofsNodeCounter() const {
341 return avaproofsNodeCounter.load();
342 }
346 bool canShareLocalProof();
347
348 bool computeStakingReward(const CBlockIndex *pindex)
351 bool eraseStakingRewardWinner(const BlockHash &prevBlockHash)
353 void cleanupStakingRewards(const int minHeight)
356 const BlockHash &prevBlockHash,
357 std::vector<std::pair<ProofId, CScript>> &winners) const
359 bool getStakingRewardWinners(const BlockHash &prevBlockHash,
360 std::vector<CScript> &payouts) const
362 bool setStakingRewardWinners(const CBlockIndex *pprev,
363 const std::vector<CScript> &payouts)
365
366 // Implement NetEventInterface. Only FinalizeNode is of interest.
367 void InitializeNode(const ::Config &config, CNode &pnode,
368 ServiceFlags our_services) override {}
369 bool ProcessMessages(const ::Config &config, CNode *pnode,
370 std::atomic<bool> &interrupt) override {
371 return false;
372 }
373 bool SendMessages(const ::Config &config, CNode *pnode) override {
374 return false;
375 }
376
378 void FinalizeNode(const ::Config &config,
379 const CNode &node) override LOCKS_EXCLUDED(cs_main)
381
383 void addStakeContender(const ProofRef &proof)
385 int getStakeContenderStatus(const StakeContenderId &contenderId) const
387
392
393private:
394 void updatedBlockTip()
400 void runEventLoop()
404 std::vector<CInv> getInvsForNextPoll(bool forPoll = true)
406 bool sendHelloInternal(CNode *pfrom)
408 AnyVoteItem getVoteItemFromInv(const CInv &inv) const
410
416
425 100, 0.0000001};
426
439
442
443 IsWorthPolling(const Processor &_processor) : processor(_processor){};
444
445 bool operator()(const CBlockIndex *pindex) const
447 bool operator()(const ProofRef &proof) const
449 bool operator()(const CTransactionRef &tx) const;
450 };
451 bool isWorthPolling(const AnyVoteItem &item) const
453
456
457 GetLocalAcceptance(const Processor &_processor)
458 : processor(_processor){};
459
460 bool operator()(const CBlockIndex *pindex) const
462 bool operator()(const ProofRef &proof) const
464 bool operator()(const CTransactionRef &tx) const;
465 };
466 bool getLocalAcceptance(const AnyVoteItem &item) const {
467 return std::visit(GetLocalAcceptance(*this), item);
468 }
469
470 friend struct ::avalanche::AvalancheTest;
471};
472
473} // namespace avalanche
474
475#endif // BITCOIN_AVALANCHE_PROCESSOR_H
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: blockindex.h:25
Definition: net.h:856
Inv(ventory) message data.
Definition: protocol.h:581
An encapsulated secp256k1 private key.
Definition: key.h:28
Information about a peer.
Definition: net.h:460
An encapsulated public key.
Definition: pubkey.h:31
RollingBloomFilter is a probabilistic "keep track of most recently inserted" set.
Definition: bloom.h:115
Simple class for background tasks that should be run periodically or once "after a while".
Definition: scheduler.h:41
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition: txmempool.h:212
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:1154
Definition: config.h:19
Interface for message handling.
Definition: net.h:805
void sendResponse(CNode *pfrom, Response response) const
Definition: processor.cpp:520
const uint32_t staleVoteThreshold
Voting parameters.
Definition: processor.h:226
std::atomic< bool > quorumIsEstablished
Definition: processor.h:220
boost::multi_index_container< Query, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< boost::multi_index::composite_key< Query, boost::multi_index::member< Query, NodeId, &Query::nodeid >, boost::multi_index::member< Query, uint64_t, &Query::round > > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< query_timeout >, boost::multi_index::member< Query, SteadyMilliseconds, &Query::timeout > > > > QuerySet
Definition: processor.h:203
AnyVoteItem getVoteItemFromInv(const CInv &inv) const EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager)
Definition: processor.cpp:1293
Mutex cs_finalizedItems
Rolling bloom filter to track recently finalized inventory items of any type.
Definition: processor.h:436
bool sendHelloInternal(CNode *pfrom) EXCLUSIVE_LOCKS_REQUIRED(cs_delayedAvahelloNodeIds)
Definition: processor.cpp:691
int getConfidence(const AnyVoteItem &item) const
Definition: processor.cpp:468
bool addToReconcile(const AnyVoteItem &item) EXCLUSIVE_LOCKS_REQUIRED(!cs_finalizedItems)
Definition: processor.cpp:417
std::vector< CInv > getInvsForNextPoll(bool forPoll=true) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Definition: processor.cpp:1247
int64_t getAvaproofsNodeCounter() const
Definition: processor.h:340
RWCollection< QuerySet > queries
Definition: processor.h:205
bool hasFinalizedTip() const EXCLUSIVE_LOCKS_REQUIRED(!cs_finalizationTip)
Whether there is a finalized tip.
Definition: processor.h:330
bool ProcessMessages(const ::Config &config, CNode *pnode, std::atomic< bool > &interrupt) override
Definition: processor.h:369
Mutex cs_stakeContenderCache
Definition: processor.h:254
bool registerVotes(NodeId nodeid, const Response &response, std::vector< VoteItemUpdate > &updates, int &banscore, std::string &error) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Definition: processor.cpp:527
void transactionAddedToMempool(const CTransactionRef &tx) EXCLUSIVE_LOCKS_REQUIRED(!cs_finalizedItems)
Definition: processor.cpp:1134
const CBlockIndex *finalizationTip GUARDED_BY(cs_finalizationTip)
Definition: processor.h:234
bool sendHello(CNode *pfrom) EXCLUSIVE_LOCKS_REQUIRED(!cs_delayedAvahelloNodeIds)
Send a avahello message.
Definition: processor.cpp:726
bool isRecentlyFinalized(const uint256 &itemId) const EXCLUSIVE_LOCKS_REQUIRED(!cs_finalizedItems)
Definition: processor.cpp:482
bool startEventLoop(CScheduler &scheduler)
Definition: processor.cpp:758
bool isQuorumEstablished() LOCKS_EXCLUDED(cs_main) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Definition: processor.cpp:788
void promoteStakeContendersToTip() EXCLUSIVE_LOCKS_REQUIRED(!cs_stakeContenderCache
Promote stake contender cache entries to the latest chain tip.
Definition: processor.cpp:1030
std::atomic< uint64_t > round
Keep track of peers and queries sent.
Definition: processor.h:169
static std::unique_ptr< Processor > MakeProcessor(const ArgsManager &argsman, interfaces::Chain &chain, CConnman *connman, ChainstateManager &chainman, CTxMemPool *mempoolIn, CScheduler &scheduler, bilingual_str &error)
Definition: processor.cpp:219
EventLoop eventLoop
Event loop machinery.
Definition: processor.h:213
CTxMemPool * mempool
Definition: processor.h:159
int64_t minAvaproofsNodeCount
Definition: processor.h:222
const bool m_preConsensus
Definition: processor.h:267
Mutex cs_delayedAvahelloNodeIds
Definition: processor.h:236
bool setStakingRewardWinners(const CBlockIndex *pprev, const std::vector< CScript > &payouts) EXCLUSIVE_LOCKS_REQUIRED(!cs_stakingRewards
Definition: processor.cpp:974
void runEventLoop() EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Definition: processor.cpp:1140
bool isAvalancheServiceAvailable()
Definition: processor.h:327
Mutex cs_invalidatedBlocks
We don't need many blocks but a low false positive rate.
Definition: processor.h:423
void updatedBlockTip() EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Definition: processor.cpp:1082
RWCollection< VoteMap > voteRecords
Items to run avalanche on.
Definition: processor.h:164
std::unique_ptr< interfaces::Handler > chainNotificationsHandler
Definition: processor.h:231
uint32_t minQuorumScore
Quorum management.
Definition: processor.h:218
void FinalizeNode(const ::Config &config, const CNode &node) override LOCKS_EXCLUDED(cs_main) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Handle removal of a node.
Definition: processor.cpp:996
bool getStakingRewardWinners(const BlockHash &prevBlockHash, std::vector< std::pair< ProofId, CScript > > &winners) const EXCLUSIVE_LOCKS_REQUIRED(!cs_stakingRewards)
Definition: processor.cpp:945
std::atomic< bool > m_canShareLocalProof
Definition: processor.h:221
void cleanupStakingRewards(const int minHeight) EXCLUSIVE_LOCKS_REQUIRED(!cs_stakingRewards
Definition: processor.cpp:926
bool isAccepted(const AnyVoteItem &item) const
Definition: processor.cpp:454
ProofRef getLocalProof() const
Definition: processor.cpp:748
void addStakeContender(const ProofRef &proof) EXCLUSIVE_LOCKS_REQUIRED(cs_main
Track votes on stake contenders.
Definition: processor.cpp:1004
void InitializeNode(const ::Config &config, CNode &pnode, ServiceFlags our_services) override
Definition: processor.h:367
bool reconcileOrFinalize(const ProofRef &proof) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Wrapper around the addToReconcile for proofs that adds back the finalization flag to the peer if it i...
Definition: processor.cpp:435
const uint32_t staleVoteFactor
Definition: processor.h:227
void sendDelayedAvahello() EXCLUSIVE_LOCKS_REQUIRED(!cs_delayedAvahelloNodeIds)
Definition: processor.cpp:731
std::unique_ptr< PeerData > peerData
Definition: processor.h:209
bool eraseStakingRewardWinner(const BlockHash &prevBlockHash) EXCLUSIVE_LOCKS_REQUIRED(!cs_stakingRewards)
Definition: processor.cpp:921
const bool m_stakingPreConsensus
Definition: processor.h:268
CConnman * connman
Definition: processor.h:157
bool isWorthPolling(const AnyVoteItem &item) const EXCLUSIVE_LOCKS_REQUIRED(!cs_finalizedItems)
Definition: processor.cpp:1378
CPubKey getSessionPubKey() const
Definition: processor.cpp:687
auto withPeerManager(Callable &&func) const EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager)
Definition: processor.h:303
std::unique_ptr< PeerManager > peerManager GUARDED_BY(cs_peerManager)
void setContenderStatusForLocalWinners(const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(!cs_stakeContenderCache
Helper to set the vote status for local winners in the contender cache.
Definition: processor.cpp:1053
Processor(Config avaconfig, interfaces::Chain &chain, CConnman *connmanIn, ChainstateManager &chainman, CTxMemPool *mempoolIn, CScheduler &scheduler, std::unique_ptr< PeerData > peerDataIn, CKey sessionKeyIn, uint32_t minQuorumTotalScoreIn, double minQuorumConnectedScoreRatioIn, int64_t minAvaproofsNodeCountIn, uint32_t staleVoteThresholdIn, uint32_t staleVoteFactorIn, Amount stakeUtxoDustThresholdIn, bool preConsensus, bool stakingPreConsensus)
Definition: processor.cpp:142
ChainstateManager & chainman
Definition: processor.h:158
std::atomic< int64_t > avaproofsNodeCounter
Definition: processor.h:223
bool SendMessages(const ::Config &config, CNode *pnode) override
Definition: processor.h:373
bool computeStakingReward(const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager
Definition: processor.cpp:881
ProofRegistrationState getLocalProofRegistrationState() const
Definition: processor.cpp:752
CRollingBloomFilter finalizedItems GUARDED_BY(cs_finalizedItems)
Definition: processor.h:437
int getStakeContenderStatus(const StakeContenderId &contenderId) const EXCLUSIVE_LOCKS_REQUIRED(!cs_stakeContenderCache
Definition: processor.cpp:1011
StakeContenderCache stakeContenderCache GUARDED_BY(cs_stakeContenderCache)
void clearTimedoutRequests() EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager)
Definition: processor.cpp:1208
std::unordered_map< BlockHash, StakingReward, SaltedUint256Hasher > stakingRewards GUARDED_BY(cs_stakingRewards)
Mutex cs_peerManager
Keep track of the peers and associated infos.
Definition: processor.h:174
bool getLocalAcceptance(const AnyVoteItem &item) const
Definition: processor.h:466
std::unordered_set< NodeId > delayedAvahelloNodeIds GUARDED_BY(cs_delayedAvahelloNodeIds)
A list of the nodes that did not get our proof announced via avahello yet because we had no inbound c...
void avaproofsSent(NodeId nodeid) LOCKS_EXCLUDED(cs_main) EXCLUSIVE_LOCKS_REQUIRED(!cs_peerManager)
Definition: processor.cpp:767
double minQuorumConnectedScoreRatio
Definition: processor.h:219
void clearFinalizedItems() EXCLUSIVE_LOCKS_REQUIRED(!cs_finalizedItems)
Definition: processor.cpp:486
Cache to track stake contenders for recent blocks.
const AnyVoteItem & getVoteItem() const
Definition: processor.h:105
VoteItemUpdate(AnyVoteItem itemIn, VoteStatus statusIn)
Definition: processor.h:101
const VoteStatus & getStatus() const
Definition: processor.h:104
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
Definition: chain.h:123
256-bit opaque blob.
Definition: uint256.h:129
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: cs_main.cpp:7
bool error(const char *fmt, const Args &...args)
Definition: logging.h:263
std::map< AnyVoteItem, VoteRecord, VoteMapComparator > VoteMap
Definition: processor.h:145
std::variant< const ProofRef, const CBlockIndex *, const CTransactionRef > AnyVoteItem
Definition: processor.h:94
Definition: init.h:28
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Definition: rcu.h:259
int64_t NodeId
Definition: nodeid.h:10
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:315
Response response
Definition: processor.cpp:497
static constexpr size_t AVALANCHE_CONTENDER_MAX_POLLABLE
Maximum number of stake contenders to poll for, leaving room for polling blocks and proofs in the sam...
Definition: processor.h:59
static constexpr std::chrono::milliseconds AVALANCHE_DEFAULT_QUERY_TIMEOUT
How long before we consider that a query timed out.
Definition: processor.h:64
static constexpr size_t AVALANCHE_MAX_ELEMENT_POLL
Maximum item that can be polled at once.
Definition: processor.h:53
static constexpr uint32_t AVALANCHE_FINALIZED_ITEMS_FILTER_NUM_ELEMENTS
The size of the finalized items filter.
Definition: processor.h:75
ServiceFlags
nServices flags.
Definition: protocol.h:335
Definition: amount.h:19
A BlockHash is a unqiue identifier for a block.
Definition: blockhash.h:13
bool operator()(const CBlockIndex *pindex) const LOCKS_EXCLUDED(cs_main)
Definition: processor.cpp:1383
GetLocalAcceptance(const Processor &_processor)
Definition: processor.h:457
IsWorthPolling(const Processor &_processor)
Definition: processor.h:443
bool operator()(const CBlockIndex *pindex) const LOCKS_EXCLUDED(cs_main)
Definition: processor.cpp:1320
SteadyMilliseconds timeout
Definition: processor.h:180
std::vector< CInv > invs
We declare this as mutable so it can be modified in the multi_index.
Definition: processor.h:188
std::vector< std::pair< ProofId, CScript > > winners
Definition: processor.h:247
Compare proofs by score, then by id in case of equality.
StakeContenderIds are unique for each block to ensure that the peer polling for their acceptance has ...
bool operator()(const AnyVoteItem &lhs, const AnyVoteItem &rhs) const
Definition: processor.h:109
Bilingual messages:
Definition: translation.h:17
#define LOCK(cs)
Definition: sync.h:306
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:56
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:55
std::chrono::time_point< std::chrono::steady_clock, std::chrono::milliseconds > SteadyMilliseconds
Definition: time.h:31
assert(!tx.IsCoinBase())
static constexpr int AVALANCHE_MAX_INFLIGHT_POLL
How many inflight requests can exist for one item.
Definition: voterecord.h:40