Bitcoin ABC  0.26.3
P2P Digital Currency
proof.h
Go to the documentation of this file.
1 // Copyright (c) 2020 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_PROOF_H
6 #define BITCOIN_AVALANCHE_PROOF_H
7 
8 #include <avalanche/proofid.h>
9 #include <consensus/amount.h>
10 #include <key.h>
11 #include <primitives/transaction.h>
12 #include <pubkey.h>
13 #include <rcu.h>
14 #include <serialize.h>
15 #include <util/hasher.h>
16 #include <validation.h> // For ChainstateManager and cs_main
17 
18 #include <array>
19 #include <cstdint>
20 #include <optional>
21 #include <vector>
22 
23 class ArgsManager;
24 struct bilingual_str;
25 
29 static constexpr int AVALANCHE_MAX_PROOF_STAKES = 1000;
30 
35 static constexpr int AVALANCHE_DEFAULT_STAKE_UTXO_CONFIRMATIONS = 2016;
36 
37 namespace avalanche {
38 
40 static constexpr Amount PROOF_DUST_THRESHOLD = 100 * COIN;
41 
43 
44 using StakeId = uint256;
45 
46 struct StakeCommitment : public uint256 {
47  StakeCommitment(int64_t expirationTime, const CPubKey &master);
48 };
49 
50 class Stake {
52 
54  uint32_t height;
56 
58  void computeStakeId();
59 
60 public:
61  explicit Stake() = default;
62  Stake(COutPoint utxo_, Amount amount_, uint32_t height_, bool is_coinbase,
63  CPubKey pubkey_)
64  : utxo(utxo_), amount(amount_), height(height_ << 1 | is_coinbase),
65  pubkey(std::move(pubkey_)) {
67  }
68 
70  READWRITE(obj.utxo, obj.amount, obj.height, obj.pubkey);
71  SER_READ(obj, obj.computeStakeId());
72  }
73 
74  const COutPoint &getUTXO() const { return utxo; }
75  Amount getAmount() const { return amount; }
76  uint32_t getHeight() const { return height >> 1; }
77  bool isCoinbase() const { return height & 1; }
78  const CPubKey &getPubkey() const { return pubkey; }
79 
80  uint256 getHash(const StakeCommitment &commitment) const;
81 
82  const StakeId &getId() const { return stakeid; }
83 };
84 
85 class SignedStake {
88 
89 public:
90  explicit SignedStake() = default;
92  : stake(std::move(stake_)), sig(std::move(sig_)) {}
93 
94  SERIALIZE_METHODS(SignedStake, obj) { READWRITE(obj.stake, obj.sig); }
95 
96  const Stake &getStake() const { return stake; }
97  const SchnorrSig &getSignature() const { return sig; }
98 
99  bool verify(const StakeCommitment &commitment) const;
100 };
101 
102 class Proof {
103  uint64_t sequence;
104  int64_t expirationTime;
106  std::vector<SignedStake> stakes;
109 
112  void computeProofId();
113 
114  uint32_t score;
115  void computeScore();
116 
118 
119 public:
121  : sequence(0), expirationTime(0), master(), stakes(),
123 
124  Proof(uint64_t sequence_, int64_t expirationTime_, CPubKey master_,
125  std::vector<SignedStake> stakes_, const CScript &payoutScriptPubKey_,
126  SchnorrSig signature_)
127  : sequence(sequence_), expirationTime(expirationTime_),
128  master(std::move(master_)), stakes(std::move(stakes_)),
129  payoutScriptPubKey(payoutScriptPubKey_),
130  signature(std::move(signature_)) {
131  computeProofId();
132  computeScore();
133  }
134  Proof(Proof &&other)
136  master(std::move(other.master)), stakes(std::move(other.stakes)),
138  signature(std::move(other.signature)),
139  limitedProofId(std::move(other.limitedProofId)),
140  proofid(std::move(other.proofid)), score(other.score) {}
141 
145  template <typename Stream> Proof(deserialize_type, Stream &s) {
146  Unserialize(s);
147  }
148 
150  READWRITE(obj.sequence, obj.expirationTime, obj.master, obj.stakes);
151  READWRITE(obj.payoutScriptPubKey, obj.signature);
152  SER_READ(obj, obj.computeProofId());
153  SER_READ(obj, obj.computeScore());
154  }
155 
156  static bool FromHex(Proof &proof, const std::string &hexProof,
157  bilingual_str &errorOut);
158  std::string ToHex() const;
159 
160  static uint32_t amountToScore(Amount amount);
161 
162  uint64_t getSequence() const { return sequence; }
163  int64_t getExpirationTime() const { return expirationTime; }
164  const CPubKey &getMaster() const { return master; }
165  const std::vector<SignedStake> &getStakes() const { return stakes; }
166  const CScript &getPayoutScript() const { return payoutScriptPubKey; }
167  const SchnorrSig &getSignature() const { return signature; }
168 
169  const ProofId &getId() const { return proofid; }
170  const LimitedProofId &getLimitedId() const { return limitedProofId; }
173  };
174  uint32_t getScore() const { return score; }
175  Amount getStakedAmount() const;
176 
177  bool verify(const Amount &stakeUtxoDustThreshold,
178  ProofValidationState &state) const;
179  bool verify(const Amount &stakeUtxoDustThreshold,
180  const ChainstateManager &chainman,
181  ProofValidationState &state) const
183 };
184 
186 
188 public:
190  size_t operator()(const ProofRef &proof) const {
191  return hash(proof->getId());
192  }
193 };
194 
195 } // namespace avalanche
196 
197 #endif // BITCOIN_AVALANCHE_PROOF_H
static constexpr Amount COIN
Definition: amount.h:144
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:20
An encapsulated public key.
Definition: pubkey.h:31
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:431
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:1142
size_t hash(const uint256 &h) const
Definition: hasher.h:23
int64_t getExpirationTime() const
Definition: proof.h:163
static bool FromHex(Proof &proof, const std::string &hexProof, bilingual_str &errorOut)
Definition: proof.cpp:51
const ProofId & getId() const
Definition: proof.h:169
const std::vector< SignedStake > & getStakes() const
Definition: proof.h:165
IMPLEMENT_RCU_REFCOUNT(uint64_t)
bool verify(const Amount &stakeUtxoDustThreshold, ProofValidationState &state) const
Definition: proof.cpp:119
int64_t expirationTime
Definition: proof.h:104
void computeProofId()
Definition: proof.cpp:76
Proof(uint64_t sequence_, int64_t expirationTime_, CPubKey master_, std::vector< SignedStake > stakes_, const CScript &payoutScriptPubKey_, SchnorrSig signature_)
Definition: proof.h:124
Amount getStakedAmount() const
Definition: proof.cpp:104
CScript payoutScriptPubKey
Definition: proof.h:107
std::string ToHex() const
Definition: proof.cpp:70
const StakeCommitment getStakeCommitment() const
Definition: proof.h:171
uint64_t getSequence() const
Definition: proof.h:162
void computeScore()
Definition: proof.cpp:91
const CScript & getPayoutScript() const
Definition: proof.h:166
LimitedProofId limitedProofId
Definition: proof.h:110
uint64_t sequence
Definition: proof.h:103
const CPubKey & getMaster() const
Definition: proof.h:164
uint32_t score
Definition: proof.h:114
std::vector< SignedStake > stakes
Definition: proof.h:106
const SchnorrSig & getSignature() const
Definition: proof.h:167
CPubKey master
Definition: proof.h:105
Proof(Proof &&other)
Definition: proof.h:134
Proof(deserialize_type, Stream &s)
Deserialization constructor.
Definition: proof.h:145
uint32_t getScore() const
Definition: proof.h:174
const LimitedProofId & getLimitedId() const
Definition: proof.h:170
ProofId proofid
Definition: proof.h:111
SERIALIZE_METHODS(Proof, obj)
Definition: proof.h:149
SchnorrSig signature
Definition: proof.h:108
static uint32_t amountToScore(Amount amount)
Definition: proof.cpp:100
size_t operator()(const ProofRef &proof) const
Definition: proof.h:190
SchnorrSig sig
Definition: proof.h:87
bool verify(const StakeCommitment &commitment) const
Definition: proof.cpp:47
SignedStake(Stake stake_, SchnorrSig sig_)
Definition: proof.h:91
const SchnorrSig & getSignature() const
Definition: proof.h:97
SERIALIZE_METHODS(SignedStake, obj)
Definition: proof.h:94
const Stake & getStake() const
Definition: proof.h:96
Stake(COutPoint utxo_, Amount amount_, uint32_t height_, bool is_coinbase, CPubKey pubkey_)
Definition: proof.h:62
uint256 getHash(const StakeCommitment &commitment) const
Definition: proof.cpp:40
const COutPoint & getUTXO() const
Definition: proof.h:74
Amount amount
Definition: proof.h:53
const CPubKey & getPubkey() const
Definition: proof.h:78
const StakeId & getId() const
Definition: proof.h:82
Amount getAmount() const
Definition: proof.h:75
bool isCoinbase() const
Definition: proof.h:77
COutPoint utxo
Definition: proof.h:51
uint32_t getHeight() const
Definition: proof.h:76
StakeId stakeid
Definition: proof.h:57
SERIALIZE_METHODS(Stake, obj)
Definition: proof.h:69
CPubKey pubkey
Definition: proof.h:55
void computeStakeId()
Definition: proof.cpp:34
uint32_t height
Definition: proof.h:54
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
std::array< uint8_t, CPubKey::SCHNORR_SIZE > SchnorrSig
a Schnorr signature
Definition: key.h:25
static constexpr Amount PROOF_DUST_THRESHOLD
Minimum amount per utxo.
Definition: proof.h:40
Implement std::hash so RCUPtr can be used as a key for maps or sets.
Definition: rcu.h:257
static constexpr int AVALANCHE_DEFAULT_STAKE_UTXO_CONFIRMATIONS
Minimum number of confirmations before a stake utxo is mature enough to be included into a proof.
Definition: proof.h:35
static constexpr int AVALANCHE_MAX_PROOF_STAKES
How many UTXOs can be used for a single proof.
Definition: proof.h:29
void Unserialize(Stream &, char)=delete
#define SER_READ(obj, code)
Definition: serialize.h:169
#define READWRITE(...)
Definition: serialize.h:166
Definition: amount.h:19
StakeCommitment(int64_t expirationTime, const CPubKey &master)
Definition: proof.cpp:25
Bilingual messages:
Definition: translation.h:17
Dummy data type to identify deserializing constructors.
Definition: serialize.h:49
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:56