Changeset View
Changeset View
Standalone View
Standalone View
src/avalanche/proof.cpp
Show All 11 Lines | |||||
#include <util/strencodings.h> | #include <util/strencodings.h> | ||||
#include <tinyformat.h> | #include <tinyformat.h> | ||||
#include <unordered_set> | #include <unordered_set> | ||||
namespace avalanche { | namespace avalanche { | ||||
void Stake::computeStakeId() { | |||||
CHashWriter ss(SER_GETHASH, 0); | |||||
ss << *this; | |||||
stakeid = StakeId(ss.GetHash()); | |||||
} | |||||
uint256 Stake::getHash(const ProofId &proofid) const { | uint256 Stake::getHash(const ProofId &proofid) const { | ||||
CHashWriter ss(SER_GETHASH, 0); | CHashWriter ss(SER_GETHASH, 0); | ||||
ss << proofid; | ss << proofid; | ||||
ss << *this; | ss << *this; | ||||
return ss.GetHash(); | return ss.GetHash(); | ||||
} | } | ||||
bool SignedStake::verify(const ProofId &proofid) const { | bool SignedStake::verify(const ProofId &proofid) const { | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | bool Proof::verify(ProofValidationState &state) const { | ||||
} | } | ||||
if (stakes.size() > AVALANCHE_MAX_PROOF_STAKES) { | if (stakes.size() > AVALANCHE_MAX_PROOF_STAKES) { | ||||
return state.Invalid( | return state.Invalid( | ||||
ProofValidationResult::TOO_MANY_UTXOS, "too-many-utxos", | ProofValidationResult::TOO_MANY_UTXOS, "too-many-utxos", | ||||
strprintf("%u > %u", stakes.size(), AVALANCHE_MAX_PROOF_STAKES)); | strprintf("%u > %u", stakes.size(), AVALANCHE_MAX_PROOF_STAKES)); | ||||
} | } | ||||
StakeId prevId = uint256::ZERO; | |||||
std::unordered_set<COutPoint, SaltedOutpointHasher> utxos; | std::unordered_set<COutPoint, SaltedOutpointHasher> utxos; | ||||
for (const SignedStake &ss : stakes) { | for (const SignedStake &ss : stakes) { | ||||
const Stake &s = ss.getStake(); | const Stake &s = ss.getStake(); | ||||
if (s.getAmount() < PROOF_DUST_THRESHOLD) { | if (s.getAmount() < PROOF_DUST_THRESHOLD) { | ||||
return state.Invalid(ProofValidationResult::DUST_THRESOLD, | return state.Invalid(ProofValidationResult::DUST_THRESOLD, | ||||
"amount-below-dust-threshold", | "amount-below-dust-threshold", | ||||
strprintf("%s < %s", s.getAmount().ToString(), | strprintf("%s < %s", s.getAmount().ToString(), | ||||
PROOF_DUST_THRESHOLD.ToString())); | PROOF_DUST_THRESHOLD.ToString())); | ||||
} | } | ||||
if (s.getId() < prevId) { | |||||
return state.Invalid(ProofValidationResult::WRONG_STAKE_ORDERING, | |||||
"wrong-stake-ordering"); | |||||
} | |||||
prevId = s.getId(); | |||||
if (!utxos.insert(s.getUTXO()).second) { | if (!utxos.insert(s.getUTXO()).second) { | ||||
return state.Invalid(ProofValidationResult::DUPLICATE_STAKE, | return state.Invalid(ProofValidationResult::DUPLICATE_STAKE, | ||||
"duplicated-stake"); | "duplicated-stake"); | ||||
} | } | ||||
if (!ss.verify(proofid)) { | if (!ss.verify(proofid)) { | ||||
return state.Invalid(ProofValidationResult::INVALID_SIGNATURE, | return state.Invalid(ProofValidationResult::INVALID_SIGNATURE, | ||||
"invalid-signature"); | "invalid-signature"); | ||||
▲ Show 20 Lines • Show All 75 Lines • Show Last 20 Lines |