Bitcoin ABC 0.26.3
P2P Digital Currency
Loading...
Searching...
No Matches
proofcomparator.h
Go to the documentation of this file.
1// Copyright (c) 2021 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_PROOFCOMPARATOR_H
6#define BITCOIN_AVALANCHE_PROOFCOMPARATOR_H
7
8#include <avalanche/proof.h>
9
10#include <cstdint>
11#include <memory>
12
13namespace avalanche {
14
19 bool operator()(const ProofRef &lhs, const ProofRef &rhs) const {
20 return lhs.get() < rhs.get();
21 }
22};
23
28 bool operator()(const Proof &lhs, const Proof &rhs) const {
29 uint32_t scoreLhs = lhs.getScore();
30 uint32_t scoreRhs = rhs.getScore();
31
32 return (scoreLhs != scoreRhs) ? scoreLhs > scoreRhs
33 : lhs.getId() < rhs.getId();
34 }
35
36 bool operator()(const ProofRef &lhs, const ProofRef &rhs) const {
37 return (*this)(*lhs, *rhs);
38 }
39};
40
45 bool operator()(const Proof &lhs, const Proof &rhs) const {
46 // If the proof master is the same, assume the sequence number is the
47 // righteous discriminant; otherwise, use costly parameters.
48 // This is so to prevent a user participating in an aggregated proof
49 // with other users from being able to invalidate the proof for free and
50 // make the aggregation mechanism inefficient.
51 // TODO this only makes sense if the staked coins are locked.
52 if (lhs.getMaster() == rhs.getMaster()) {
53 if (lhs.getSequence() != rhs.getSequence()) {
54 return lhs.getSequence() > rhs.getSequence();
55 }
56 }
57
58 // Favor the proof which is the most likely to be selected, i.e. the one
59 // with the highest staked amount.
60 if (lhs.getScore() != rhs.getScore()) {
61 return lhs.getScore() > rhs.getScore();
62 }
63
64 // Select the proof with the least stakes, as this means the individual
65 // stakes have higher amount in average.
66 if (lhs.getStakes().size() != rhs.getStakes().size()) {
67 return lhs.getStakes().size() < rhs.getStakes().size();
68 }
69
70 // When there is no better discriminant, use the proof id which is
71 // guaranteed to be unique so equality is not possible.
72 return lhs.getId() < rhs.getId();
73 }
74
75 bool operator()(const ProofRef &lhs, const ProofRef &rhs) const {
76 return (*this)(*lhs, *rhs);
77 }
78};
79
80} // namespace avalanche
81
82#endif // BITCOIN_AVALANCHE_PROOFCOMPARATOR_H
T GetRand(T nMax=std::numeric_limits< T >::max()) noexcept
Generate a uniform random integer of type T in the range [0..nMax) nMax defaults to std::numeric_limi...
Definition random.h:85
Compare conflicting proofs.
bool operator()(const ProofRef &lhs, const ProofRef &rhs) const
bool operator()(const Proof &lhs, const Proof &rhs) const
Compare proofs by score, then by id in case of equality.
bool operator()(const Proof &lhs, const Proof &rhs) const
bool operator()(const ProofRef &lhs, const ProofRef &rhs) const
Compare proof references by pointer address.
bool operator()(const ProofRef &lhs, const ProofRef &rhs) const