diff --git a/src/avalanche/orphanproofpool.h b/src/avalanche/orphanproofpool.h --- a/src/avalanche/orphanproofpool.h +++ b/src/avalanche/orphanproofpool.h @@ -10,19 +10,23 @@ #include #include +#include + namespace avalanche { // Extracts a ProofId from a Proof struct proofid_extractor { using result_type = ProofId; - result_type operator()(const Proof &proof) const { return proof.getId(); } + result_type operator()(const std::shared_ptr &proof) const { + return proof->getId(); + } }; struct by_sequence {}; struct by_proofid {}; using ProofContainer = boost::multi_index_container< - Proof, + std::shared_ptr, boost::multi_index::indexed_by< // keep insertion order boost::multi_index::sequenced>, @@ -57,7 +61,7 @@ * Add a proof to the pool. * The caller is responsible for checking the proof. */ - bool addProof(Proof proof); + bool addProof(const std::shared_ptr &proof); /** Remove a proof from the pool. */ bool removeProof(const ProofId &proofId); @@ -66,7 +70,7 @@ * Get a pointer to a proof by id, or nullptr if the proof is not in the * pool. */ - const Proof *getProof(const ProofId &proofId) const; + std::shared_ptr getProof(const ProofId &proofId) const; // For testing size_t getNProofs() const; diff --git a/src/avalanche/orphanproofpool.cpp b/src/avalanche/orphanproofpool.cpp --- a/src/avalanche/orphanproofpool.cpp +++ b/src/avalanche/orphanproofpool.cpp @@ -10,14 +10,14 @@ auto &proofs_by_sequence = proofs.get(); auto it = proofs_by_sequence.begin(); while (nStakes > maxNumberOfStakes) { - nStakes -= it->getStakes().size(); + nStakes -= (*it)->getStakes().size(); it = proofs_by_sequence.erase(it); } } -bool OrphanProofPool::addProof(Proof proof) { - size_t nStakesProof = proof.getStakes().size(); - if (!proofs.push_back(std::move(proof)).second) { +bool OrphanProofPool::addProof(const std::shared_ptr &proof) { + size_t nStakesProof = proof->getStakes().size(); + if (!proofs.push_back(proof).second) { return false; } nStakes += nStakesProof; @@ -31,15 +31,15 @@ if (it == proofs_by_id.end()) { return false; } - nStakes -= it->getStakes().size(); + nStakes -= (*it)->getStakes().size(); proofs_by_id.erase(it); return true; } -const Proof *OrphanProofPool::getProof(const ProofId &proofId) const { +std::shared_ptr OrphanProofPool::getProof(const ProofId &proofId) const { auto &proofs_by_proofid = proofs.get(); auto it = proofs_by_proofid.find(proofId); - return it == proofs_by_proofid.end() ? nullptr : &*it; + return it == proofs_by_proofid.end() ? nullptr : *it; } size_t OrphanProofPool::getNProofs() const { diff --git a/src/avalanche/test/orphanproofpool_tests.cpp b/src/avalanche/test/orphanproofpool_tests.cpp --- a/src/avalanche/test/orphanproofpool_tests.cpp +++ b/src/avalanche/test/orphanproofpool_tests.cpp @@ -19,7 +19,7 @@ BOOST_FIXTURE_TEST_SUITE(orphanproofpool_tests, TestingSetup) /** Make a proof with stakes using random txids */ -static Proof makeProof(const size_t nStakes) { +static std::shared_ptr makeProof(const size_t nStakes) { const Amount v = 5 * COIN; const int height = 1234; CKey key; @@ -29,7 +29,7 @@ TxId txid(GetRandHash()); pb.addUTXO(COutPoint(txid, 0), v, height, false, key); } - return pb.build(); + return std::make_shared(pb.build()); } BOOST_AUTO_TEST_CASE(pool_starts_empty) { @@ -40,36 +40,36 @@ BOOST_AUTO_TEST_CASE(fail_to_add_same_proof_twice) { OrphanProofPool pool{10}; - Proof p = makeProof(1); - BOOST_CHECK(!pool.getProof(p.getId())); + auto p = makeProof(1); + BOOST_CHECK(!pool.getProof(p->getId())); BOOST_CHECK(pool.addProof(p)); BOOST_CHECK_EQUAL(pool.getNStakes(), 1); BOOST_CHECK_EQUAL(pool.getNProofs(), 1); - BOOST_CHECK(pool.getProof(p.getId())); + BOOST_CHECK(pool.getProof(p->getId())); BOOST_CHECK(!pool.addProof(p)); BOOST_CHECK_EQUAL(pool.getNStakes(), 1); BOOST_CHECK_EQUAL(pool.getNProofs(), 1); - BOOST_CHECK(pool.getProof(p.getId())); + BOOST_CHECK(pool.getProof(p->getId())); } BOOST_AUTO_TEST_CASE(check_eviction_behavior) { { // Fill the pool OrphanProofPool pool{7}; - Proof first = makeProof(4); + auto first = makeProof(4); pool.addProof(first); pool.addProof(makeProof(2)); pool.addProof(makeProof(1)); BOOST_CHECK_EQUAL(pool.getNStakes(), 7); BOOST_CHECK_EQUAL(pool.getNProofs(), 3); - BOOST_CHECK(pool.getProof(first.getId())); + BOOST_CHECK(pool.getProof(first->getId())); } { OrphanProofPool pool{6}; - Proof first = makeProof(4); + auto first = makeProof(4); pool.addProof(first); pool.addProof(makeProof(2)); BOOST_CHECK_EQUAL(pool.getNStakes(), 6); @@ -79,14 +79,14 @@ pool.addProof(makeProof(1)); BOOST_CHECK_EQUAL(pool.getNStakes(), 3); BOOST_CHECK_EQUAL(pool.getNProofs(), 2); - BOOST_CHECK(!pool.getProof(first.getId())); + BOOST_CHECK(!pool.getProof(first->getId())); } { OrphanProofPool pool{15}; - Proof first = makeProof(1); + auto first = makeProof(1); pool.addProof(first); - Proof second = makeProof(2); + auto second = makeProof(2); pool.addProof(second); pool.addProof(makeProof(4)); pool.addProof(makeProof(8)); @@ -97,8 +97,8 @@ pool.addProof(makeProof(2)); BOOST_CHECK_EQUAL(pool.getNStakes(), 14); BOOST_CHECK_EQUAL(pool.getNProofs(), 3); - BOOST_CHECK(!pool.getProof(first.getId())); - BOOST_CHECK(!pool.getProof(second.getId())); + BOOST_CHECK(!pool.getProof(first->getId())); + BOOST_CHECK(!pool.getProof(second->getId())); } } @@ -108,8 +108,8 @@ // Add 10 proofs for (size_t i = 0; i < 10; i++) { - Proof p = makeProof(i + 1); - aProofIds[i] = p.getId(); + auto p = makeProof(i + 1); + aProofIds[i] = p->getId(); BOOST_CHECK(pool.addProof(p)); } BOOST_CHECK_EQUAL(pool.getNProofs(), 10); @@ -136,9 +136,9 @@ BOOST_CHECK_EQUAL(pool.getNStakes(), 38); // Fail to remove a proof that was never in the pool - Proof p = makeProof(11); - BOOST_CHECK(!pool.getProof(p.getId())); - BOOST_CHECK(!pool.removeProof(p.getId())); + auto p = makeProof(11); + BOOST_CHECK(!pool.getProof(p->getId())); + BOOST_CHECK(!pool.removeProof(p->getId())); BOOST_CHECK_EQUAL(pool.getNProofs(), 7); BOOST_CHECK_EQUAL(pool.getNStakes(), 38); }