17 return conflictingProofs;
20 for (
const auto &s : proof->getStakes()) {
22 if (conflicting && conflicting->getId() != proof->getId()) {
23 conflictingProofs.insert(conflicting);
26 return conflictingProofs;
33 conflictingProofs.clear();
35 auto &poolView =
pool.get<by_proofid>();
36 if (poolView.find(proof->getId()) != poolView.end()) {
37 return AddProofStatus::DUPLICATED;
41 if (!conflictingProofs.empty()) {
42 return AddProofStatus::REJECTED;
46 for (
size_t i = 0; i < proof->getStakes().
size(); i++) {
47 auto p =
pool.emplace(i, proof);
54 return AddProofStatus::SUCCEED;
64 if (status != AddProofStatus::REJECTED ||
69 for (
auto &conflictingProof : conflictingProofs) {
74 Assume(status == AddProofStatus::SUCCEED);
77 return AddProofStatus::SUCCEED;
85 auto &poolView =
pool.get<by_proofid>();
86 return poolView.erase(proofid);
89std::unordered_set<ProofRef, SaltedProofHasher>
91 auto previousPool = std::move(
pool);
95 std::unordered_set<ProofRef, SaltedProofHasher> registeredProofs;
96 for (
auto &entry : previousPool) {
97 if (registeredProofs.insert(entry.proof).second) {
102 return registeredProofs;
108 auto &poolView =
pool.get<by_proofid>();
109 for (
auto it = poolView.begin(); it != poolView.end(); it++) {
110 proofIds.insert(it->proof->getId());
117 auto &poolView =
pool.get<by_proofid>();
118 auto it = poolView.find(proofid);
119 return it == poolView.end() ?
ProofRef() : it->proof;
123 auto it =
pool.find(outpoint);
128 auto &poolView =
pool.get<by_proof_score>();
129 return poolView.rbegin() == poolView.rend() ?
ProofRef()
130 : poolView.rbegin()->proof;
#define Assume(val)
Assume is the identity function.
bool registerProof(const ProofRef &proof, ProofRegistrationState ®istrationState, RegistrationMode mode=RegistrationMode::DEFAULT)
AddProofStatus addProofIfPreferred(const ProofRef &proof, ConflictingProofSet &conflictingProofs)
Attempt to add a proof to the pool.
AddProofStatus addProofIfNoConflict(const ProofRef &proof, ConflictingProofSet &conflictingProofs)
Attempt to add a proof to the pool, and fail if there is a conflict on any UTXO.
size_t countProofs() const
bool removeProof(ProofId proofid)
void forEachProof(Callable &&func) const
ProofRef getProof(const ProofId &proofid) const
std::set< ProofRef, ConflictingProofComparator > ConflictingProofSet
ProofRef getLowestScoreProof() const
boost::multi_index_container< ProofPoolEntry, bmi::indexed_by< bmi::hashed_unique< bmi::tag< by_utxo >, bmi::const_mem_fun< ProofPoolEntry, const COutPoint &, &ProofPoolEntry::getUTXO >, SaltedOutpointHasher >, bmi::hashed_non_unique< bmi::tag< by_proofid >, ProofPoolEntryProofIdKeyExtractor, SaltedProofIdHasher >, bmi::ordered_non_unique< bmi::tag< by_proof_score >, bmi::member< ProofPoolEntry, ProofRef, &ProofPoolEntry::proof >, ProofComparatorByScore > > > pool
std::unordered_set< ProofRef, SaltedProofHasher > rescan(PeerManager &peerManager)
ConflictingProofSet getConflicts(const ProofRef &proof) const
Return proofs in this pool that share any UTXO with proof.
ProofIdSet getProofIds() const
std::unordered_set< ProofId, SaltedProofIdHasher > ProofIdSet
RCUPtr< const Proof > ProofRef
Compare conflicting proofs.