diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h --- a/src/avalanche/processor.h +++ b/src/avalanche/processor.h @@ -174,7 +174,9 @@ void addProofToReconcile(const std::shared_ptr &proof, bool isAccepted); bool isAccepted(const CBlockIndex *pindex) const; + bool isAccepted(const std::shared_ptr &proof) const; int getConfidence(const CBlockIndex *pindex) const; + int getConfidence(const std::shared_ptr &proof) const; // TODO: Refactor the API to remove the dependency on avalanche/protocol.h void sendResponse(CNode *pfrom, Response response) const; diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -280,6 +280,16 @@ return it->second.isAccepted(); } +bool Processor::isAccepted(const std::shared_ptr &proof) const { + auto r = proofVoteRecords.getReadView(); + auto it = r->find(proof); + if (it == r.end()) { + return false; + } + + return it->second.isAccepted(); +} + int Processor::getConfidence(const CBlockIndex *pindex) const { auto r = blockVoteRecords.getReadView(); auto it = r->find(pindex); @@ -290,6 +300,16 @@ return it->second.getConfidence(); } +int Processor::getConfidence(const std::shared_ptr &proof) const { + auto r = proofVoteRecords.getReadView(); + auto it = r->find(proof); + if (it == r.end()) { + return -1; + } + + return it->second.getConfidence(); +} + namespace { /** * When using TCP, we need to sign all messages as the transport layer is diff --git a/src/avalanche/test/processor_tests.cpp b/src/avalanche/test/processor_tests.cpp --- a/src/avalanche/test/processor_tests.cpp +++ b/src/avalanche/test/processor_tests.cpp @@ -1120,4 +1120,29 @@ } } +BOOST_AUTO_TEST_CASE(proof_record) { + BOOST_CHECK(!m_processor->isAccepted(nullptr)); + BOOST_CHECK_EQUAL(m_processor->getConfidence(nullptr), -1); + + auto proofA = GetProof(); + auto proofB = GetProof(); + + BOOST_CHECK(!m_processor->isAccepted(proofA)); + BOOST_CHECK(!m_processor->isAccepted(proofB)); + BOOST_CHECK_EQUAL(m_processor->getConfidence(proofA), -1); + BOOST_CHECK_EQUAL(m_processor->getConfidence(proofB), -1); + + m_processor->addProofToReconcile(proofA, false); + BOOST_CHECK(!m_processor->isAccepted(proofA)); + BOOST_CHECK(!m_processor->isAccepted(proofB)); + BOOST_CHECK_EQUAL(m_processor->getConfidence(proofA), 0); + BOOST_CHECK_EQUAL(m_processor->getConfidence(proofB), -1); + + m_processor->addProofToReconcile(proofB, true); + BOOST_CHECK(!m_processor->isAccepted(proofA)); + BOOST_CHECK(m_processor->isAccepted(proofB)); + BOOST_CHECK_EQUAL(m_processor->getConfidence(proofA), 0); + BOOST_CHECK_EQUAL(m_processor->getConfidence(proofB), 0); +} + BOOST_AUTO_TEST_SUITE_END()