diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h --- a/src/avalanche/processor.h +++ b/src/avalanche/processor.h @@ -95,6 +95,7 @@ // of implementing the whole NetEventsInterface for a single interesting event. class Processor final : public NetEventsInterface { CConnman *connman; + ChainstateManager &chainman; std::chrono::milliseconds queryTimeoutDuration; /** @@ -174,9 +175,9 @@ std::unique_ptr chainNotificationsHandler; Processor(const ArgsManager &argsman, interfaces::Chain &chain, - CConnman *connmanIn, CScheduler &scheduler, - std::unique_ptr peerDataIn, CKey sessionKeyIn, - uint32_t minQuorumTotalScoreIn, + CConnman *connmanIn, ChainstateManager &chainman, + CScheduler &scheduler, std::unique_ptr peerDataIn, + CKey sessionKeyIn, uint32_t minQuorumTotalScoreIn, double minQuorumConnectedScoreRatioIn, int64_t minAvaproofsNodeCountIn, uint32_t staleVoteThresholdIn, uint32_t staleVoteFactorIn); @@ -184,11 +185,10 @@ public: ~Processor(); - static std::unique_ptr MakeProcessor(const ArgsManager &argsman, - interfaces::Chain &chain, - CConnman *connman, - CScheduler &scheduler, - bilingual_str &error); + static std::unique_ptr + MakeProcessor(const ArgsManager &argsman, interfaces::Chain &chain, + CConnman *connman, ChainstateManager &chainman, + CScheduler &scheduler, bilingual_str &error); void setQueryTimeoutDuration(std::chrono::milliseconds d) { queryTimeoutDuration = d; diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -128,13 +128,14 @@ }; Processor::Processor(const ArgsManager &argsman, interfaces::Chain &chain, - CConnman *connmanIn, CScheduler &scheduler, + CConnman *connmanIn, ChainstateManager &chainmanIn, + CScheduler &scheduler, std::unique_ptr peerDataIn, CKey sessionKeyIn, uint32_t minQuorumTotalScoreIn, double minQuorumConnectedScoreRatioIn, int64_t minAvaproofsNodeCountIn, uint32_t staleVoteThresholdIn, uint32_t staleVoteFactorIn) - : connman(connmanIn), + : connman(connmanIn), chainman(chainmanIn), queryTimeoutDuration(argsman.GetArg( "-avatimeout", AVALANCHE_DEFAULT_QUERY_TIMEOUT.count())), round(0), peerManager(std::make_unique()), @@ -161,11 +162,10 @@ stopEventLoop(); } -std::unique_ptr Processor::MakeProcessor(const ArgsManager &argsman, - interfaces::Chain &chain, - CConnman *connman, - CScheduler &scheduler, - bilingual_str &error) { +std::unique_ptr +Processor::MakeProcessor(const ArgsManager &argsman, interfaces::Chain &chain, + CConnman *connman, ChainstateManager &chainman, + CScheduler &scheduler, bilingual_str &error) { std::unique_ptr peerData; CKey masterKey; CKey sessionKey; @@ -324,7 +324,7 @@ // We can't use std::make_unique with a private constructor return std::unique_ptr(new Processor( - argsman, chain, connman, scheduler, std::move(peerData), + argsman, chain, connman, chainman, scheduler, std::move(peerData), std::move(sessionKey), Proof::amountToScore(minQuorumStake), minQuorumConnectedStakeRatio, minAvaproofsNodeCount, staleVoteThreshold, staleVoteFactor)); @@ -344,7 +344,7 @@ return false; } - isAccepted = ::ChainActive().Contains(pindex); + isAccepted = chainman.ActiveChain().Contains(pindex); } return blockVoteRecords.getWriteView() @@ -518,7 +518,7 @@ CBlockIndex *pindex; { LOCK(cs_main); - pindex = g_chainman.m_blockman.LookupBlockIndex( + pindex = chainman.m_blockman.LookupBlockIndex( BlockHash(votes[i].GetHash())); if (!pindex) { // This should not happen, but just in case... @@ -652,7 +652,7 @@ } void Processor::avaproofsSent(NodeId nodeid) { - if (::ChainstateActive().IsInitialBlockDownload()) { + if (chainman.ActiveChainstate().IsInitialBlockDownload()) { // Before IBD is complete there is no way to make sure a proof is valid // or not, e.g. it can be spent in a block we don't know yet. In order // to increase confidence that our proof set is similar to other nodes @@ -676,7 +676,7 @@ } // Don't do Avalanche while node is IBD'ing - if (::ChainstateActive().IsInitialBlockDownload()) { + if (chainman.ActiveChainstate().IsInitialBlockDownload()) { return false; } @@ -835,9 +835,9 @@ for (const auto &p : timedout_items) { const CInv &inv = p.first; if (inv.IsMsgBlk()) { - const CBlockIndex *pindex = WITH_LOCK( - cs_main, return g_chainman.m_blockman.LookupBlockIndex( - BlockHash(inv.hash))); + const CBlockIndex *pindex = + WITH_LOCK(cs_main, return chainman.m_blockman.LookupBlockIndex( + BlockHash(inv.hash))); if (!clearInflightRequest(blockVoteRecords, pindex, p.second)) { continue; @@ -925,7 +925,7 @@ return false; } - if (::ChainstateActive().IsBlockFinalized(pindex)) { + if (chainman.ActiveChainstate().IsBlockFinalized(pindex)) { // There is no point polling finalized block. return false; } 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 @@ -108,9 +108,9 @@ // Get the processor ready. bilingual_str error; - m_processor = Processor::MakeProcessor(*m_node.args, *m_node.chain, - m_node.connman.get(), - *m_node.scheduler, error); + m_processor = Processor::MakeProcessor( + *m_node.args, *m_node.chain, m_node.connman.get(), + *Assert(m_node.chainman), *m_node.scheduler, error); BOOST_CHECK(m_processor); gArgs.ForceSetArg("-avaproofstakeutxoconfirmations", "1"); @@ -1233,8 +1233,8 @@ bilingual_str error; std::unique_ptr processor = Processor::MakeProcessor( - *m_node.args, *m_node.chain, m_node.connman.get(), *m_node.scheduler, - error); + *m_node.args, *m_node.chain, m_node.connman.get(), + *Assert(m_node.chainman), *m_node.scheduler, error); BOOST_CHECK(processor != nullptr); BOOST_CHECK(processor->getLocalProof() != nullptr); @@ -1381,7 +1381,7 @@ bilingual_str error; std::unique_ptr processor = Processor::MakeProcessor( *m_node.args, *m_node.chain, m_node.connman.get(), - *m_node.scheduler, error); + *Assert(m_node.chainman), *m_node.scheduler, error); if (std::get<3>(*it)) { BOOST_CHECK(processor != nullptr); @@ -1409,9 +1409,9 @@ ToString(minAvaproofsMessages)); bilingual_str error; - auto processor = Processor::MakeProcessor(argsman, *m_node.chain, - m_node.connman.get(), - *m_node.scheduler, error); + auto processor = Processor::MakeProcessor( + argsman, *m_node.chain, m_node.connman.get(), + *Assert(m_node.chainman), *m_node.scheduler, error); BOOST_CHECK_EQUAL(processor->isQuorumEstablished(), minAvaproofsMessages <= 0); @@ -1465,9 +1465,9 @@ }; bilingual_str error; - m_processor = Processor::MakeProcessor(*m_node.args, *m_node.chain, - m_node.connman.get(), - *m_node.scheduler, error); + m_processor = Processor::MakeProcessor( + *m_node.args, *m_node.chain, m_node.connman.get(), + *Assert(m_node.chainman), *m_node.scheduler, error); BOOST_CHECK(m_processor != nullptr); BOOST_CHECK(error.empty()); diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -2569,7 +2569,8 @@ // Step 6.5 (I guess ?): Initialize Avalanche. bilingual_str avalancheError; g_avalanche = avalanche::Processor::MakeProcessor( - args, *node.chain, node.connman.get(), *node.scheduler, avalancheError); + args, *node.chain, node.connman.get(), chainman, *node.scheduler, + avalancheError); if (!g_avalanche) { InitError(avalancheError); return false;