Changeset View
Changeset View
Standalone View
Standalone View
src/avalanche/proofpool.cpp
// Copyright (c) 2021 The Bitcoin developers | // Copyright (c) 2021 The Bitcoin developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <avalanche/proofpool.h> | #include <avalanche/proofpool.h> | ||||
#include <avalanche/peermanager.h> | #include <avalanche/peermanager.h> | ||||
#include <avalanche/proofcomparator.h> | #include <avalanche/proofcomparator.h> | ||||
#include <util/time.h> | #include <util/time.h> | ||||
#include <algorithm> | |||||
namespace avalanche { | namespace avalanche { | ||||
ProofPool::AddProofStatus | ProofPool::AddProofStatus | ||||
ProofPool::addProofIfNoConflict(const ProofRef &proof) { | ProofPool::addProofIfNoConflict(const ProofRef &proof) { | ||||
ConflictingProofSet dummy; | ConflictingProofSet dummy; | ||||
return addProofIfNoConflict(proof, dummy); | return addProofIfNoConflict(proof, dummy); | ||||
} | } | ||||
Show All 39 Lines | |||||
ProofPool::AddProofStatus | ProofPool::AddProofStatus | ||||
ProofPool::addProofIfPreferred(const ProofRef &proof) { | ProofPool::addProofIfPreferred(const ProofRef &proof) { | ||||
ConflictingProofSet dummy; | ConflictingProofSet dummy; | ||||
return addProofIfPreferred(proof, dummy); | return addProofIfPreferred(proof, dummy); | ||||
} | } | ||||
ProofPool::AddProofStatus | ProofPool::AddProofStatus | ||||
ProofPool::addProofIfPreferred(const ProofRef &proof, | ProofPool::addProofIfPreferred(const ProofRef &proof, | ||||
ConflictingProofSet &conflictingProofs) { | ConflictingProofSet &conflictingProofs, | ||||
std::chrono::seconds cooldown) { | |||||
auto added = addProofIfNoConflict(proof, conflictingProofs); | auto added = addProofIfNoConflict(proof, conflictingProofs); | ||||
// Find the registration time of the most recently registered conflicting | |||||
// proof. | |||||
std::chrono::seconds lastConflictingRegistrationTime = | |||||
std::chrono::seconds::min(); | |||||
for (auto &conflictingProof : conflictingProofs) { | |||||
lastConflictingRegistrationTime = | |||||
std::max(lastConflictingRegistrationTime, | |||||
getRegistrationTime(conflictingProof->getId())); | |||||
} | |||||
ConflictingProofComparator compare; | ConflictingProofComparator compare; | ||||
// In case the proof was rejected due to conflict and it is the best | // In case the proof was rejected due to conflict, if it is the best | ||||
// candidate, override the conflicting ones and add it again | // candidate and the cooldown has elapsed for each UTXO, then override the | ||||
if (!added && compare(proof, *conflictingProofs.begin())) { | // conflicting ones and add it again. | ||||
if (!added && compare(proof, *conflictingProofs.begin()) && | |||||
GetTime<std::chrono::seconds>() >= | |||||
(lastConflictingRegistrationTime + cooldown)) { | |||||
for (auto &conflictingProof : conflictingProofs) { | for (auto &conflictingProof : conflictingProofs) { | ||||
removeProof(conflictingProof); | removeProof(conflictingProof); | ||||
} | } | ||||
added = addProofIfNoConflict(proof); | added = addProofIfNoConflict(proof); | ||||
assert(added == AddProofStatus::SUCCEED); | assert(added == AddProofStatus::SUCCEED); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 41 Lines • Show Last 20 Lines |