From bb1f0b296068530ffa3b0b3d03f7b6d86405a283 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 18:13:16 +0700 Subject: [PATCH 01/15] refactor: drop unused headers --- src/coinjoin/coinjoin.cpp | 1 - src/governance/object.cpp | 1 - src/governance/vote.cpp | 1 - src/llmq/chainlocks.cpp | 1 - src/llmq/context.cpp | 1 - src/llmq/utils.h | 2 -- src/rpc/rawtransaction.cpp | 1 - 7 files changed, 8 deletions(-) diff --git a/src/coinjoin/coinjoin.cpp b/src/coinjoin/coinjoin.cpp index 9bb932da05b3..0440f48fef6b 100644 --- a/src/coinjoin/coinjoin.cpp +++ b/src/coinjoin/coinjoin.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include diff --git a/src/governance/object.cpp b/src/governance/object.cpp index 912903f8a53b..7439f3ac42a3 100644 --- a/src/governance/object.cpp +++ b/src/governance/object.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/src/governance/vote.cpp b/src/governance/vote.cpp index 76b761fa81a4..1c16d0930b3d 100644 --- a/src/governance/vote.cpp +++ b/src/governance/vote.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/src/llmq/chainlocks.cpp b/src/llmq/chainlocks.cpp index 7330fd5f1c8e..5ba131bc7ec7 100644 --- a/src/llmq/chainlocks.cpp +++ b/src/llmq/chainlocks.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include diff --git a/src/llmq/context.cpp b/src/llmq/context.cpp index 834aa8063c85..78cd705b68b7 100644 --- a/src/llmq/context.cpp +++ b/src/llmq/context.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include LLMQContext::LLMQContext(CChainState& chainstate, CConnman& connman, CEvoDB& evo_db, CSporkManager& sporkman, CTxMemPool& mempool, diff --git a/src/llmq/utils.h b/src/llmq/utils.h index a19e1981d769..56c8e09b1371 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -5,8 +5,6 @@ #ifndef BITCOIN_LLMQ_UTILS_H #define BITCOIN_LLMQ_UTILS_H -#include - #include #include #include diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 72586fcb7d40..fc19beb11a82 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -48,7 +48,6 @@ #include #include #include -#include #include #include From bb64fcbf47134b954a3b0b9775aa24e717b6e263 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 19:19:12 +0700 Subject: [PATCH 02/15] refactor: move signing specific code from utils.h to signing.h --- src/llmq/signing.cpp | 3 ++- src/llmq/signing.h | 31 +++++++++++++++++++++++++++++++ src/llmq/signing_shares.cpp | 2 +- src/llmq/utils.h | 31 ------------------------------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index 97e9019da768..465e492b8e4e 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -649,8 +649,9 @@ void CSigningManager::CollectPendingRecoveredSigsToVerify( return; } + // TODO: refactor it to remove duplicated code with `CSigSharesManager::CollectPendingSigSharesToVerify` std::unordered_set, StaticSaltedHasher> uniqueSignHashes; - utils::IterateNodesRandom(pendingRecoveredSigs, [&]() { + IterateNodesRandom(pendingRecoveredSigs, [&]() { return uniqueSignHashes.size() < maxUniqueSessions; }, [&](NodeId nodeId, std::list>& ns) { if (ns.empty()) { diff --git a/src/llmq/signing.h b/src/llmq/signing.h index 1849b4899bc6..6e8db9c7f5e5 100644 --- a/src/llmq/signing.h +++ b/src/llmq/signing.h @@ -232,6 +232,37 @@ class CSigningManager // Verifies a recovered sig that was signed while the chain tip was at signedAtTip static bool VerifyRecoveredSig(Consensus::LLMQType llmqType, const CQuorumManager& quorum_manager, int signedAtHeight, const uint256& id, const uint256& msgHash, const CBLSSignature& sig, int signOffset = SIGN_HEIGHT_OFFSET); }; + +template +void IterateNodesRandom(NodesContainer& nodeStates, Continue&& cont, Callback&& callback, FastRandomContext& rnd) +{ + std::vector rndNodes; + rndNodes.reserve(nodeStates.size()); + for (auto it = nodeStates.begin(); it != nodeStates.end(); ++it) { + rndNodes.emplace_back(it); + } + if (rndNodes.empty()) { + return; + } + Shuffle(rndNodes.begin(), rndNodes.end(), rnd); + + size_t idx = 0; + while (!rndNodes.empty() && cont()) { + auto nodeId = rndNodes[idx]->first; + auto& ns = rndNodes[idx]->second; + + if (callback(nodeId, ns)) { + idx = (idx + 1) % rndNodes.size(); + } else { + rndNodes.erase(rndNodes.begin() + idx); + if (rndNodes.empty()) { + break; + } + idx %= rndNodes.size(); + } + } +} + } // namespace llmq #endif // BITCOIN_LLMQ_SIGNING_H diff --git a/src/llmq/signing_shares.cpp b/src/llmq/signing_shares.cpp index b69678473873..3b5559a6bd0e 100644 --- a/src/llmq/signing_shares.cpp +++ b/src/llmq/signing_shares.cpp @@ -565,7 +565,7 @@ void CSigSharesManager::CollectPendingSigSharesToVerify( // the whole verification process std::unordered_set, StaticSaltedHasher> uniqueSignHashes; - utils::IterateNodesRandom(nodeStates, [&]() { + IterateNodesRandom(nodeStates, [&]() { return uniqueSignHashes.size() < maxUniqueSessions; }, [&](NodeId nodeId, CSigSharesNodeState& ns) { if (ns.pendingIncomingSigShares.Empty()) { diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 56c8e09b1371..53b004a6221d 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -5,7 +5,6 @@ #ifndef BITCOIN_LLMQ_UTILS_H #define BITCOIN_LLMQ_UTILS_H -#include #include #include #include @@ -73,36 +72,6 @@ bool IsWatchQuorumsEnabled(); /// Returns the parsed entries given by `-llmq-qvvec-sync` std::map GetEnabledQuorumVvecSyncEntries(); -template -void IterateNodesRandom(NodesContainer& nodeStates, Continue&& cont, Callback&& callback, FastRandomContext& rnd) -{ - std::vector rndNodes; - rndNodes.reserve(nodeStates.size()); - for (auto it = nodeStates.begin(); it != nodeStates.end(); ++it) { - rndNodes.emplace_back(it); - } - if (rndNodes.empty()) { - return; - } - Shuffle(rndNodes.begin(), rndNodes.end(), rnd); - - size_t idx = 0; - while (!rndNodes.empty() && cont()) { - auto nodeId = rndNodes[idx]->first; - auto& ns = rndNodes[idx]->second; - - if (callback(nodeId, ns)) { - idx = (idx + 1) % rndNodes.size(); - } else { - rndNodes.erase(rndNodes.begin() + idx); - if (rndNodes.empty()) { - break; - } - idx %= rndNodes.size(); - } - } -} - template void InitQuorumsCache(CacheType& cache, bool limit_by_connections = true); From e5f204fa7fd0fb1b87819e0b34cf02716080c644 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 19:24:23 +0700 Subject: [PATCH 03/15] refactor: new module llmq/options for reduce using llmq/utils externally --- src/Makefile.am | 2 ++ src/llmq/options.cpp | 5 +++++ src/llmq/options.h | 11 +++++++++++ 3 files changed, 18 insertions(+) create mode 100644 src/llmq/options.cpp create mode 100644 src/llmq/options.h diff --git a/src/Makefile.am b/src/Makefile.am index 792c884f0850..75e4a5efc2da 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -232,6 +232,7 @@ BITCOIN_CORE_H = \ llmq/ehf_signals.cpp \ llmq/ehf_signals.h \ llmq/instantsend.h \ + llmq/options.h \ llmq/params.h \ llmq/quorums.h \ llmq/signing.h \ @@ -452,6 +453,7 @@ libbitcoin_server_a_SOURCES = \ llmq/dkgsession.cpp \ llmq/context.cpp \ llmq/instantsend.cpp \ + llmq/options.cpp \ llmq/snapshot.cpp \ llmq/signing.cpp \ llmq/signing_shares.cpp \ diff --git a/src/llmq/options.cpp b/src/llmq/options.cpp new file mode 100644 index 000000000000..909d190422f3 --- /dev/null +++ b/src/llmq/options.cpp @@ -0,0 +1,5 @@ +// Copyright (c) 2018-2023 The Dash Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include diff --git a/src/llmq/options.h b/src/llmq/options.h new file mode 100644 index 000000000000..f74f2c615ddb --- /dev/null +++ b/src/llmq/options.h @@ -0,0 +1,11 @@ +// Copyright (c) 2018-2023 The Dash Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_LLMQ_OPTIONS_H +#define BITCOIN_LLMQ_OPTIONS_H + + + + +#endif // BITCOIN_LLMQ_OPTIONS_H From b049b9f9931026210e706e56cbae9eeca57d6863 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 19:27:44 +0700 Subject: [PATCH 04/15] refactor: move IsQuorumRotationEnabled from llmq/utils to llmq/options Also this commit add llmq/utils in modules where it is included indirectly but it requires to be used such as rpc/quorums --- src/evo/cbtx.cpp | 7 ++++--- src/llmq/blockprocessor.cpp | 17 +++++++++-------- src/llmq/commitment.cpp | 3 ++- src/llmq/dkgsession.cpp | 5 +++-- src/llmq/dkgsessionhandler.cpp | 3 ++- src/llmq/dkgsessionmgr.cpp | 3 ++- src/llmq/options.cpp | 23 +++++++++++++++++++++++ src/llmq/options.h | 8 ++++++++ src/llmq/quorums.cpp | 3 ++- src/llmq/signing.cpp | 7 ++++--- src/llmq/utils.cpp | 14 +------------- src/llmq/utils.h | 6 +++--- src/rpc/quorums.cpp | 4 +++- 13 files changed, 66 insertions(+), 37 deletions(-) diff --git a/src/evo/cbtx.cpp b/src/evo/cbtx.cpp index 8f81e5f69f2d..212a655057c6 100644 --- a/src/evo/cbtx.cpp +++ b/src/evo/cbtx.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -201,7 +202,7 @@ auto CachedGetQcHashesQcIndexedHashes(const CBlockIndex* pindexPrev, const llmq: for (const auto& [llmqType, vecBlockIndexes] : quorums) { const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); assert(llmq_params_opt.has_value()); - bool rotation_enabled = llmq::utils::IsQuorumRotationEnabled(llmq_params_opt.value(), pindexPrev); + bool rotation_enabled = llmq::IsQuorumRotationEnabled(llmq_params_opt.value(), pindexPrev); auto& vec_hashes = qcHashes_cached[llmqType]; vec_hashes.reserve(vecBlockIndexes.size()); auto& map_indexed_hashes = qcIndexedHashes_cached[llmqType]; @@ -270,8 +271,8 @@ bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPre return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-commitment-type-calc-cbtx-quorummerkleroot"); } const auto& llmq_params = llmq_params_opt.value(); - auto qcHash = ::SerializeHash(opt_qc->commitment); - if (llmq::utils::IsQuorumRotationEnabled(llmq_params, pindexPrev)) { + const auto qcHash = ::SerializeHash(opt_qc->commitment); + if (llmq::IsQuorumRotationEnabled(llmq_params, pindexPrev)) { auto& map_indexed_hashes = qcIndexedHashes[opt_qc->commitment.llmqType]; map_indexed_hashes[opt_qc->commitment.quorumIndex] = qcHash; } else { diff --git a/src/llmq/blockprocessor.cpp b/src/llmq/blockprocessor.cpp index d6e123fd35b9..4d4a838d8e18 100644 --- a/src/llmq/blockprocessor.cpp +++ b/src/llmq/blockprocessor.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -28,7 +29,7 @@ static void PreComputeQuorumMembers(const CBlockIndex* pindex, bool reset_cache = false) { for (const Consensus::LLMQParams& params : llmq::utils::GetEnabledQuorumParams(pindex->pprev)) { - if (llmq::utils::IsQuorumRotationEnabled(params, pindex) && (pindex->nHeight % params.dkgInterval == 0)) { + if (llmq::IsQuorumRotationEnabled(params, pindex) && (pindex->nHeight % params.dkgInterval == 0)) { llmq::utils::GetAllQuorumMembers(params.type, pindex, reset_cache); } } @@ -181,7 +182,7 @@ bool CQuorumBlockProcessor::ProcessBlock(const CBlock& block, gsl::not_null numCommitmentsInNewBlock) { return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-missing"); } - if (llmq::utils::IsQuorumRotationEnabled(params, pindex)) { + if (IsQuorumRotationEnabled(params, pindex)) { LogPrintf("[ProcessBlock] h[%d] numCommitmentsRequired[%d] numCommitmentsInNewBlock[%d]\n", pindex->nHeight, numCommitmentsRequired, numCommitmentsInNewBlock); } } @@ -276,7 +277,7 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH return true; } - bool rotation_enabled = utils::IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex); + bool rotation_enabled = IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex); if (rotation_enabled) { LogPrint(BCLog::LLMQ, "[ProcessCommitment] height[%d] pQuorumBaseBlockIndex[%d] quorumIndex[%d] qversion[%d] Built\n", @@ -329,7 +330,7 @@ bool CQuorumBlockProcessor::UndoBlock(const CBlock& block, gsl::not_nullnHeight, int(qc.quorumIndex))); } else { m_evoDb.Erase(BuildInversedHeightKey(qc.llmqType, pindex->nHeight)); @@ -374,7 +375,7 @@ bool CQuorumBlockProcessor::GetCommitmentsFromBlock(const CBlock& block, gsl::no } // only allow one commitment per type and per block (This was changed with rotation) - if (!utils::IsQuorumRotationEnabled(llmq_params_opt.value(), pindex)) { + if (!IsQuorumRotationEnabled(llmq_params_opt.value(), pindex)) { if (ret.count(qc.commitment.llmqType) != 0) { return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-dup"); } @@ -421,7 +422,7 @@ size_t CQuorumBlockProcessor::GetNumCommitmentsRequired(const Consensus::LLMQPar assert(nHeight <= m_chainstate.m_chain.Height() + 1); const auto *const pindex = m_chainstate.m_chain.Height() < nHeight ? m_chainstate.m_chain.Tip() : m_chainstate.m_chain.Tip()->GetAncestor(nHeight); - bool rotation_enabled = utils::IsQuorumRotationEnabled(llmqParams, pindex); + bool rotation_enabled = IsQuorumRotationEnabled(llmqParams, pindex); size_t quorums_num = rotation_enabled ? llmqParams.signingActiveQuorumCount : 1; size_t ret{0}; @@ -626,7 +627,7 @@ std::map> CQuorumBlockProce for (const auto& params : Params().GetConsensus().llmqs) { auto& v = ret[params.type]; v.reserve(params.signingActiveQuorumCount); - if (utils::IsQuorumRotationEnabled(params, pindex)) { + if (IsQuorumRotationEnabled(params, pindex)) { std::vector> commitments = GetLastMinedCommitmentsPerQuorumIndexUntilBlock(params.type, pindex, 0); std::transform(commitments.begin(), commitments.end(), std::back_inserter(v), [](const std::pair& p) { return p.second; }); @@ -705,7 +706,7 @@ std::optional> CQuorumBlockProcessor::GetMineableC assert(nHeight <= m_chainstate.m_chain.Height() + 1); const auto *const pindex = m_chainstate.m_chain.Height() < nHeight ? m_chainstate.m_chain.Tip() : m_chainstate.m_chain.Tip()->GetAncestor(nHeight); - bool rotation_enabled = utils::IsQuorumRotationEnabled(llmqParams, pindex); + bool rotation_enabled = IsQuorumRotationEnabled(llmqParams, pindex); bool basic_bls_enabled{DeploymentActiveAfter(pindex, Params().GetConsensus(), Consensus::DEPLOYMENT_V19)}; size_t quorums_num = rotation_enabled ? llmqParams.signingActiveQuorumCount : 1; diff --git a/src/llmq/commitment.cpp b/src/llmq/commitment.cpp index 2184f6ac58ca..f4536886caba 100644 --- a/src/llmq/commitment.cpp +++ b/src/llmq/commitment.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,7 @@ bool CFinalCommitment::Verify(gsl::not_null pQuorumBaseBlock } const auto& llmq_params = llmq_params_opt.value(); - const uint16_t expected_nversion{CFinalCommitment::GetVersion(utils::IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex), + const uint16_t expected_nversion{CFinalCommitment::GetVersion(IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex), DeploymentActiveAfter(pQuorumBaseBlockIndex, Params().GetConsensus(), Consensus::DEPLOYMENT_V19))}; if (nVersion == 0 || nVersion != expected_nversion) { LogPrintfFinalCommitment("q[%s] invalid nVersion=%d expectednVersion\n", quorumHash.ToString(), nVersion, expected_nversion); diff --git a/src/llmq/dkgsession.cpp b/src/llmq/dkgsession.cpp index 943c28c6435a..e6423ee916d2 100644 --- a/src/llmq/dkgsession.cpp +++ b/src/llmq/dkgsession.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -100,7 +101,7 @@ bool CDKGSession::Init(gsl::not_null _pQuorumBaseBlockIndex, CDKGLogger logger(*this, __func__); - if (LogAcceptCategory(BCLog::LLMQ) && utils::IsQuorumRotationEnabled(params, m_quorum_base_block_index)) { + if (LogAcceptCategory(BCLog::LLMQ) && IsQuorumRotationEnabled(params, m_quorum_base_block_index)) { int cycleQuorumBaseHeight = m_quorum_base_block_index->nHeight - quorumIndex; const CBlockIndex* pCycleQuorumBaseBlockIndex = m_quorum_base_block_index->GetAncestor(cycleQuorumBaseHeight); std::stringstream ss; @@ -1224,7 +1225,7 @@ std::vector CDKGSession::FinalizeCommitments() fqc.quorumPublicKey = first.quorumPublicKey; fqc.quorumVvecHash = first.quorumVvecHash; - const bool isQuorumRotationEnabled{utils::IsQuorumRotationEnabled(params, m_quorum_base_block_index)}; + const bool isQuorumRotationEnabled{IsQuorumRotationEnabled(params, m_quorum_base_block_index)}; fqc.nVersion = CFinalCommitment::GetVersion(isQuorumRotationEnabled, DeploymentActiveAfter(m_quorum_base_block_index, Params().GetConsensus(), Consensus::DEPLOYMENT_V19)); fqc.quorumIndex = isQuorumRotationEnabled ? quorumIndex : 0; diff --git a/src/llmq/dkgsessionhandler.cpp b/src/llmq/dkgsessionhandler.cpp index 4cbe4532b5a3..543526ffd1ac 100644 --- a/src/llmq/dkgsessionhandler.cpp +++ b/src/llmq/dkgsessionhandler.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -110,7 +111,7 @@ void CDKGSessionHandler::UpdatedBlockTip(const CBlockIndex* pindexNew) { //AssertLockNotHeld(cs_main); //Indexed quorums (greater than 0) are enabled with Quorum Rotation - if (quorumIndex > 0 && !utils::IsQuorumRotationEnabled(params, pindexNew)) { + if (quorumIndex > 0 && !IsQuorumRotationEnabled(params, pindexNew)) { return; } LOCK(cs); diff --git a/src/llmq/dkgsessionmgr.cpp b/src/llmq/dkgsessionmgr.cpp index 1bb62da95be6..7fb6a686c0de 100644 --- a/src/llmq/dkgsessionmgr.cpp +++ b/src/llmq/dkgsessionmgr.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -252,7 +253,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quor } quorumIndex = pQuorumBaseBlockIndex->nHeight % llmq_params.dkgInterval; - int quorumIndexMax = utils::IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex) ? + int quorumIndexMax = IsQuorumRotationEnabled(llmq_params, pQuorumBaseBlockIndex) ? llmq_params.signingActiveQuorumCount - 1 : 0; if (quorumIndex > quorumIndexMax) { diff --git a/src/llmq/options.cpp b/src/llmq/options.cpp index 909d190422f3..c460a3855c05 100644 --- a/src/llmq/options.cpp +++ b/src/llmq/options.cpp @@ -3,3 +3,26 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include + +#include +#include +#include + +namespace llmq +{ + +bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex) +{ + if (!llmqParams.useRotation) { + return false; + } + + int cycleQuorumBaseHeight = pindex->nHeight - (pindex->nHeight % llmqParams.dkgInterval); + if (cycleQuorumBaseHeight < 1) { + return false; + } + // It should activate at least 1 block prior to the cycle start + return DeploymentActiveAfter(pindex->GetAncestor(cycleQuorumBaseHeight - 1), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024); +} + +} // namespace llmq diff --git a/src/llmq/options.h b/src/llmq/options.h index f74f2c615ddb..e31b7e8a0d49 100644 --- a/src/llmq/options.h +++ b/src/llmq/options.h @@ -5,7 +5,15 @@ #ifndef BITCOIN_LLMQ_OPTIONS_H #define BITCOIN_LLMQ_OPTIONS_H +#include +#include +class CBlockIndex; +namespace llmq +{ +bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex); + +} // namespace llmq #endif // BITCOIN_LLMQ_OPTIONS_H diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index 1df6594f8779..ffd82e691c18 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -301,7 +302,7 @@ void CQuorumManager::CheckQuorumConnections(const Consensus::LLMQParams& llmqPar auto connmanQuorumsToDelete = connman.GetMasternodeQuorums(llmqParams.type); // don't remove connections for the currently in-progress DKG round - if (utils::IsQuorumRotationEnabled(llmqParams, pindexNew)) { + if (IsQuorumRotationEnabled(llmqParams, pindexNew)) { int cycleIndexTipHeight = pindexNew->nHeight % llmqParams.dkgInterval; int cycleQuorumBaseHeight = pindexNew->nHeight - cycleIndexTipHeight; std::stringstream ss; diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index 465e492b8e4e..10e2447f81aa 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -4,10 +4,11 @@ #include -#include #include -#include +#include +#include #include +#include #include #include @@ -1011,7 +1012,7 @@ CQuorumCPtr CSigningManager::SelectQuorumForSigning(const Consensus::LLMQParams& pindexStart = ::ChainActive()[startBlockHeight]; } - if (utils::IsQuorumRotationEnabled(llmq_params, pindexStart)) { + if (IsQuorumRotationEnabled(llmq_params, pindexStart)) { auto quorums = quorum_manager.ScanQuorums(llmq_params.type, pindexStart, poolSize); if (quorums.empty()) { return nullptr; diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index b6dfb92de777..d12cb52e19af 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -4,6 +4,7 @@ #include +#include #include #include @@ -675,19 +676,6 @@ bool IsQuorumPoseEnabled(Consensus::LLMQType llmqType) return EvalSpork(llmqType, sporkManager->GetSporkValue(SPORK_23_QUORUM_POSE)); } -bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex) -{ - if (!llmqParams.useRotation) { - return false; - } - - int cycleQuorumBaseHeight = pindex->nHeight - (pindex->nHeight % llmqParams.dkgInterval); - if (cycleQuorumBaseHeight < 1) { - return false; - } - // It should activate at least 1 block prior to the cycle start - return DeploymentActiveAfter(pindex->GetAncestor(cycleQuorumBaseHeight - 1), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024); -} uint256 DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2) { diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 53b004a6221d..2235e56fe942 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -5,11 +5,13 @@ #ifndef BITCOIN_LLMQ_UTILS_H #define BITCOIN_LLMQ_UTILS_H +#include #include #include -#include #include +#include +#include #include #include @@ -61,8 +63,6 @@ bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumMana std::vector GetEnabledQuorumTypes(gsl::not_null pindex); std::vector> GetEnabledQuorumParams(gsl::not_null pindex); -bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex); - /// Returns the state of `-llmq-data-recovery` bool QuorumDataRecoveryEnabled(); diff --git a/src/rpc/quorums.cpp b/src/rpc/quorums.cpp index 40b80142b408..e80fb2972685 100644 --- a/src/rpc/quorums.cpp +++ b/src/rpc/quorums.cpp @@ -20,10 +20,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -301,7 +303,7 @@ static UniValue quorum_dkgstatus(const JSONRPCRequest& request, const Chainstate const auto& llmq_params_opt = llmq::GetLLMQParams(type); CHECK_NONFATAL(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); - bool rotation_enabled = llmq::utils::IsQuorumRotationEnabled(llmq_params, pindexTip); + bool rotation_enabled = llmq::IsQuorumRotationEnabled(llmq_params, pindexTip); int quorums_num = rotation_enabled ? llmq_params.signingActiveQuorumCount : 1; for (const int quorumIndex : irange::range(quorums_num)) { From 71cad8f01e3be9ed820d79aebe418ba842dd8dd6 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 20:04:09 +0700 Subject: [PATCH 05/15] refactor: move spork related code from llmq/utils to llmq/options --- src/llmq/dkgsession.cpp | 5 +++-- src/llmq/options.cpp | 23 +++++++++++++++++++++++ src/llmq/options.h | 3 +++ src/llmq/signing_shares.cpp | 15 ++++++++------- src/llmq/utils.cpp | 23 ----------------------- src/llmq/utils.h | 2 -- 6 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/llmq/dkgsession.cpp b/src/llmq/dkgsession.cpp index e6423ee916d2..88f15bc4c364 100644 --- a/src/llmq/dkgsession.cpp +++ b/src/llmq/dkgsession.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -449,7 +450,7 @@ void CDKGSession::VerifyAndComplain(CDKGPendingMessages& pendingMessages) void CDKGSession::VerifyConnectionAndMinProtoVersions() const { - if (!utils::IsQuorumPoseEnabled(params.type)) { + if (!IsQuorumPoseEnabled(params.type)) { return; } @@ -464,7 +465,7 @@ void CDKGSession::VerifyConnectionAndMinProtoVersions() const protoMap.emplace(verifiedProRegTxHash, pnode->nVersion); }); - bool fShouldAllMembersBeConnected = utils::IsAllMembersConnectedEnabled(params.type); + bool fShouldAllMembersBeConnected = IsAllMembersConnectedEnabled(params.type); for (const auto& m : members) { if (m->dmn->proTxHash == myProTxHash) { continue; diff --git a/src/llmq/options.cpp b/src/llmq/options.cpp index c460a3855c05..76916269631c 100644 --- a/src/llmq/options.cpp +++ b/src/llmq/options.cpp @@ -7,10 +7,33 @@ #include #include #include +#include namespace llmq { +static bool EvalSpork(Consensus::LLMQType llmqType, int64_t spork_value) +{ + if (spork_value == 0) { + return true; + } + if (spork_value == 1 && llmqType != Consensus::LLMQType::LLMQ_100_67 && llmqType != Consensus::LLMQType::LLMQ_400_60 && llmqType != Consensus::LLMQType::LLMQ_400_85) { + return true; + } + return false; +} + +bool IsAllMembersConnectedEnabled(Consensus::LLMQType llmqType) +{ + return EvalSpork(llmqType, sporkManager->GetSporkValue(SPORK_21_QUORUM_ALL_CONNECTED)); +} + +bool IsQuorumPoseEnabled(Consensus::LLMQType llmqType) +{ + return EvalSpork(llmqType, sporkManager->GetSporkValue(SPORK_23_QUORUM_POSE)); +} + + bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex) { if (!llmqParams.useRotation) { diff --git a/src/llmq/options.h b/src/llmq/options.h index e31b7e8a0d49..b7fe56f9e6cf 100644 --- a/src/llmq/options.h +++ b/src/llmq/options.h @@ -12,6 +12,9 @@ class CBlockIndex; namespace llmq { +bool IsAllMembersConnectedEnabled(Consensus::LLMQType llmqType); +bool IsQuorumPoseEnabled(Consensus::LLMQType llmqType); + bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex); } // namespace llmq diff --git a/src/llmq/signing_shares.cpp b/src/llmq/signing_shares.cpp index 3b5559a6bd0e..e5075d80a4b7 100644 --- a/src/llmq/signing_shares.cpp +++ b/src/llmq/signing_shares.cpp @@ -4,6 +4,7 @@ #include +#include #include #include #include @@ -698,7 +699,7 @@ void CSigSharesManager::ProcessSigShare(const CSigShare& sigShare, const CConnma // prepare node set for direct-push in case this is our sig share std::set quorumNodes; - if (!utils::IsAllMembersConnectedEnabled(llmqType) && sigShare.getQuorumMember() == quorum->GetMemberIndex(WITH_LOCK(activeMasternodeInfoCs, return activeMasternodeInfo.proTxHash))) { + if (!IsAllMembersConnectedEnabled(llmqType) && sigShare.getQuorumMember() == quorum->GetMemberIndex(WITH_LOCK(activeMasternodeInfoCs, return activeMasternodeInfo.proTxHash))) { quorumNodes = connman.GetMasternodeQuorumNodes(sigShare.getLlmqType(), sigShare.getQuorumHash()); } @@ -712,7 +713,7 @@ void CSigSharesManager::ProcessSigShare(const CSigShare& sigShare, const CConnma if (!sigShares.Add(sigShare.GetKey(), sigShare)) { return; } - if (!utils::IsAllMembersConnectedEnabled(llmqType)) { + if (!IsAllMembersConnectedEnabled(llmqType)) { sigSharesQueuedToAnnounce.Add(sigShare.GetKey(), true); } @@ -857,7 +858,7 @@ void CSigSharesManager::CollectSigSharesToRequest(std::unordered_mapsecond)* invMap = nullptr; for (auto& [signHash, session] : nodeState.sessions) { - if (utils::IsAllMembersConnectedEnabled(session.llmqType)) { + if (IsAllMembersConnectedEnabled(session.llmqType)) { continue; } @@ -928,7 +929,7 @@ void CSigSharesManager::CollectSigSharesToSend(std::unordered_mapsecond)* sigSharesToSend2 = nullptr; for (auto& [signHash, session] : nodeState.sessions) { - if (utils::IsAllMembersConnectedEnabled(session.llmqType)) { + if (IsAllMembersConnectedEnabled(session.llmqType)) { continue; } @@ -982,7 +983,7 @@ void CSigSharesManager::CollectSigSharesToSendConcentrated(std::unordered_map().count(); for (auto& [_, signedSession] : signedSessions) { - if (!utils::IsAllMembersConnectedEnabled(signedSession.quorum->params.type)) { + if (!IsAllMembersConnectedEnabled(signedSession.quorum->params.type)) { continue; } @@ -1477,7 +1478,7 @@ void CSigSharesManager::SignPendingSigShares() auto sigShare = *opt_sigShare; ProcessSigShare(sigShare, connman, pQuorum); - if (utils::IsAllMembersConnectedEnabled(pQuorum->params.type)) { + if (IsAllMembersConnectedEnabled(pQuorum->params.type)) { LOCK(cs); auto& session = signedSessions[sigShare.GetSignHash()]; session.sigShare = sigShare; @@ -1531,7 +1532,7 @@ std::optional CSigSharesManager::CreateSigShare(const CQuorumCPtr& qu // causes all known sigShares to be re-announced void CSigSharesManager::ForceReAnnouncement(const CQuorumCPtr& quorum, Consensus::LLMQType llmqType, const uint256& id, const uint256& msgHash) { - if (utils::IsAllMembersConnectedEnabled(llmqType)) { + if (IsAllMembersConnectedEnabled(llmqType)) { return; } diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index d12cb52e19af..0d286361eb06 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -655,28 +654,6 @@ uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, c return h.GetHash(); } -static bool EvalSpork(Consensus::LLMQType llmqType, int64_t spork_value) -{ - if (spork_value == 0) { - return true; - } - if (spork_value == 1 && llmqType != Consensus::LLMQType::LLMQ_100_67 && llmqType != Consensus::LLMQType::LLMQ_400_60 && llmqType != Consensus::LLMQType::LLMQ_400_85) { - return true; - } - return false; -} - -bool IsAllMembersConnectedEnabled(Consensus::LLMQType llmqType) -{ - return EvalSpork(llmqType, sporkManager->GetSporkValue(SPORK_21_QUORUM_ALL_CONNECTED)); -} - -bool IsQuorumPoseEnabled(Consensus::LLMQType llmqType) -{ - return EvalSpork(llmqType, sporkManager->GetSporkValue(SPORK_23_QUORUM_POSE)); -} - - uint256 DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2) { // We need to deterministically select who is going to initiate the connection. The naive way would be to simply diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 2235e56fe942..0c6533666e92 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -46,8 +46,6 @@ uint256 GetHashModifier(const Consensus::LLMQParams& llmqParams, gsl::not_null& validMembers, const CBLSPublicKey& pubKey, const uint256& vvecHash); uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash); -bool IsAllMembersConnectedEnabled(Consensus::LLMQType llmqType); -bool IsQuorumPoseEnabled(Consensus::LLMQType llmqType); uint256 DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2); std::set GetQuorumConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, const uint256& forMember, bool onlyOutbound); std::set GetQuorumRelayMembers(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, const uint256& forMember, bool onlyOutbound); From e733f08853dfdead6688e713c0c3e5954da92be8 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 21:47:16 +0700 Subject: [PATCH 06/15] refactor: move gArgs usages from llmq/utils to llmq/options --- src/init.cpp | 6 ++-- src/llmq/dkgsessionmgr.cpp | 4 +-- src/llmq/options.cpp | 63 ++++++++++++++++++++++++++++++++++++++ src/llmq/options.h | 23 ++++++++++++++ src/llmq/quorums.cpp | 14 ++++----- src/llmq/quorums.h | 3 -- src/llmq/utils.cpp | 58 ----------------------------------- src/llmq/utils.h | 17 ---------- src/net_processing.cpp | 3 +- 9 files changed, 100 insertions(+), 91 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 9548a6573c13..f9cce0c60c3b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -97,9 +97,9 @@ #include #include #include +#include #include #include -#include #include #include @@ -1424,8 +1424,8 @@ bool AppInitParameterInteraction(const ArgsManager& args) } try { - const bool fRecoveryEnabled{llmq::utils::QuorumDataRecoveryEnabled()}; - const bool fQuorumVvecRequestsEnabled{llmq::utils::GetEnabledQuorumVvecSyncEntries().size() > 0}; + const bool fRecoveryEnabled{llmq::QuorumDataRecoveryEnabled()}; + const bool fQuorumVvecRequestsEnabled{llmq::GetEnabledQuorumVvecSyncEntries().size() > 0}; if (!fRecoveryEnabled && fQuorumVvecRequestsEnabled) { InitWarning(Untranslated("-llmq-qvvec-sync set but recovery is disabled due to -llmq-data-recovery=0")); } diff --git a/src/llmq/dkgsessionmgr.cpp b/src/llmq/dkgsessionmgr.cpp index 7fb6a686c0de..6458d98c1eee 100644 --- a/src/llmq/dkgsessionmgr.cpp +++ b/src/llmq/dkgsessionmgr.cpp @@ -36,7 +36,7 @@ CDKGSessionManager::CDKGSessionManager(CBLSWorker& _blsWorker, CChainState& chai spork_manager(sporkManager), m_peerman(peerman) { - if (!fMasternodeMode && !utils::IsWatchQuorumsEnabled()) { + if (!fMasternodeMode && !IsWatchQuorumsEnabled()) { // Regular nodes do not care about any DKG internals, bail out return; } @@ -199,7 +199,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quor return; } - if ((!fMasternodeMode && !utils::IsWatchQuorumsEnabled())) { + if ((!fMasternodeMode && !IsWatchQuorumsEnabled())) { // regular non-watching nodes should never receive any of these m_peerman->Misbehaving(pfrom.GetId(), 10); return; diff --git a/src/llmq/options.cpp b/src/llmq/options.cpp index 76916269631c..1a8f16078b17 100644 --- a/src/llmq/options.cpp +++ b/src/llmq/options.cpp @@ -8,6 +8,11 @@ #include #include #include +#include +#include + +#include +#include namespace llmq { @@ -48,4 +53,62 @@ bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_n return DeploymentActiveAfter(pindex->GetAncestor(cycleQuorumBaseHeight - 1), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024); } +bool QuorumDataRecoveryEnabled() +{ + return gArgs.GetBoolArg("-llmq-data-recovery", DEFAULT_ENABLE_QUORUM_DATA_RECOVERY); +} + +bool IsWatchQuorumsEnabled() +{ + static bool fIsWatchQuroumsEnabled = gArgs.GetBoolArg("-watchquorums", DEFAULT_WATCH_QUORUMS); + return fIsWatchQuroumsEnabled; +} + +std::map GetEnabledQuorumVvecSyncEntries() +{ + std::map mapQuorumVvecSyncEntries; + for (const auto& strEntry : gArgs.GetArgs("-llmq-qvvec-sync")) { + Consensus::LLMQType llmqType = Consensus::LLMQType::LLMQ_NONE; + QvvecSyncMode mode{QvvecSyncMode::Invalid}; + std::istringstream ssEntry(strEntry); + std::string strLLMQType, strMode, strTest; + const bool fLLMQTypePresent = std::getline(ssEntry, strLLMQType, ':') && strLLMQType != ""; + const bool fModePresent = std::getline(ssEntry, strMode, ':') && strMode != ""; + const bool fTooManyEntries = static_cast(std::getline(ssEntry, strTest, ':')); + if (!fLLMQTypePresent || !fModePresent || fTooManyEntries) { + throw std::invalid_argument(strprintf("Invalid format in -llmq-qvvec-sync: %s", strEntry)); + } + + if (auto optLLMQParams = ranges::find_if_opt(Params().GetConsensus().llmqs, + [&strLLMQType](const auto& params){return params.name == strLLMQType;})) { + llmqType = optLLMQParams->type; + } else { + throw std::invalid_argument(strprintf("Invalid llmqType in -llmq-qvvec-sync: %s", strEntry)); + } + if (mapQuorumVvecSyncEntries.count(llmqType) > 0) { + throw std::invalid_argument(strprintf("Duplicated llmqType in -llmq-qvvec-sync: %s", strEntry)); + } + + int32_t nMode; + if (ParseInt32(strMode, &nMode)) { + switch (nMode) { + case (int32_t)QvvecSyncMode::Always: + mode = QvvecSyncMode::Always; + break; + case (int32_t)QvvecSyncMode::OnlyIfTypeMember: + mode = QvvecSyncMode::OnlyIfTypeMember; + break; + default: + mode = QvvecSyncMode::Invalid; + break; + } + } + if (mode == QvvecSyncMode::Invalid) { + throw std::invalid_argument(strprintf("Invalid mode in -llmq-qvvec-sync: %s", strEntry)); + } + mapQuorumVvecSyncEntries.emplace(llmqType, mode); + } + return mapQuorumVvecSyncEntries; +} + } // namespace llmq diff --git a/src/llmq/options.h b/src/llmq/options.h index b7fe56f9e6cf..4c65263369cf 100644 --- a/src/llmq/options.h +++ b/src/llmq/options.h @@ -8,15 +8,38 @@ #include #include +#include + class CBlockIndex; namespace llmq { + +enum class QvvecSyncMode { + Invalid = -1, + Always = 0, + OnlyIfTypeMember = 1, +}; + +static constexpr bool DEFAULT_ENABLE_QUORUM_DATA_RECOVERY{true}; + +// If true, we will connect to all new quorums and watch their communication +static constexpr bool DEFAULT_WATCH_QUORUMS{false}; + bool IsAllMembersConnectedEnabled(Consensus::LLMQType llmqType); bool IsQuorumPoseEnabled(Consensus::LLMQType llmqType); bool IsQuorumRotationEnabled(const Consensus::LLMQParams& llmqParams, gsl::not_null pindex); +/// Returns the state of `-llmq-data-recovery` +bool QuorumDataRecoveryEnabled(); + +/// Returns the state of `-watchquorums` +bool IsWatchQuorumsEnabled(); + +/// Returns the parsed entries given by `-llmq-qvvec-sync` +std::map GetEnabledQuorumVvecSyncEntries(); + } // namespace llmq #endif // BITCOIN_LLMQ_OPTIONS_H diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index ffd82e691c18..670145330481 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -219,11 +219,11 @@ void CQuorumManager::Stop() void CQuorumManager::TriggerQuorumDataRecoveryThreads(const CBlockIndex* pIndex) const { - if ((!fMasternodeMode && !utils::IsWatchQuorumsEnabled()) || !utils::QuorumDataRecoveryEnabled() || pIndex == nullptr) { + if ((!fMasternodeMode && !IsWatchQuorumsEnabled()) || !QuorumDataRecoveryEnabled() || pIndex == nullptr) { return; } - const std::map mapQuorumVvecSync = utils::GetEnabledQuorumVvecSyncEntries(); + const std::map mapQuorumVvecSync = GetEnabledQuorumVvecSyncEntries(); LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Process block %s\n", __func__, pIndex->GetBlockHash().ToString()); @@ -276,7 +276,7 @@ void CQuorumManager::UpdatedBlockTip(const CBlockIndex* pindexNew, bool fInitial CheckQuorumConnections(params, pindexNew); } - if (fMasternodeMode || utils::IsWatchQuorumsEnabled()) { + if (fMasternodeMode || IsWatchQuorumsEnabled()) { // Cleanup expired data requests LOCK(cs_data_requests); auto it = mapQuorumDataRequests.begin(); @@ -295,7 +295,7 @@ void CQuorumManager::UpdatedBlockTip(const CBlockIndex* pindexNew, bool fInitial void CQuorumManager::CheckQuorumConnections(const Consensus::LLMQParams& llmqParams, const CBlockIndex* pindexNew) const { - if (!fMasternodeMode && !utils::IsWatchQuorumsEnabled()) return; + if (!fMasternodeMode && !IsWatchQuorumsEnabled()) return; auto lastQuorums = ScanQuorums(llmqParams.type, pindexNew, (size_t)llmqParams.keepOldConnections); @@ -494,7 +494,7 @@ std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqType, const CBlockIndex* pindexStart, size_t nCountRequested) const { - if (pindexStart == nullptr || nCountRequested == 0 || !utils::IsQuorumTypeEnabled(llmqType, *this, pindexStart)) { + if (pindexStart == nullptr || nCountRequested == 0 || !IsQuorumTypeEnabled(llmqType, *this, pindexStart)) { return {}; } @@ -745,7 +745,7 @@ PeerMsgRet CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_t } if (msg_type == NetMsgType::QDATA) { - if ((!fMasternodeMode && !utils::IsWatchQuorumsEnabled()) || pfrom.GetVerifiedProRegTxHash().IsNull()) { + if ((!fMasternodeMode && !IsWatchQuorumsEnabled()) || pfrom.GetVerifiedProRegTxHash().IsNull()) { return errorHandler("Not a verified masternode and -watchquorums is not enabled"); } @@ -1034,7 +1034,7 @@ void CQuorumManager::StartCleanupOldQuorumDataThread(const CBlockIndex* pIndex) // window and it's better to have more room so we pick next cycle. // dkgMiningWindowStart for small quorums is 10 i.e. a safe block to start // these calculations is at height 576 + 24 * 2 + 10 = 576 + 58. - if ((!fMasternodeMode && !utils::IsWatchQuorumsEnabled()) || pIndex == nullptr || (pIndex->nHeight % 576 != 58)) { + if ((!fMasternodeMode && !IsWatchQuorumsEnabled()) || pIndex == nullptr || (pIndex->nHeight % 576 != 58)) { return; } diff --git a/src/llmq/quorums.h b/src/llmq/quorums.h index ba009e0de5af..1605271b77a3 100644 --- a/src/llmq/quorums.h +++ b/src/llmq/quorums.h @@ -35,9 +35,6 @@ namespace llmq class CDKGSessionManager; class CQuorumBlockProcessor; -// If true, we will connect to all new quorums and watch their communication -static constexpr bool DEFAULT_WATCH_QUORUMS{false}; - /** * Object used as a key to store CQuorumDataRequest */ diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index 0d286361eb06..745e179f956f 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -960,64 +960,6 @@ std::vector> GetEnabledQuoru return ret; } -bool QuorumDataRecoveryEnabled() -{ - return gArgs.GetBoolArg("-llmq-data-recovery", DEFAULT_ENABLE_QUORUM_DATA_RECOVERY); -} - -bool IsWatchQuorumsEnabled() -{ - static bool fIsWatchQuroumsEnabled = gArgs.GetBoolArg("-watchquorums", DEFAULT_WATCH_QUORUMS); - return fIsWatchQuroumsEnabled; -} - -std::map GetEnabledQuorumVvecSyncEntries() -{ - std::map mapQuorumVvecSyncEntries; - for (const auto& strEntry : gArgs.GetArgs("-llmq-qvvec-sync")) { - Consensus::LLMQType llmqType = Consensus::LLMQType::LLMQ_NONE; - QvvecSyncMode mode{QvvecSyncMode::Invalid}; - std::istringstream ssEntry(strEntry); - std::string strLLMQType, strMode, strTest; - const bool fLLMQTypePresent = std::getline(ssEntry, strLLMQType, ':') && strLLMQType != ""; - const bool fModePresent = std::getline(ssEntry, strMode, ':') && strMode != ""; - const bool fTooManyEntries = static_cast(std::getline(ssEntry, strTest, ':')); - if (!fLLMQTypePresent || !fModePresent || fTooManyEntries) { - throw std::invalid_argument(strprintf("Invalid format in -llmq-qvvec-sync: %s", strEntry)); - } - - if (auto optLLMQParams = ranges::find_if_opt(Params().GetConsensus().llmqs, - [&strLLMQType](const auto& params){return params.name == strLLMQType;})) { - llmqType = optLLMQParams->type; - } else { - throw std::invalid_argument(strprintf("Invalid llmqType in -llmq-qvvec-sync: %s", strEntry)); - } - if (mapQuorumVvecSyncEntries.count(llmqType) > 0) { - throw std::invalid_argument(strprintf("Duplicated llmqType in -llmq-qvvec-sync: %s", strEntry)); - } - - int32_t nMode; - if (ParseInt32(strMode, &nMode)) { - switch (nMode) { - case (int32_t)QvvecSyncMode::Always: - mode = QvvecSyncMode::Always; - break; - case (int32_t)QvvecSyncMode::OnlyIfTypeMember: - mode = QvvecSyncMode::OnlyIfTypeMember; - break; - default: - mode = QvvecSyncMode::Invalid; - break; - } - } - if (mode == QvvecSyncMode::Invalid) { - throw std::invalid_argument(strprintf("Invalid mode in -llmq-qvvec-sync: %s", strEntry)); - } - mapQuorumVvecSyncEntries.emplace(llmqType, mode); - } - return mapQuorumVvecSyncEntries; -} - template void InitQuorumsCache(CacheType& cache, bool limit_by_connections) { diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 0c6533666e92..d08d1d53554e 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -28,14 +28,6 @@ namespace llmq class CQuorumManager; class CQuorumSnapshot; -static const bool DEFAULT_ENABLE_QUORUM_DATA_RECOVERY = true; - -enum class QvvecSyncMode { - Invalid = -1, - Always = 0, - OnlyIfTypeMember = 1, -}; - namespace utils { @@ -61,15 +53,6 @@ bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumMana std::vector GetEnabledQuorumTypes(gsl::not_null pindex); std::vector> GetEnabledQuorumParams(gsl::not_null pindex); -/// Returns the state of `-llmq-data-recovery` -bool QuorumDataRecoveryEnabled(); - -/// Returns the state of `-watchquorums` -bool IsWatchQuorumsEnabled(); - -/// Returns the parsed entries given by `-llmq-qvvec-sync` -std::map GetEnabledQuorumVvecSyncEntries(); - template void InitQuorumsCache(CacheType& cache, bool limit_by_connections = true); diff --git a/src/net_processing.cpp b/src/net_processing.cpp index f2889fbbe3de..6e6b735eebdc 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -3085,7 +3086,7 @@ void PeerManagerImpl::ProcessMessage( // Tell our peer that he should send us CoinJoin queue messages m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::SENDDSQUEUE, true)); // Tell our peer that he should send us intra-quorum messages - if (llmq::utils::IsWatchQuorumsEnabled() && m_connman.IsMasternodeQuorumNode(&pfrom)) { + if (llmq::IsWatchQuorumsEnabled() && m_connman.IsMasternodeQuorumNode(&pfrom)) { m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::QWATCH)); } } From 0b5ad59319e7b0cabcb858b28b6abd243a6aeb6e Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 22:30:43 +0700 Subject: [PATCH 07/15] refactor: drop definition of GetHashModifier from header of llmq/utils That's an internal helper! --- src/llmq/utils.cpp | 2 +- src/llmq/utils.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index 745e179f956f..bfed2bc63b2a 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -70,7 +70,7 @@ static std::pair GetMNUsageBySnapsho static void BuildQuorumSnapshot(const Consensus::LLMQParams& llmqParams, const CDeterministicMNList& allMns, const CDeterministicMNList& mnUsedAtH, std::vector& sortedCombinedMns, CQuorumSnapshot& quorumSnapshot, int nHeight, std::vector& skipList, const CBlockIndex* pCycleQuorumBaseBlockIndex); -uint256 GetHashModifier(const Consensus::LLMQParams& llmqParams, gsl::not_null pCycleQuorumBaseBlockIndex) +static uint256 GetHashModifier(const Consensus::LLMQParams& llmqParams, gsl::not_null pCycleQuorumBaseBlockIndex) { ASSERT_IF_DEBUG(pCycleQuorumBaseBlockIndex->nHeight % llmqParams.dkgInterval == 0); const CBlockIndex* pWorkBlockIndex = pCycleQuorumBaseBlockIndex->GetAncestor(pCycleQuorumBaseBlockIndex->nHeight - 8); diff --git a/src/llmq/utils.h b/src/llmq/utils.h index d08d1d53554e..3ee3ab85c5b8 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -34,7 +34,6 @@ namespace utils // includes members which failed DKG std::vector GetAllQuorumMembers(Consensus::LLMQType llmqType, gsl::not_null pQuorumBaseBlockIndex, bool reset_cache = false); -uint256 GetHashModifier(const Consensus::LLMQParams& llmqParams, gsl::not_null pCycleQuorumBaseBlockIndex); uint256 BuildCommitmentHash(Consensus::LLMQType llmqType, const uint256& blockHash, const std::vector& validMembers, const CBLSPublicKey& pubKey, const uint256& vvecHash); uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash); From 19f7f00e2dab73808f37bfb57062632c3639b2f1 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 22:51:43 +0700 Subject: [PATCH 08/15] refactor: move helper BuildCommitmentHash from llmq/utils to llmq/commitment --- src/llmq/commitment.cpp | 15 ++++++++++++++- src/llmq/commitment.h | 2 ++ src/llmq/dkgsession.cpp | 4 ++-- src/llmq/dkgsession.h | 6 ++++-- src/llmq/utils.cpp | 16 ++-------------- src/llmq/utils.h | 2 -- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/llmq/commitment.cpp b/src/llmq/commitment.cpp index f4536886caba..358e00935516 100644 --- a/src/llmq/commitment.cpp +++ b/src/llmq/commitment.cpp @@ -112,7 +112,7 @@ bool CFinalCommitment::Verify(gsl::not_null pQuorumBaseBlock // sigs are only checked when the block is processed if (checkSigs) { - uint256 commitmentHash = utils::BuildCommitmentHash(llmq_params.type, quorumHash, validMembers, quorumPublicKey, quorumVvecHash); + uint256 commitmentHash = BuildCommitmentHash(llmq_params.type, quorumHash, validMembers, quorumPublicKey, quorumVvecHash); if (LogAcceptCategory(BCLog::LLMQ)) { std::stringstream ss3; for (const auto &mn: members) { @@ -236,4 +236,17 @@ bool CheckLLMQCommitment(const CTransaction& tx, gsl::not_null& validMembers, const CBLSPublicKey& pubKey, + const uint256& vvecHash) +{ + CHashWriter hw(SER_GETHASH, 0); + hw << llmqType; + hw << blockHash; + hw << DYNBITSET(validMembers); + hw << pubKey; + hw << vvecHash; + return hw.GetHash(); +} + } // namespace llmq diff --git a/src/llmq/commitment.h b/src/llmq/commitment.h index 15a066ed5379..2355fc661980 100644 --- a/src/llmq/commitment.h +++ b/src/llmq/commitment.h @@ -173,6 +173,8 @@ class CFinalCommitmentTxPayload bool CheckLLMQCommitment(const CTransaction& tx, gsl::not_null pindexPrev, TxValidationState& state); +uint256 BuildCommitmentHash(Consensus::LLMQType llmqType, const uint256& blockHash, const std::vector& validMembers, const CBLSPublicKey& pubKey, const uint256& vvecHash); + } // namespace llmq #endif // BITCOIN_LLMQ_COMMITMENT_H diff --git a/src/llmq/dkgsession.cpp b/src/llmq/dkgsession.cpp index 88f15bc4c364..000216e0eaf9 100644 --- a/src/llmq/dkgsession.cpp +++ b/src/llmq/dkgsession.cpp @@ -997,7 +997,7 @@ void CDKGSession::SendCommitment(CDKGPendingMessages& pendingMessages) (*qc.quorumVvecHash.begin())++; } - uint256 commitmentHash = utils::BuildCommitmentHash(qc.llmqType, qc.quorumHash, qc.validMembers, qc.quorumPublicKey, qc.quorumVvecHash); + uint256 commitmentHash = BuildCommitmentHash(qc.llmqType, qc.quorumHash, qc.validMembers, qc.quorumPublicKey, qc.quorumVvecHash); if (lieType == 2) { (*commitmentHash.begin())++; @@ -1230,7 +1230,7 @@ std::vector CDKGSession::FinalizeCommitments() fqc.nVersion = CFinalCommitment::GetVersion(isQuorumRotationEnabled, DeploymentActiveAfter(m_quorum_base_block_index, Params().GetConsensus(), Consensus::DEPLOYMENT_V19)); fqc.quorumIndex = isQuorumRotationEnabled ? quorumIndex : 0; - uint256 commitmentHash = utils::BuildCommitmentHash(fqc.llmqType, fqc.quorumHash, fqc.validMembers, fqc.quorumPublicKey, fqc.quorumVvecHash); + uint256 commitmentHash = BuildCommitmentHash(fqc.llmqType, fqc.quorumHash, fqc.validMembers, fqc.quorumPublicKey, fqc.quorumVvecHash); std::vector aggSigs; std::vector aggPks; diff --git a/src/llmq/dkgsession.h b/src/llmq/dkgsession.h index 04da988367fd..12fa48831d5d 100644 --- a/src/llmq/dkgsession.h +++ b/src/llmq/dkgsession.h @@ -10,14 +10,16 @@ #include #include -#include #include +#include #include class UniValue; class CInv; class CConnman; +class CDeterministicMN; +using CDeterministicMNCPtr = std::shared_ptr; namespace llmq { @@ -191,7 +193,7 @@ class CDKGPrematureCommitment [[nodiscard]] uint256 GetSignHash() const { - return utils::BuildCommitmentHash(llmqType, quorumHash, validMembers, quorumPublicKey, quorumVvecHash); + return BuildCommitmentHash(llmqType, quorumHash, validMembers, quorumPublicKey, quorumVvecHash); } }; diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index bfed2bc63b2a..1da5dd45142e 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -8,7 +8,6 @@ #include #include -#include #include #include #include @@ -26,6 +25,8 @@ #include #include +class CBLSSignature; + static constexpr int TESTNET_LLMQ_25_67_ACTIVATION_HEIGHT = 847000; /** @@ -631,19 +632,6 @@ std::pair GetMNUsageBySnapshot(const return std::make_pair(usedMNs, nonUsedMNs); } -uint256 BuildCommitmentHash(Consensus::LLMQType llmqType, const uint256& blockHash, - const std::vector& validMembers, const CBLSPublicKey& pubKey, - const uint256& vvecHash) -{ - CHashWriter hw(SER_GETHASH, 0); - hw << llmqType; - hw << blockHash; - hw << DYNBITSET(validMembers); - hw << pubKey; - hw << vvecHash; - return hw.GetHash(); -} - uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash) { CHashWriter h(SER_GETHASH, 0); diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 3ee3ab85c5b8..cfaa6a25f450 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -20,7 +20,6 @@ class CBlockIndex; class CDeterministicMN; class CDeterministicMNList; using CDeterministicMNCPtr = std::shared_ptr; -class CBLSPublicKey; namespace llmq { @@ -34,7 +33,6 @@ namespace utils // includes members which failed DKG std::vector GetAllQuorumMembers(Consensus::LLMQType llmqType, gsl::not_null pQuorumBaseBlockIndex, bool reset_cache = false); -uint256 BuildCommitmentHash(Consensus::LLMQType llmqType, const uint256& blockHash, const std::vector& validMembers, const CBLSPublicKey& pubKey, const uint256& vvecHash); uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash); uint256 DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2); From b555c837399de1c32d4e5805cb0103d57a5516a8 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 23:00:59 +0700 Subject: [PATCH 09/15] refactor: move BuildSignHash to llmq/signing --- src/evo/assetlocktx.cpp | 3 +-- src/evo/mnhftx.cpp | 3 +-- src/llmq/instantsend.cpp | 6 +++--- src/llmq/signing.cpp | 15 +++++++++++++-- src/llmq/signing.h | 3 +++ src/llmq/signing_shares.cpp | 4 ++-- src/llmq/utils.cpp | 10 ---------- src/llmq/utils.h | 2 -- src/rpc/quorums.cpp | 2 +- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/evo/assetlocktx.cpp b/src/evo/assetlocktx.cpp index d96c97e38ecd..748b7e48309d 100644 --- a/src/evo/assetlocktx.cpp +++ b/src/evo/assetlocktx.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include @@ -134,7 +133,7 @@ bool CAssetUnlockPayload::VerifySig(const uint256& msgHash, gsl::not_nullqc->quorumHash, requestId, msgHash); + if (const uint256 signHash = llmq::BuildSignHash(llmqType, quorum->qc->quorumHash, requestId, msgHash); quorumSig.VerifyInsecure(quorum->qc->quorumPublicKey, signHash)) { return true; } diff --git a/src/evo/mnhftx.cpp b/src/evo/mnhftx.cpp index 9c44e2a0d9dc..14a940274cd9 100644 --- a/src/evo/mnhftx.cpp +++ b/src/evo/mnhftx.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -93,7 +92,7 @@ bool MNHFTx::Verify(const uint256& quorumHash, const uint256& requestId, const u const Consensus::LLMQType& llmqType = Params().GetConsensus().llmqTypeMnhf; const auto quorum = llmq::quorumManager->GetQuorum(llmqType, quorumHash); - const uint256 signHash = llmq::utils::BuildSignHash(llmqType, quorum->qc->quorumHash, requestId, msgHash); + const uint256 signHash = llmq::BuildSignHash(llmqType, quorum->qc->quorumHash, requestId, msgHash); if (!sig.VerifyInsecure(quorum->qc->quorumPublicKey, signHash)) { return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-mnhf-invalid"); } diff --git a/src/llmq/instantsend.cpp b/src/llmq/instantsend.cpp index e44d4e7a6249..1bb5740a6e87 100644 --- a/src/llmq/instantsend.cpp +++ b/src/llmq/instantsend.cpp @@ -5,10 +5,10 @@ #include #include -#include -#include #include +#include #include +#include #include #include @@ -935,7 +935,7 @@ std::unordered_set CInstantSendManager::ProcessPend // should not happen, but if one fails to select, all others will also fail to select return {}; } - uint256 signHash = utils::BuildSignHash(llmq_params.type, quorum->qc->quorumHash, id, islock->txid); + uint256 signHash = BuildSignHash(llmq_params.type, quorum->qc->quorumHash, id, islock->txid); batchVerifier.PushMessage(nodeId, hash, signHash, islock->sig.Get(), quorum->qc->quorumPublicKey); verifyCount++; diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index 10e2447f81aa..2d9cec6b687d 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1065,13 +1066,23 @@ bool CSigningManager::VerifyRecoveredSig(Consensus::LLMQType llmqType, const CQu return false; } - uint256 signHash = utils::BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash); + uint256 signHash = BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash); return sig.VerifyInsecure(quorum->qc->quorumPublicKey, signHash); } uint256 CSigBase::buildSignHash() const { - return utils::BuildSignHash(llmqType, quorumHash, id, msgHash); + return BuildSignHash(llmqType, quorumHash, id, msgHash); +} + +uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash) +{ + CHashWriter h(SER_GETHASH, 0); + h << llmqType; + h << quorumHash; + h << id; + h << msgHash; + return h.GetHash(); } diff --git a/src/llmq/signing.h b/src/llmq/signing.h index 6e8db9c7f5e5..def2c4fd927b 100644 --- a/src/llmq/signing.h +++ b/src/llmq/signing.h @@ -263,6 +263,9 @@ void IterateNodesRandom(NodesContainer& nodeStates, Continue&& cont, Callback&& } } +uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash); + + } // namespace llmq #endif // BITCOIN_LLMQ_SIGNING_H diff --git a/src/llmq/signing_shares.cpp b/src/llmq/signing_shares.cpp index e5075d80a4b7..3c618c3cf924 100644 --- a/src/llmq/signing_shares.cpp +++ b/src/llmq/signing_shares.cpp @@ -754,7 +754,7 @@ void CSigSharesManager::TryRecoverSig(const CQuorumCPtr& quorum, const uint256& { LOCK(cs); - auto signHash = utils::BuildSignHash(quorum->params.type, quorum->qc->quorumHash, id, msgHash); + auto signHash = BuildSignHash(quorum->params.type, quorum->qc->quorumHash, id, msgHash); const auto* sigSharesForSignHash = sigShares.GetAllForSignHash(signHash); if (sigSharesForSignHash == nullptr) { return; @@ -1537,7 +1537,7 @@ void CSigSharesManager::ForceReAnnouncement(const CQuorumCPtr& quorum, Consensus } LOCK(cs); - auto signHash = utils::BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash); + auto signHash = BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash); if (const auto *const sigs = sigShares.GetAllForSignHash(signHash)) { for (const auto& [quorumMemberIndex, _] : *sigs) { // re-announce every sigshare to every node diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index 1da5dd45142e..bd58a651a2ee 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -632,16 +632,6 @@ std::pair GetMNUsageBySnapshot(const return std::make_pair(usedMNs, nonUsedMNs); } -uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash) -{ - CHashWriter h(SER_GETHASH, 0); - h << llmqType; - h << quorumHash; - h << id; - h << msgHash; - return h.GetHash(); -} - uint256 DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2) { // We need to deterministically select who is going to initiate the connection. The naive way would be to simply diff --git a/src/llmq/utils.h b/src/llmq/utils.h index cfaa6a25f450..082da3c9faea 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -33,8 +33,6 @@ namespace utils // includes members which failed DKG std::vector GetAllQuorumMembers(Consensus::LLMQType llmqType, gsl::not_null pQuorumBaseBlockIndex, bool reset_cache = false); -uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash); - uint256 DeterministicOutboundConnection(const uint256& proTxHash1, const uint256& proTxHash2); std::set GetQuorumConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, const uint256& forMember, bool onlyOutbound); std::set GetQuorumRelayMembers(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, const uint256& forMember, bool onlyOutbound); diff --git a/src/rpc/quorums.cpp b/src/rpc/quorums.cpp index e80fb2972685..0cd2140e911d 100644 --- a/src/rpc/quorums.cpp +++ b/src/rpc/quorums.cpp @@ -599,7 +599,7 @@ static UniValue quorum_sigs_cmd(const JSONRPCRequest& request, const LLMQContext throw JSONRPCError(RPC_INVALID_PARAMETER, "quorum not found"); } - uint256 signHash = llmq::utils::BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash); + uint256 signHash = llmq::BuildSignHash(llmqType, quorum->qc->quorumHash, id, msgHash); return sig.VerifyInsecure(quorum->qc->quorumPublicKey, signHash); } } else if (cmd == "quorumhasrecsig") { From c748448244e6642741cef9d958a6c3f0d2220a35 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 28 Dec 2023 00:33:51 +0700 Subject: [PATCH 10/15] refactor: move max_cycles and max_store_depth as a members of LLMQParams --- src/llmq/dkgsessionmgr.cpp | 3 ++- src/llmq/params.h | 12 ++++++++++++ src/llmq/quorums.cpp | 5 +++-- src/llmq/utils.h | 11 ----------- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/llmq/dkgsessionmgr.cpp b/src/llmq/dkgsessionmgr.cpp index 6458d98c1eee..c4f98537d70c 100644 --- a/src/llmq/dkgsessionmgr.cpp +++ b/src/llmq/dkgsessionmgr.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -497,7 +498,7 @@ void CDKGSessionManager::CleanupOldContributions() const } cnt_all++; const CBlockIndex* pindexQuorum = m_chainstate.m_blockman.LookupBlockIndex(std::get<2>(k)); - if (pindexQuorum == nullptr || m_chainstate.m_chain.Tip()->nHeight - pindexQuorum->nHeight > utils::max_store_depth(params)) { + if (pindexQuorum == nullptr || m_chainstate.m_chain.Tip()->nHeight - pindexQuorum->nHeight > params.max_store_depth()) { // not found or too old batch.Erase(k); cnt_old++; diff --git a/src/llmq/params.h b/src/llmq/params.h index 4d2cfae9e0f2..69fddfac0220 100644 --- a/src/llmq/params.h +++ b/src/llmq/params.h @@ -113,6 +113,18 @@ struct LLMQParams { // How many members should we try to send all sigShares to before we give up. int recoveryMembers; +public: + + [[ nodiscard ]] constexpr int max_cycles(int quorums_count) const + { + return useRotation ? quorums_count / signingActiveQuorumCount : quorums_count; + } + + // For how many blocks recent DKG info should be kept + [[ nodiscard ]] constexpr int max_store_depth() const + { + return max_cycles(keepOldKeys) * dkgInterval; + } }; //static_assert(std::is_trivial_v, "LLMQParams is not a trivial type"); diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index 670145330481..5b4c90204716 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -532,7 +533,7 @@ std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp // And we only do this for max_cycles() of the most recent quorums // because signing by old quorums requires the exact quorum hash to be specified // and quorum scanning isn't needed there. - scanQuorumsCache.try_emplace(llmq.type, utils::max_cycles(llmq, llmq.keepOldConnections) * (llmq.dkgMiningWindowEnd - llmq.dkgMiningWindowStart)); + scanQuorumsCache.try_emplace(llmq.type, llmq.max_cycles(llmq.keepOldConnections) * (llmq.dkgMiningWindowEnd - llmq.dkgMiningWindowStart)); } } auto& cache = scanQuorumsCache[llmqType]; @@ -1056,7 +1057,7 @@ void CQuorumManager::StartCleanupOldQuorumDataThread(const CBlockIndex* pIndex) auto& cache = cleanupQuorumsCache[params.type]; const CBlockIndex* pindex_loop{pIndex}; std::set quorum_keys; - while (pindex_loop != nullptr && pIndex->nHeight - pindex_loop->nHeight < utils::max_store_depth(params)) { + while (pindex_loop != nullptr && pIndex->nHeight - pindex_loop->nHeight < params.max_store_depth()) { uint256 quorum_key; if (cache.get(pindex_loop->GetBlockHash(), quorum_key)) { quorum_keys.insert(quorum_key); diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 082da3c9faea..061ec5b9ac33 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -51,17 +51,6 @@ std::vector> GetEnabledQuoru template void InitQuorumsCache(CacheType& cache, bool limit_by_connections = true); -[[ nodiscard ]] static constexpr int max_cycles(const Consensus::LLMQParams& llmqParams, int quorums_count) -{ - return llmqParams.useRotation ? quorums_count / llmqParams.signingActiveQuorumCount : quorums_count; -} - -[[ nodiscard ]] static constexpr int max_store_depth(const Consensus::LLMQParams& llmqParams) -{ - // For how many blocks recent DKG info should be kept - return max_cycles(llmqParams, llmqParams.keepOldKeys) * llmqParams.dkgInterval; -} - } // namespace utils [[ nodiscard ]] const std::optional GetLLMQParams(Consensus::LLMQType llmqType); From 3fbfc2e04d6f9842ee15c46c290081ba69f0dcb4 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 28 Dec 2023 01:29:51 +0700 Subject: [PATCH 11/15] refactor: move method IsQuorumActive to llmq/signing where it is used --- src/llmq/signing.cpp | 16 +++++++++++++--- src/llmq/signing.h | 1 + src/llmq/signing_shares.cpp | 6 +++--- src/llmq/utils.cpp | 11 ----------- src/llmq/utils.h | 1 - 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index 2d9cec6b687d..c4e673bcad76 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -566,7 +566,7 @@ bool CSigningManager::GetRecoveredSigForGetData(const uint256& hash, CRecoveredS if (!db.GetRecoveredSigByHash(hash, ret)) { return false; } - if (!utils::IsQuorumActive(ret.getLlmqType(), qman, ret.getQuorumHash())) { + if (!IsQuorumActive(ret.getLlmqType(), qman, ret.getQuorumHash())) { // we don't want to propagate sigs from inactive quorums return false; } @@ -633,7 +633,7 @@ bool CSigningManager::PreVerifyRecoveredSig(const CQuorumManager& quorum_manager recoveredSig.getQuorumHash().ToString()); return false; } - if (!utils::IsQuorumActive(llmqType, quorum_manager, quorum->qc->quorumHash)) { + if (!IsQuorumActive(llmqType, quorum_manager, quorum->qc->quorumHash)) { return false; } @@ -692,7 +692,7 @@ void CSigningManager::CollectPendingRecoveredSigsToVerify( it = v.erase(it); continue; } - if (!utils::IsQuorumActive(llmqType, qman, quorum->qc->quorumHash)) { + if (!IsQuorumActive(llmqType, qman, quorum->qc->quorumHash)) { LogPrint(BCLog::LLMQ, "CSigningManager::%s -- quorum %s not active anymore, node=%d\n", __func__, recSig->getQuorumHash().ToString(), nodeId); it = v.erase(it); @@ -1085,5 +1085,15 @@ uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, c return h.GetHash(); } +bool IsQuorumActive(Consensus::LLMQType llmqType, const CQuorumManager& qman, const uint256& quorumHash) +{ + // sig shares and recovered sigs are only accepted from recent/active quorums + // we allow one more active quorum as specified in consensus, as otherwise there is a small window where things could + // fail while we are on the brink of a new quorum + const auto& llmq_params_opt = GetLLMQParams(llmqType); + assert(llmq_params_opt.has_value()); + auto quorums = qman.ScanQuorums(llmqType, llmq_params_opt->keepOldConnections); + return ranges::any_of(quorums, [&quorumHash](const auto& q){ return q->qc->quorumHash == quorumHash; }); +} } // namespace llmq diff --git a/src/llmq/signing.h b/src/llmq/signing.h index def2c4fd927b..cf1eb54cfe6b 100644 --- a/src/llmq/signing.h +++ b/src/llmq/signing.h @@ -265,6 +265,7 @@ void IterateNodesRandom(NodesContainer& nodeStates, Continue&& cont, Callback&& uint256 BuildSignHash(Consensus::LLMQType llmqType, const uint256& quorumHash, const uint256& id, const uint256& msgHash); +bool IsQuorumActive(Consensus::LLMQType llmqType, const CQuorumManager& qman, const uint256& quorumHash); } // namespace llmq diff --git a/src/llmq/signing_shares.cpp b/src/llmq/signing_shares.cpp index 3c618c3cf924..8aaad849c563 100644 --- a/src/llmq/signing_shares.cpp +++ b/src/llmq/signing_shares.cpp @@ -462,7 +462,7 @@ void CSigSharesManager::ProcessMessageSigShare(NodeId fromId, const CSigShare& s if (!quorum) { return; } - if (!utils::IsQuorumActive(sigShare.getLlmqType(), qman, quorum->qc->quorumHash)) { + if (!IsQuorumActive(sigShare.getLlmqType(), qman, quorum->qc->quorumHash)) { // quorum is too old return; } @@ -511,7 +511,7 @@ bool CSigSharesManager::PreVerifyBatchedSigShares(const CQuorumManager& quorum_m { retBan = false; - if (!utils::IsQuorumActive(session.llmqType, quorum_manager, session.quorum->qc->quorumHash)) { + if (!IsQuorumActive(session.llmqType, quorum_manager, session.quorum->qc->quorumHash)) { // quorum is too old return false; } @@ -1262,7 +1262,7 @@ void CSigSharesManager::Cleanup() // Find quorums which became inactive for (auto it = quorums.begin(); it != quorums.end(); ) { - if (utils::IsQuorumActive(it->first.first, qman, it->first.second)) { + if (IsQuorumActive(it->first.first, qman, it->first.second)) { it->second = qman.GetQuorum(it->first.first, it->first.second); ++it; } else { diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index bd58a651a2ee..552d6ad21fbd 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -850,17 +850,6 @@ void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, gsl::not } } -bool IsQuorumActive(Consensus::LLMQType llmqType, const CQuorumManager& qman, const uint256& quorumHash) -{ - // sig shares and recovered sigs are only accepted from recent/active quorums - // we allow one more active quorum as specified in consensus, as otherwise there is a small window where things could - // fail while we are on the brink of a new quorum - const auto& llmq_params_opt = GetLLMQParams(llmqType); - assert(llmq_params_opt.has_value()); - auto quorums = qman.ScanQuorums(llmqType, llmq_params_opt->keepOldConnections); - return ranges::any_of(quorums, [&quorumHash](const auto& q){ return q->qc->quorumHash == quorumHash; }); -} - bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev) { return IsQuorumTypeEnabledInternal(llmqType, qman, pindexPrev, std::nullopt, std::nullopt); diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 061ec5b9ac33..3418bd30471a 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -41,7 +41,6 @@ std::set CalcDeterministicWatchConnections(Consensus::LLMQType llmqType, bool EnsureQuorumConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, CConnman& connman, const uint256& myProTxHash); void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, CConnman& connman, const uint256& myProTxHash); -bool IsQuorumActive(Consensus::LLMQType llmqType, const CQuorumManager& qman, const uint256& quorumHash); bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev); bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev, std::optional optDIP0024IsActive, std::optional optHaveDIP0024Quorums); From 61bee4dacea28d1a637a11f2766f61853024f92f Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 27 Dec 2023 22:18:47 +0700 Subject: [PATCH 12/15] refactor: inline code from helper GetLLMQParam() In the past implementation has been non-trivial: ```cpp return Params().GetConsensus().llmqs.at(llmqType); ``` But over time it was simplified and now does nothing but hide usage of global variable Params(): ```cpp return Params().GetLLMQ(llmqType); ``` Also it adds missing [[nodiscard]] for Params().GetLLMQ() Eventually it caused some circular dependencies to disapear. newly introduced circular dependencies are just longer pathes through same modules that has been in past short-circuited --- src/chainparams.h | 2 +- src/evo/cbtx.cpp | 7 +++---- src/evo/deterministicmns.cpp | 2 +- src/llmq/blockprocessor.cpp | 10 +++++----- src/llmq/commitment.cpp | 8 ++++---- src/llmq/debug.cpp | 4 ++-- src/llmq/dkgsessionmgr.cpp | 2 +- src/llmq/ehf_signals.cpp | 4 ++-- src/llmq/instantsend.cpp | 7 +++---- src/llmq/quorums.cpp | 8 ++++---- src/llmq/signing.cpp | 9 ++++----- src/llmq/signing_shares.cpp | 11 +++++------ src/llmq/snapshot.cpp | 3 +-- src/llmq/utils.cpp | 9 ++------- src/llmq/utils.h | 2 -- src/rpc/quorums.cpp | 16 ++++++++-------- test/lint/lint-circular-dependencies.sh | 5 ++++- 17 files changed, 50 insertions(+), 59 deletions(-) diff --git a/src/chainparams.h b/src/chainparams.h index e665b6aaf5f0..0b6535eecc42 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -152,7 +152,7 @@ class CChainParams int FulfilledRequestExpireTime() const { return nFulfilledRequestExpireTime; } const std::vector& SporkAddresses() const { return vSporkAddresses; } int MinSporkKeys() const { return nMinSporkKeys; } - std::optional GetLLMQ(Consensus::LLMQType llmqType) const; + [[nodiscard]] std::optional GetLLMQ(Consensus::LLMQType llmqType) const; protected: CChainParams() {} diff --git a/src/evo/cbtx.cpp b/src/evo/cbtx.cpp index 212a655057c6..b67d8439b7ad 100644 --- a/src/evo/cbtx.cpp +++ b/src/evo/cbtx.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -200,7 +199,7 @@ auto CachedGetQcHashesQcIndexedHashes(const CBlockIndex* pindexPrev, const llmq: qcIndexedHashes_cached.clear(); for (const auto& [llmqType, vecBlockIndexes] : quorums) { - const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); bool rotation_enabled = llmq::IsQuorumRotationEnabled(llmq_params_opt.value(), pindexPrev); auto& vec_hashes = qcHashes_cached[llmqType]; @@ -266,7 +265,7 @@ bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPre // having null commitments is ok but we don't use them here, move to the next tx continue; } - const auto& llmq_params_opt = llmq::GetLLMQParams(opt_qc->commitment.llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(opt_qc->commitment.llmqType); if (!llmq_params_opt.has_value()) { return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-commitment-type-calc-cbtx-quorummerkleroot"); } @@ -299,7 +298,7 @@ bool CalcCbTxMerkleRootQuorums(const CBlock& block, const CBlockIndex* pindexPre vec_hashes_final.reserve(CalcHashCountFromQCHashes(qcHashes)); for (const auto& [llmqType, vec_hashes] : qcHashes) { - const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); if (vec_hashes.size() > size_t(llmq_params_opt->signingActiveQuorumCount)) { return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "excess-quorums-calc-cbtx-quorummerkleroot"); diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index 4c74975ed078..3cca9b4b64f8 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -912,7 +912,7 @@ bool CDeterministicMNManager::BuildNewListFromBlock(const CBlock& block, gsl::no return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-payload"); } if (!opt_qc->commitment.IsNull()) { - const auto& llmq_params_opt = llmq::GetLLMQParams(opt_qc->commitment.llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(opt_qc->commitment.llmqType); if (!llmq_params_opt.has_value()) { return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "bad-qc-commitment-type"); } diff --git a/src/llmq/blockprocessor.cpp b/src/llmq/blockprocessor.cpp index 4d4a838d8e18..dd938b9f98f6 100644 --- a/src/llmq/blockprocessor.cpp +++ b/src/llmq/blockprocessor.cpp @@ -68,7 +68,7 @@ PeerMsgRet CQuorumBlockProcessor::ProcessMessage(const CNode& peer, std::string_ return tl::unexpected{100}; } - const auto& llmq_params_opt = GetLLMQParams(qc.llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(qc.llmqType); if (!llmq_params_opt.has_value()) { LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- invalid commitment type %d from peer=%d\n", __func__, ToUnderlying(qc.llmqType), peer.GetId()); @@ -218,7 +218,7 @@ bool CQuorumBlockProcessor::ProcessCommitment(int nHeight, const uint256& blockH { AssertLockHeld(cs_main); - const auto& llmq_params_opt = GetLLMQParams(qc.llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(qc.llmqType); if (!llmq_params_opt.has_value()) { LogPrint(BCLog::LLMQ, "CQuorumBlockProcessor::%s -- invalid commitment type %d\n", __func__, ToUnderlying(qc.llmqType)); return false; @@ -327,7 +327,7 @@ bool CQuorumBlockProcessor::UndoBlock(const CBlock& block, gsl::not_null CQuorumBlockProcessor::GetLastMinedCommitments std::vector> CQuorumBlockProcessor::GetLastMinedCommitmentsPerQuorumIndexUntilBlock(Consensus::LLMQType llmqType, const CBlockIndex* pindex, size_t cycle) const { - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); std::vector> ret; diff --git a/src/llmq/commitment.cpp b/src/llmq/commitment.cpp index 358e00935516..c637a117dedf 100644 --- a/src/llmq/commitment.cpp +++ b/src/llmq/commitment.cpp @@ -36,7 +36,7 @@ void LogPrintfFinalCommitment(Types... out) { bool CFinalCommitment::Verify(gsl::not_null pQuorumBaseBlockIndex, bool checkSigs) const { - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); if (!llmq_params_opt.has_value()) { LogPrintfFinalCommitment("q[%s] invalid llmqType=%d\n", quorumHash.ToString(), ToUnderlying(llmqType)); return false; @@ -147,7 +147,7 @@ bool CFinalCommitment::Verify(gsl::not_null pQuorumBaseBlock bool CFinalCommitment::VerifyNull() const { - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); if (!llmq_params_opt.has_value()) { LogPrintfFinalCommitment("q[%s]invalid llmqType=%d\n", quorumHash.ToString(), ToUnderlying(llmqType)); return false; @@ -182,9 +182,9 @@ bool CheckLLMQCommitment(const CTransaction& tx, gsl::not_nullnHeight, ToUnderlying(qcTx.commitment.llmqType)); + LogPrintfFinalCommitment("h[%d] GetLLMQ failed for llmqType[%d]\n", pindexPrev->nHeight, ToUnderlying(qcTx.commitment.llmqType)); return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-qc-commitment-type"); } diff --git a/src/llmq/debug.cpp b/src/llmq/debug.cpp index 6e4e5677c2c6..d6b272bd41c7 100644 --- a/src/llmq/debug.cpp +++ b/src/llmq/debug.cpp @@ -19,7 +19,7 @@ UniValue CDKGDebugSessionStatus::ToJson(int quorumIndex, int detailLevel) const { UniValue ret(UniValue::VOBJ); - if (!GetLLMQParams(llmqType).has_value() || quorumHash.IsNull()) { + if (!Params().GetLLMQ(llmqType).has_value() || quorumHash.IsNull()) { return ret; } @@ -118,7 +118,7 @@ UniValue CDKGDebugStatus::ToJson(int detailLevel) const // TODO Support array of sessions UniValue sessionsArrJson(UniValue::VARR); for (const auto& p : sessions) { - const auto& llmq_params_opt = GetLLMQParams(p.first.first); + const auto& llmq_params_opt = Params().GetLLMQ(p.first.first); if (!llmq_params_opt.has_value()) { continue; } diff --git a/src/llmq/dkgsessionmgr.cpp b/src/llmq/dkgsessionmgr.cpp index c4f98537d70c..0c13bc2e56e2 100644 --- a/src/llmq/dkgsessionmgr.cpp +++ b/src/llmq/dkgsessionmgr.cpp @@ -218,7 +218,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quor vRecv.Rewind(sizeof(uint256)); vRecv.Rewind(sizeof(uint8_t)); - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); if (!llmq_params_opt.has_value()) { LogPrintf("CDKGSessionManager -- invalid llmqType [%d]\n", ToUnderlying(llmqType)); m_peerman->Misbehaving(pfrom.GetId(), 100); diff --git a/src/llmq/ehf_signals.cpp b/src/llmq/ehf_signals.cpp index 697b6a9d0753..343020c389ae 100644 --- a/src/llmq/ehf_signals.cpp +++ b/src/llmq/ehf_signals.cpp @@ -6,11 +6,11 @@ #include #include #include -#include #include #include +#include #include #include #include // g_txindex @@ -65,7 +65,7 @@ void CEHFSignalsHandler::trySignEHFSignal(int bit, const CBlockIndex* const pind const uint256 requestId = mnhfPayload.GetRequestId(); const Consensus::LLMQType& llmqType = Params().GetConsensus().llmqTypeMnhf; - const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); if (!llmq_params_opt.has_value()) { return; } diff --git a/src/llmq/instantsend.cpp b/src/llmq/instantsend.cpp index 1bb5740a6e87..c5e3227b43b7 100644 --- a/src/llmq/instantsend.cpp +++ b/src/llmq/instantsend.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -694,7 +693,7 @@ void CInstantSendManager::TrySignInstantSendLock(const CTransaction& tx) } { - const auto &llmq_params_opt = GetLLMQParams(llmqType); + const auto &llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt); LOCK(cs_main); const auto dkgInterval = llmq_params_opt->dkgInterval; @@ -785,7 +784,7 @@ void CInstantSendManager::ProcessMessageInstantSendLock(const CNode& pfrom, cons // Deterministic islocks MUST use rotation based llmq auto llmqType = Params().GetConsensus().llmqTypeDIP0024InstantSend; - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt); if (blockIndex->nHeight % llmq_params_opt->dkgInterval != 0) { m_peerman->Misbehaving(pfrom.GetId(), 100); @@ -864,7 +863,7 @@ bool CInstantSendManager::ProcessPendingInstantSendLocks() //TODO Investigate if leaving this is ok auto llmqType = Params().GetConsensus().llmqTypeDIP0024InstantSend; - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt); const auto& llmq_params = llmq_params_opt.value(); auto dkgInterval = llmq_params.dkgInterval; diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index 5b4c90204716..f2e6ce69bd5f 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -371,7 +371,7 @@ CQuorumPtr CQuorumManager::BuildQuorumFromCommitment(const Consensus::LLMQType l } assert(qc->quorumHash == pQuorumBaseBlockIndex->GetBlockHash()); - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); auto quorum = std::make_shared(llmq_params_opt.value(), blsWorker); auto members = utils::GetAllQuorumMembers(qc->llmqType, pQuorumBaseBlockIndex); @@ -453,7 +453,7 @@ bool CQuorumManager::RequestQuorumData(CNode* pfrom, Consensus::LLMQType llmqTyp LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- pfrom is not a verified masternode\n", __func__); return false; } - if (!GetLLMQParams(llmqType).has_value()) { + if (!Params().GetLLMQ(llmqType).has_value()) { LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Invalid llmqType: %d\n", __func__, ToUnderlying(llmqType)); return false; } @@ -500,7 +500,7 @@ std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp } gsl::not_null pindexStore{pindexStart}; - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); // Quorum sets can only change during the mining phase of DKG. @@ -701,7 +701,7 @@ PeerMsgRet CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_t } } - if (!GetLLMQParams(request.GetLLMQType()).has_value()) { + if (!Params().GetLLMQ(request.GetLLMQType()).has_value()) { return sendQDATA(CQuorumDataRequest::Errors::QUORUM_TYPE_INVALID, request_limit_exceeded); } diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index c4e673bcad76..b47cb2483dea 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -621,7 +620,7 @@ bool CSigningManager::PreVerifyRecoveredSig(const CQuorumManager& quorum_manager retBan = false; auto llmqType = recoveredSig.getLlmqType(); - if (!GetLLMQParams(llmqType).has_value()) { + if (!Params().GetLLMQ(llmqType).has_value()) { retBan = true; return false; } @@ -897,7 +896,7 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares // This gives a slight risk of not getting enough shares to recover a signature // But at least it shouldn't be possible to get conflicting recovered signatures // TODO fix this by re-signing when the next block arrives, but only when that block results in a change of the quorum list and no recovered signature has been created in the mean time - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); quorum = SelectQuorumForSigning(llmq_params_opt.value(), qman, id); } else { @@ -1059,7 +1058,7 @@ CQuorumCPtr CSigningManager::SelectQuorumForSigning(const Consensus::LLMQParams& bool CSigningManager::VerifyRecoveredSig(Consensus::LLMQType llmqType, const CQuorumManager& quorum_manager, int signedAtHeight, const uint256& id, const uint256& msgHash, const CBLSSignature& sig, const int signOffset) { - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); auto quorum = SelectQuorumForSigning(llmq_params_opt.value(), quorum_manager, id, signedAtHeight, signOffset); if (!quorum) { @@ -1090,7 +1089,7 @@ bool IsQuorumActive(Consensus::LLMQType llmqType, const CQuorumManager& qman, co // sig shares and recovered sigs are only accepted from recent/active quorums // we allow one more active quorum as specified in consensus, as otherwise there is a small window where things could // fail while we are on the brink of a new quorum - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); auto quorums = qman.ScanQuorums(llmqType, llmq_params_opt->keepOldConnections); return ranges::any_of(quorums, [&quorumHash](const auto& q){ return q->qc->quorumHash == quorumHash; }); diff --git a/src/llmq/signing_shares.cpp b/src/llmq/signing_shares.cpp index 8aaad849c563..7567da2bf31a 100644 --- a/src/llmq/signing_shares.cpp +++ b/src/llmq/signing_shares.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -100,7 +99,7 @@ std::string CBatchedSigShares::ToInvString() const static void InitSession(CSigSharesNodeState::Session& s, const uint256& signHash, CSigBase from) { - const auto& llmq_params_opt = GetLLMQParams(from.getLlmqType()); + const auto& llmq_params_opt = Params().GetLLMQ(from.getLlmqType()); assert(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); @@ -300,7 +299,7 @@ void CSigSharesManager::ProcessMessage(const CNode& pfrom, const CSporkManager& bool CSigSharesManager::ProcessMessageSigSesAnn(const CNode& pfrom, const CSigSesAnn& ann) { auto llmqType = ann.getLlmqType(); - if (!GetLLMQParams(llmqType).has_value()) { + if (!Params().GetLLMQ(llmqType).has_value()) { return false; } if (ann.getSessionId() == UNINITIALIZED_SESSION_ID || ann.getQuorumHash().IsNull() || ann.getId().IsNull() || ann.getMsgHash().IsNull()) { @@ -331,7 +330,7 @@ bool CSigSharesManager::ProcessMessageSigSesAnn(const CNode& pfrom, const CSigSe bool CSigSharesManager::VerifySigSharesInv(Consensus::LLMQType llmqType, const CSigSharesInv& inv) { - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); return llmq_params_opt.has_value() && (inv.inv.size() == size_t(llmq_params_opt->size)); } @@ -904,7 +903,7 @@ void CSigSharesManager::CollectSigSharesToRequest(std::unordered_mapsize); } @@ -1053,7 +1052,7 @@ void CSigSharesManager::CollectSigSharesToAnnounce(std::unordered_mapgetLlmqType()); + const auto& llmq_params_opt = Params().GetLLMQ(sigShare->getLlmqType()); assert(llmq_params_opt.has_value()); inv.Init(llmq_params_opt->size); } diff --git a/src/llmq/snapshot.cpp b/src/llmq/snapshot.cpp index 49ab16182209..d460d2749616 100644 --- a/src/llmq/snapshot.cpp +++ b/src/llmq/snapshot.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include @@ -137,7 +136,7 @@ bool BuildQuorumRotationInfo(const CGetQuorumRotationInfo& request, CQuorumRotat Consensus::LLMQType llmqType = Params().GetConsensus().llmqTypeDIP0024InstantSend; // Since the returned quorums are in reversed order, the most recent one is at index 0 - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); const int cycleLength = llmq_params_opt->dkgInterval; diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index 552d6ad21fbd..ebd85d21326c 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -117,7 +117,7 @@ std::vector GetAllQuorumMembers(Consensus::LLMQType llmqTy } } - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); @@ -173,7 +173,7 @@ std::vector GetAllQuorumMembers(Consensus::LLMQType llmqTy std::vector ComputeQuorumMembers(Consensus::LLMQType llmqType, const CBlockIndex* pQuorumBaseBlockIndex) { bool EvoOnly = (Params().GetConsensus().llmqTypePlatform == llmqType) && IsV19Active(pQuorumBaseBlockIndex); - const auto& llmq_params_opt = GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); assert(llmq_params_opt.has_value()); if (llmq_params_opt->useRotation || pQuorumBaseBlockIndex->nHeight % llmq_params_opt->dkgInterval != 0) { ASSERT_IF_DEBUG(false); @@ -943,9 +943,4 @@ template void InitQuorumsCache GetLLMQParams(Consensus::LLMQType llmqType) -{ - return Params().GetLLMQ(llmqType); -} - } // namespace llmq diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 3418bd30471a..5a17048d565f 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -52,8 +52,6 @@ void InitQuorumsCache(CacheType& cache, bool limit_by_connections = true); } // namespace utils -[[ nodiscard ]] const std::optional GetLLMQParams(Consensus::LLMQType llmqType); - } // namespace llmq #endif // BITCOIN_LLMQ_UTILS_H diff --git a/src/rpc/quorums.cpp b/src/rpc/quorums.cpp index 0cd2140e911d..3f42dbf0385d 100644 --- a/src/rpc/quorums.cpp +++ b/src/rpc/quorums.cpp @@ -77,7 +77,7 @@ static UniValue quorum_list(const JSONRPCRequest& request, const ChainstateManag CBlockIndex* pindexTip = WITH_LOCK(cs_main, return chainman.ActiveChain().Tip()); for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pindexTip)) { - const auto& llmq_params_opt = llmq::GetLLMQParams(type); + const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); UniValue v(UniValue::VARR); @@ -142,7 +142,7 @@ static UniValue quorum_list_extended(const JSONRPCRequest& request, const Chains CBlockIndex* pblockindex = nHeight != -1 ? WITH_LOCK(cs_main, return chainman.ActiveChain()[nHeight]) : WITH_LOCK(cs_main, return chainman.ActiveChain().Tip()); for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pblockindex)) { - const auto& llmq_params_opt = llmq::GetLLMQParams(type); + const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); UniValue v(UniValue::VARR); @@ -242,7 +242,7 @@ static UniValue quorum_info(const JSONRPCRequest& request, const LLMQContext& ll quorum_info_help(request); Consensus::LLMQType llmqType = (Consensus::LLMQType)ParseInt32V(request.params[0], "llmqType"); - if (!llmq::GetLLMQParams(llmqType).has_value()) { + if (!Params().GetLLMQ(llmqType).has_value()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid LLMQ type"); } @@ -300,7 +300,7 @@ static UniValue quorum_dkgstatus(const JSONRPCRequest& request, const Chainstate UniValue minableCommitments(UniValue::VARR); UniValue quorumArrConnections(UniValue::VARR); for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pindexTip)) { - const auto& llmq_params_opt = llmq::GetLLMQParams(type); + const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); bool rotation_enabled = llmq::IsQuorumRotationEnabled(llmq_params, pindexTip); @@ -404,7 +404,7 @@ static UniValue quorum_memberof(const JSONRPCRequest& request, const ChainstateM UniValue result(UniValue::VARR); for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pindexTip)) { - const auto& llmq_params_opt = llmq::GetLLMQParams(type); + const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); size_t count = llmq_params_opt->signingActiveQuorumCount; if (scanQuorumsCount != -1) { @@ -526,7 +526,7 @@ static UniValue quorum_sigs_cmd(const JSONRPCRequest& request, const LLMQContext Consensus::LLMQType llmqType = (Consensus::LLMQType)ParseInt32V(request.params[0], "llmqType"); - const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); if (!llmq_params_opt.has_value()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid LLMQ type"); } @@ -639,7 +639,7 @@ static UniValue quorum_selectquorum(const JSONRPCRequest& request, const LLMQCon quorum_selectquorum_help(request); Consensus::LLMQType llmqType = (Consensus::LLMQType)ParseInt32V(request.params[0], "llmqType"); - const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); if (!llmq_params_opt.has_value()) { throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid LLMQ type"); } @@ -988,7 +988,7 @@ static UniValue verifyislock(const JSONRPCRequest& request) auto llmqType = Params().GetConsensus().llmqTypeDIP0024InstantSend; // First check against the current active set, if it fails check against the last active set - const auto& llmq_params_opt = llmq::GetLLMQParams(llmqType); + const auto& llmq_params_opt = Params().GetLLMQ(llmqType); CHECK_NONFATAL(llmq_params_opt.has_value()); int signOffset{llmq_params_opt->dkgInterval}; return llmq_ctx.sigman->VerifyRecoveredSig(llmqType, *llmq_ctx.qman, signHeight, id, txid, sig, 0) || diff --git a/test/lint/lint-circular-dependencies.sh b/test/lint/lint-circular-dependencies.sh index d60ad8960e82..ce88be77ded9 100755 --- a/test/lint/lint-circular-dependencies.sh +++ b/test/lint/lint-circular-dependencies.sh @@ -74,6 +74,7 @@ EXPECTED_CIRCULAR_DEPENDENCIES=( "llmq/dkgsession -> llmq/dkgsessionmgr -> llmq/dkgsession" "llmq/chainlocks -> validation -> llmq/chainlocks" "coinjoin/coinjoin -> llmq/chainlocks -> net -> coinjoin/coinjoin" + "evo/deterministicmns -> llmq/utils -> llmq/snapshot -> evo/simplifiedmns -> evo/deterministicmns" "evo/deterministicmns -> llmq/utils -> net -> evo/deterministicmns" "policy/policy -> policy/settings -> policy/policy" "evo/specialtxman -> validation -> evo/specialtxman" @@ -81,10 +82,12 @@ EXPECTED_CIRCULAR_DEPENDENCIES=( "consensus/tx_verify -> evo/assetlocktx -> llmq/signing -> net_processing -> txmempool -> consensus/tx_verify" "evo/assetlocktx -> llmq/signing -> net_processing -> txmempool -> evo/assetlocktx" + "evo/simplifiedmns -> llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> evo/simplifiedmns" + "llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> llmq/blockprocessor" "llmq/context -> llmq/dkgsessionmgr -> net_processing -> llmq/context" "llmq/dkgsession -> llmq/dkgsessionmgr -> llmq/quorums -> llmq/dkgsession" "llmq/dkgsessionmgr -> llmq/quorums -> llmq/dkgsessionmgr" - "llmq/snapshot -> llmq/utils -> llmq/snapshot" + "llmq/commitment -> llmq/utils -> llmq/snapshot -> llmq/commitment" "spork -> validation -> spork" "governance/governance -> validation -> governance/governance" "evo/deterministicmns -> validationinterface -> governance/vote -> evo/deterministicmns" From b8a086d5e7d6c0307f429e3844e4331ffb036c89 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 28 Dec 2023 00:58:35 +0700 Subject: [PATCH 13/15] fix: removed dependency IsQuorumEnabled on CQuorumManager It seems as it is an artefact from non-deterministic IS. It used only for LLMQ_TEST_INSTANTSEND quorum and doesn't look useful. Removing this dependency helps to: - simplify implementation of many classes significantly so far as they don't need to pass quorumManager to low-level helpers - achieved significant progress of de-globalization quorumManager. Only one step left (evo/assertlocks, evo/creditpool, evo/mnhftx) and we can drop global variable ::quorumManager - disapeared 2 circular dependencies through llmq/quorum --- src/llmq/dkgsessionmgr.cpp | 6 ++--- src/llmq/dkgsessionmgr.h | 3 +-- src/llmq/quorums.cpp | 2 +- src/llmq/utils.cpp | 22 +++++++---------- src/llmq/utils.h | 5 ++-- src/net_processing.cpp | 2 +- src/test/evo_utils_tests.cpp | 30 +++++++++--------------- test/functional/feature_llmq_rotation.py | 5 ++-- test/lint/lint-circular-dependencies.sh | 2 -- 9 files changed, 30 insertions(+), 47 deletions(-) diff --git a/src/llmq/dkgsessionmgr.cpp b/src/llmq/dkgsessionmgr.cpp index 0c13bc2e56e2..c271f2f05e41 100644 --- a/src/llmq/dkgsessionmgr.cpp +++ b/src/llmq/dkgsessionmgr.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -15,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -174,7 +174,7 @@ void CDKGSessionManager::UpdatedBlockTip(const CBlockIndex* pindexNew, bool fIni } } -void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quorum_manager, const std::string& msg_type, CDataStream& vRecv) +void CDKGSessionManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv) { static Mutex cs_indexedQuorumsCache; static std::map> indexedQuorumsCache GUARDED_BY(cs_indexedQuorumsCache); @@ -247,7 +247,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const CQuorumManager& quor return; } - if (!utils::IsQuorumTypeEnabled(llmqType, quorum_manager, pQuorumBaseBlockIndex->pprev)) { + if (!utils::IsQuorumTypeEnabled(llmqType, pQuorumBaseBlockIndex->pprev)) { LogPrintf("CDKGSessionManager -- llmqType [%d] quorums aren't active\n", ToUnderlying(llmqType)); m_peerman->Misbehaving(pfrom.GetId(), 100); return; diff --git a/src/llmq/dkgsessionmgr.h b/src/llmq/dkgsessionmgr.h index e5db884bdbd5..ea72fc588b83 100644 --- a/src/llmq/dkgsessionmgr.h +++ b/src/llmq/dkgsessionmgr.h @@ -24,7 +24,6 @@ class UniValue; namespace llmq { -class CQuorumManager; class CDKGSessionManager { @@ -74,7 +73,7 @@ class CDKGSessionManager void UpdatedBlockTip(const CBlockIndex *pindexNew, bool fInitialDownload); - void ProcessMessage(CNode& pfrom, const CQuorumManager& quorum_manager, const std::string& msg_type, CDataStream& vRecv); + void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv); bool AlreadyHave(const CInv& inv) const; bool GetContribution(const uint256& hash, CDKGContribution& ret) const; bool GetComplaint(const uint256& hash, CDKGComplaint& ret) const; diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index f2e6ce69bd5f..dab3a4f32260 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -495,7 +495,7 @@ std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqType, const CBlockIndex* pindexStart, size_t nCountRequested) const { - if (pindexStart == nullptr || nCountRequested == 0 || !IsQuorumTypeEnabled(llmqType, *this, pindexStart)) { + if (pindexStart == nullptr || nCountRequested == 0 || !utils::IsQuorumTypeEnabled(llmqType, pindexStart)) { return {}; } diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index ebd85d21326c..9fea9ecc0813 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -101,7 +101,7 @@ std::vector GetAllQuorumMembers(Consensus::LLMQType llmqTy static std::map, StaticSaltedHasher>> mapQuorumMembers GUARDED_BY(cs_members); static RecursiveMutex cs_indexed_members; static std::map, std::vector, StaticSaltedHasher>> mapIndexedQuorumMembers GUARDED_BY(cs_indexed_members); - if (!IsQuorumTypeEnabled(llmqType, *llmq::quorumManager, pQuorumBaseBlockIndex->pprev)) { + if (!IsQuorumTypeEnabled(llmqType, pQuorumBaseBlockIndex->pprev)) { return {}; } std::vector quorumMembers; @@ -850,13 +850,13 @@ void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, gsl::not } } -bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev) +bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, gsl::not_null pindexPrev) { - return IsQuorumTypeEnabledInternal(llmqType, qman, pindexPrev, std::nullopt, std::nullopt); + return IsQuorumTypeEnabledInternal(llmqType, pindexPrev, std::nullopt); } -bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev, - std::optional optDIP0024IsActive, std::optional optHaveDIP0024Quorums) +bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, gsl::not_null pindexPrev, + std::optional optDIP0024IsActive) { const Consensus::Params& consensusParams = Params().GetConsensus(); @@ -868,13 +868,9 @@ bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumMana case Consensus::LLMQType::LLMQ_50_60: if (Params().NetworkIDString() == CBaseChainParams::TESTNET) return true; // fall through - case Consensus::LLMQType::LLMQ_TEST_INSTANTSEND: { - if (!fDIP0024IsActive) return true; + case Consensus::LLMQType::LLMQ_TEST_INSTANTSEND: + return !fDIP0024IsActive; - const bool fHaveDIP0024Quorums{optHaveDIP0024Quorums.value_or(!qman.ScanQuorums( - consensusParams.llmqTypeDIP0024InstantSend, pindexPrev, 1).empty())}; - return !fHaveDIP0024Quorums; - } case Consensus::LLMQType::LLMQ_TEST: case Consensus::LLMQType::LLMQ_TEST_PLATFORM: case Consensus::LLMQType::LLMQ_400_60: @@ -909,7 +905,7 @@ std::vector GetEnabledQuorumTypes(gsl::not_null ret; ret.reserve(Params().GetConsensus().llmqs.size()); for (const auto& params : Params().GetConsensus().llmqs) { - if (IsQuorumTypeEnabled(params.type, *llmq::quorumManager, pindex)) { + if (IsQuorumTypeEnabled(params.type, pindex)) { ret.push_back(params.type); } } @@ -922,7 +918,7 @@ std::vector> GetEnabledQuoru ret.reserve(Params().GetConsensus().llmqs.size()); std::copy_if(Params().GetConsensus().llmqs.begin(), Params().GetConsensus().llmqs.end(), std::back_inserter(ret), - [&pindex](const auto& params){return IsQuorumTypeEnabled(params.type, *llmq::quorumManager, pindex);}); + [&pindex](const auto& params){return IsQuorumTypeEnabled(params.type, pindex);}); return ret; } diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 5a17048d565f..88f0b2ea4fed 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -24,7 +24,6 @@ using CDeterministicMNCPtr = std::shared_ptr; namespace llmq { -class CQuorumManager; class CQuorumSnapshot; namespace utils @@ -41,8 +40,8 @@ std::set CalcDeterministicWatchConnections(Consensus::LLMQType llmqType, bool EnsureQuorumConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, CConnman& connman, const uint256& myProTxHash); void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, CConnman& connman, const uint256& myProTxHash); -bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev); -bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, const CQuorumManager& qman, gsl::not_null pindexPrev, std::optional optDIP0024IsActive, std::optional optHaveDIP0024Quorums); +bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, gsl::not_null pindexPrev); +bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, gsl::not_null pindexPrev, std::optional optDIP0024IsActive); std::vector GetEnabledQuorumTypes(gsl::not_null pindex); std::vector> GetEnabledQuorumParams(gsl::not_null pindex); diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 6e6b735eebdc..b8836fb3a224 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -4354,7 +4354,7 @@ void PeerManagerImpl::ProcessMessage( ProcessPeerMsgRet(m_govman.ProcessMessage(pfrom, m_connman, msg_type, vRecv), pfrom); ProcessPeerMsgRet(CMNAuth::ProcessMessage(pfrom, m_connman, msg_type, vRecv), pfrom); ProcessPeerMsgRet(m_llmq_ctx->quorum_block_processor->ProcessMessage(pfrom, msg_type, vRecv), pfrom); - m_llmq_ctx->qdkgsman->ProcessMessage(pfrom, *m_llmq_ctx->qman, msg_type, vRecv); + m_llmq_ctx->qdkgsman->ProcessMessage(pfrom, msg_type, vRecv); ProcessPeerMsgRet(m_llmq_ctx->qman->ProcessMessage(pfrom, msg_type, vRecv), pfrom); m_llmq_ctx->shareman->ProcessMessage(pfrom, *sporkManager, msg_type, vRecv); m_llmq_ctx->sigman->ProcessMessage(pfrom, msg_type, vRecv); diff --git a/src/test/evo_utils_tests.cpp b/src/test/evo_utils_tests.cpp index dcf4e95fed63..2660ddcbde84 100644 --- a/src/test/evo_utils_tests.cpp +++ b/src/test/evo_utils_tests.cpp @@ -4,9 +4,7 @@ #include -#include #include -#include #include #include @@ -18,35 +16,29 @@ /* TODO: rename this file and test to llmq_utils_test */ BOOST_AUTO_TEST_SUITE(evo_utils_tests) -void Test(llmq::CQuorumManager& qman, NodeContext& node) +void Test(NodeContext& node) { using namespace llmq::utils; auto tip = node.chainman->ActiveTip(); const auto& consensus_params = Params().GetConsensus(); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeDIP0024InstantSend, qman, tip, false, false), false); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeDIP0024InstantSend, qman, tip, true, false), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeDIP0024InstantSend, qman, tip, true, true), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeChainLocks, qman, tip, false, false), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeChainLocks, qman, tip, true, false), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeChainLocks, qman, tip, true, true), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypePlatform, qman, tip, false, false), Params().IsTestChain()); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypePlatform, qman, tip, true, false), Params().IsTestChain()); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypePlatform, qman, tip, true, true), Params().IsTestChain()); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeMnhf, qman, tip, false, false), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeMnhf, qman, tip, true, false), true); - BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeMnhf, qman, tip, true, true), true); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeDIP0024InstantSend, tip, false), false); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeDIP0024InstantSend, tip, true), true); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeChainLocks, tip, false ), true); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeChainLocks, tip, true), true); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypePlatform, tip, false), Params().IsTestChain()); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypePlatform, tip, true), Params().IsTestChain()); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeMnhf, tip, false), true); + BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeMnhf, tip, true), true); } BOOST_FIXTURE_TEST_CASE(utils_IsQuorumTypeEnabled_tests_regtest, RegTestingSetup) { - assert(m_node.llmq_ctx->qman); - Test(*m_node.llmq_ctx->qman, m_node); + Test(m_node); } BOOST_FIXTURE_TEST_CASE(utils_IsQuorumTypeEnabled_tests_mainnet, TestingSetup) { - assert(m_node.llmq_ctx->qman); - Test(*m_node.llmq_ctx->qman, m_node); + Test(m_node); } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/functional/feature_llmq_rotation.py b/test/functional/feature_llmq_rotation.py index b7308fdaf697..54e05709322d 100755 --- a/test/functional/feature_llmq_rotation.py +++ b/test/functional/feature_llmq_rotation.py @@ -158,13 +158,12 @@ def run_test(self): q_100_0 = QuorumId(100, int(quorum_info_0_0["quorumHash"], 16)) q_102_0 = QuorumId(102, int(quorum_info_0_0["quorumHash"], 16)) - q_104_0 = QuorumId(104, int(quorum_info_0_0["quorumHash"], 16)) q_103_0_0 = QuorumId(103, int(quorum_info_0_0["quorumHash"], 16)) q_103_0_1 = QuorumId(103, int(quorum_info_0_1["quorumHash"], 16)) b_1 = self.nodes[0].getbestblockhash() - expectedDeleted = [h_100_0, h_104_0] - expectedNew = [q_100_0, q_102_0, q_104_0, q_103_0_0, q_103_0_1] + expectedDeleted = [h_100_0] + expectedNew = [q_100_0, q_102_0, q_103_0_0, q_103_0_1] quorumList = self.test_getmnlistdiff_quorums(b_0, b_1, quorumList, expectedDeleted, expectedNew) self.log.info("Wait for chainlock") diff --git a/test/lint/lint-circular-dependencies.sh b/test/lint/lint-circular-dependencies.sh index ce88be77ded9..3ad88a486c60 100755 --- a/test/lint/lint-circular-dependencies.sh +++ b/test/lint/lint-circular-dependencies.sh @@ -85,8 +85,6 @@ EXPECTED_CIRCULAR_DEPENDENCIES=( "evo/simplifiedmns -> llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> evo/simplifiedmns" "llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> llmq/blockprocessor" "llmq/context -> llmq/dkgsessionmgr -> net_processing -> llmq/context" - "llmq/dkgsession -> llmq/dkgsessionmgr -> llmq/quorums -> llmq/dkgsession" - "llmq/dkgsessionmgr -> llmq/quorums -> llmq/dkgsessionmgr" "llmq/commitment -> llmq/utils -> llmq/snapshot -> llmq/commitment" "spork -> validation -> spork" "governance/governance -> validation -> governance/governance" From 69d6e9ef3c71ead082a568650646151b829c148b Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 28 Dec 2023 03:09:20 +0700 Subject: [PATCH 14/15] refactor: moving options helpers 'Is Quorum <...>' to llmq/options --- src/llmq/blockprocessor.cpp | 4 +- src/llmq/dkgsessionmgr.cpp | 2 +- src/llmq/options.cpp | 77 +++++++++++++++++++++++++++++++++++- src/llmq/options.h | 8 ++++ src/llmq/quorums.cpp | 2 +- src/llmq/utils.cpp | 76 ----------------------------------- src/llmq/utils.h | 11 +----- src/miner.cpp | 4 +- src/rpc/quorums.cpp | 8 ++-- src/test/evo_utils_tests.cpp | 6 +-- 10 files changed, 98 insertions(+), 100 deletions(-) diff --git a/src/llmq/blockprocessor.cpp b/src/llmq/blockprocessor.cpp index dd938b9f98f6..524e80c48946 100644 --- a/src/llmq/blockprocessor.cpp +++ b/src/llmq/blockprocessor.cpp @@ -28,7 +28,7 @@ static void PreComputeQuorumMembers(const CBlockIndex* pindex, bool reset_cache = false) { - for (const Consensus::LLMQParams& params : llmq::utils::GetEnabledQuorumParams(pindex->pprev)) { + for (const Consensus::LLMQParams& params : llmq::GetEnabledQuorumParams(pindex->pprev)) { if (llmq::IsQuorumRotationEnabled(params, pindex) && (pindex->nHeight % params.dkgInterval == 0)) { llmq::utils::GetAllQuorumMembers(params.type, pindex, reset_cache); } @@ -166,7 +166,7 @@ bool CQuorumBlockProcessor::ProcessBlock(const CBlock& block, gsl::not_nullpprev)) { + for (const Consensus::LLMQParams& params : GetEnabledQuorumParams(pindex->pprev)) { // skip these checks when replaying blocks after the crash if (m_chainstate.m_chain.Tip() == nullptr) { break; diff --git a/src/llmq/dkgsessionmgr.cpp b/src/llmq/dkgsessionmgr.cpp index c271f2f05e41..2f94a4dc549b 100644 --- a/src/llmq/dkgsessionmgr.cpp +++ b/src/llmq/dkgsessionmgr.cpp @@ -247,7 +247,7 @@ void CDKGSessionManager::ProcessMessage(CNode& pfrom, const std::string& msg_typ return; } - if (!utils::IsQuorumTypeEnabled(llmqType, pQuorumBaseBlockIndex->pprev)) { + if (!IsQuorumTypeEnabled(llmqType, pQuorumBaseBlockIndex->pprev)) { LogPrintf("CDKGSessionManager -- llmqType [%d] quorums aren't active\n", ToUnderlying(llmqType)); m_peerman->Misbehaving(pfrom.GetId(), 100); return; diff --git a/src/llmq/options.cpp b/src/llmq/options.cpp index 1a8f16078b17..447e1dc160b0 100644 --- a/src/llmq/options.cpp +++ b/src/llmq/options.cpp @@ -10,9 +10,12 @@ #include #include #include +#include -#include #include +#include + +static constexpr int TESTNET_LLMQ_25_67_ACTIVATION_HEIGHT = 847000; namespace llmq { @@ -111,4 +114,76 @@ std::map GetEnabledQuorumVvecSyncEntries() return mapQuorumVvecSyncEntries; } +bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, gsl::not_null pindexPrev) +{ + return IsQuorumTypeEnabledInternal(llmqType, pindexPrev, std::nullopt); +} + +bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, gsl::not_null pindexPrev, + std::optional optDIP0024IsActive) +{ + const Consensus::Params& consensusParams = Params().GetConsensus(); + + const bool fDIP0024IsActive{optDIP0024IsActive.value_or(DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_DIP0024))}; + switch (llmqType) + { + case Consensus::LLMQType::LLMQ_DEVNET: + return true; + case Consensus::LLMQType::LLMQ_50_60: + if (Params().NetworkIDString() == CBaseChainParams::TESTNET) return true; + // fall through + case Consensus::LLMQType::LLMQ_TEST_INSTANTSEND: + return !fDIP0024IsActive; + + case Consensus::LLMQType::LLMQ_TEST: + case Consensus::LLMQType::LLMQ_TEST_PLATFORM: + case Consensus::LLMQType::LLMQ_400_60: + case Consensus::LLMQType::LLMQ_400_85: + case Consensus::LLMQType::LLMQ_DEVNET_PLATFORM: + return true; + + case Consensus::LLMQType::LLMQ_TEST_V17: { + return DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_TESTDUMMY); + } + case Consensus::LLMQType::LLMQ_100_67: + return DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_DIP0020); + + case Consensus::LLMQType::LLMQ_60_75: + case Consensus::LLMQType::LLMQ_DEVNET_DIP0024: + case Consensus::LLMQType::LLMQ_TEST_DIP0024: { + return fDIP0024IsActive; + } + case Consensus::LLMQType::LLMQ_25_67: + return pindexPrev->nHeight >= TESTNET_LLMQ_25_67_ACTIVATION_HEIGHT; + + default: + throw std::runtime_error(strprintf("%s: Unknown LLMQ type %d", __func__, ToUnderlying(llmqType))); + } + + // Something wrong with conditions above, they are not consistent + assert(false); +} + +std::vector GetEnabledQuorumTypes(gsl::not_null pindex) +{ + std::vector ret; + ret.reserve(Params().GetConsensus().llmqs.size()); + for (const auto& params : Params().GetConsensus().llmqs) { + if (IsQuorumTypeEnabled(params.type, pindex)) { + ret.push_back(params.type); + } + } + return ret; +} + +std::vector> GetEnabledQuorumParams(gsl::not_null pindex) +{ + std::vector> ret; + ret.reserve(Params().GetConsensus().llmqs.size()); + + std::copy_if(Params().GetConsensus().llmqs.begin(), Params().GetConsensus().llmqs.end(), std::back_inserter(ret), + [&pindex](const auto& params){return IsQuorumTypeEnabled(params.type, pindex);}); + + return ret; +} } // namespace llmq diff --git a/src/llmq/options.h b/src/llmq/options.h index 4c65263369cf..17e85dc0f113 100644 --- a/src/llmq/options.h +++ b/src/llmq/options.h @@ -9,6 +9,8 @@ #include #include +#include +#include class CBlockIndex; @@ -40,6 +42,12 @@ bool IsWatchQuorumsEnabled(); /// Returns the parsed entries given by `-llmq-qvvec-sync` std::map GetEnabledQuorumVvecSyncEntries(); +bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, gsl::not_null pindexPrev); +bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, gsl::not_null pindexPrev, std::optional optDIP0024IsActive); + +std::vector GetEnabledQuorumTypes(gsl::not_null pindex); +std::vector> GetEnabledQuorumParams(gsl::not_null pindex); + } // namespace llmq #endif // BITCOIN_LLMQ_OPTIONS_H diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index dab3a4f32260..6e99b231e7ba 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -495,7 +495,7 @@ std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqTyp std::vector CQuorumManager::ScanQuorums(Consensus::LLMQType llmqType, const CBlockIndex* pindexStart, size_t nCountRequested) const { - if (pindexStart == nullptr || nCountRequested == 0 || !utils::IsQuorumTypeEnabled(llmqType, pindexStart)) { + if (pindexStart == nullptr || nCountRequested == 0 || !IsQuorumTypeEnabled(llmqType, pindexStart)) { return {}; } diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index 9fea9ecc0813..ad7a5121539a 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -20,15 +20,12 @@ #include #include #include -#include #include #include class CBLSSignature; -static constexpr int TESTNET_LLMQ_25_67_ACTIVATION_HEIGHT = 847000; - /** * Forward declarations */ @@ -850,79 +847,6 @@ void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, gsl::not } } -bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, gsl::not_null pindexPrev) -{ - return IsQuorumTypeEnabledInternal(llmqType, pindexPrev, std::nullopt); -} - -bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, gsl::not_null pindexPrev, - std::optional optDIP0024IsActive) -{ - const Consensus::Params& consensusParams = Params().GetConsensus(); - - const bool fDIP0024IsActive{optDIP0024IsActive.value_or(DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_DIP0024))}; - switch (llmqType) - { - case Consensus::LLMQType::LLMQ_DEVNET: - return true; - case Consensus::LLMQType::LLMQ_50_60: - if (Params().NetworkIDString() == CBaseChainParams::TESTNET) return true; - // fall through - case Consensus::LLMQType::LLMQ_TEST_INSTANTSEND: - return !fDIP0024IsActive; - - case Consensus::LLMQType::LLMQ_TEST: - case Consensus::LLMQType::LLMQ_TEST_PLATFORM: - case Consensus::LLMQType::LLMQ_400_60: - case Consensus::LLMQType::LLMQ_400_85: - case Consensus::LLMQType::LLMQ_DEVNET_PLATFORM: - return true; - - case Consensus::LLMQType::LLMQ_TEST_V17: { - return DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_TESTDUMMY); - } - case Consensus::LLMQType::LLMQ_100_67: - return DeploymentActiveAfter(pindexPrev, consensusParams, Consensus::DEPLOYMENT_DIP0020); - - case Consensus::LLMQType::LLMQ_60_75: - case Consensus::LLMQType::LLMQ_DEVNET_DIP0024: - case Consensus::LLMQType::LLMQ_TEST_DIP0024: { - return fDIP0024IsActive; - } - case Consensus::LLMQType::LLMQ_25_67: - return pindexPrev->nHeight >= TESTNET_LLMQ_25_67_ACTIVATION_HEIGHT; - - default: - throw std::runtime_error(strprintf("%s: Unknown LLMQ type %d", __func__, ToUnderlying(llmqType))); - } - - // Something wrong with conditions above, they are not consistent - assert(false); -} - -std::vector GetEnabledQuorumTypes(gsl::not_null pindex) -{ - std::vector ret; - ret.reserve(Params().GetConsensus().llmqs.size()); - for (const auto& params : Params().GetConsensus().llmqs) { - if (IsQuorumTypeEnabled(params.type, pindex)) { - ret.push_back(params.type); - } - } - return ret; -} - -std::vector> GetEnabledQuorumParams(gsl::not_null pindex) -{ - std::vector> ret; - ret.reserve(Params().GetConsensus().llmqs.size()); - - std::copy_if(Params().GetConsensus().llmqs.begin(), Params().GetConsensus().llmqs.end(), std::back_inserter(ret), - [&pindex](const auto& params){return IsQuorumTypeEnabled(params.type, pindex);}); - - return ret; -} - template void InitQuorumsCache(CacheType& cache, bool limit_by_connections) { diff --git a/src/llmq/utils.h b/src/llmq/utils.h index 88f0b2ea4fed..08db78467c4b 100644 --- a/src/llmq/utils.h +++ b/src/llmq/utils.h @@ -6,13 +6,12 @@ #define BITCOIN_LLMQ_UTILS_H #include -#include #include #include #include #include -#include +#include #include class CConnman; @@ -24,8 +23,6 @@ using CDeterministicMNCPtr = std::shared_ptr; namespace llmq { -class CQuorumSnapshot; - namespace utils { @@ -40,12 +37,6 @@ std::set CalcDeterministicWatchConnections(Consensus::LLMQType llmqType, bool EnsureQuorumConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, CConnman& connman, const uint256& myProTxHash); void AddQuorumProbeConnections(const Consensus::LLMQParams& llmqParams, gsl::not_null pQuorumBaseBlockIndex, CConnman& connman, const uint256& myProTxHash); -bool IsQuorumTypeEnabled(Consensus::LLMQType llmqType, gsl::not_null pindexPrev); -bool IsQuorumTypeEnabledInternal(Consensus::LLMQType llmqType, gsl::not_null pindexPrev, std::optional optDIP0024IsActive); - -std::vector GetEnabledQuorumTypes(gsl::not_null pindex); -std::vector> GetEnabledQuorumParams(gsl::not_null pindex); - template void InitQuorumsCache(CacheType& cache, bool limit_by_connections = true); diff --git a/src/miner.cpp b/src/miner.cpp index 54f629fe9263..05c867851ccf 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -156,7 +156,7 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc : pblock->GetBlockTime(); if (fDIP0003Active_context) { - for (const Consensus::LLMQParams& params : llmq::utils::GetEnabledQuorumParams(pindexPrev)) { + for (const Consensus::LLMQParams& params : llmq::GetEnabledQuorumParams(pindexPrev)) { std::vector vqcTx; if (quorum_block_processor.GetMineableCommitmentsTx(params, nHeight, diff --git a/src/rpc/quorums.cpp b/src/rpc/quorums.cpp index 3f42dbf0385d..37059788f1fb 100644 --- a/src/rpc/quorums.cpp +++ b/src/rpc/quorums.cpp @@ -76,7 +76,7 @@ static UniValue quorum_list(const JSONRPCRequest& request, const ChainstateManag CBlockIndex* pindexTip = WITH_LOCK(cs_main, return chainman.ActiveChain().Tip()); - for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pindexTip)) { + for (const auto& type : llmq::GetEnabledQuorumTypes(pindexTip)) { const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); UniValue v(UniValue::VARR); @@ -141,7 +141,7 @@ static UniValue quorum_list_extended(const JSONRPCRequest& request, const Chains CBlockIndex* pblockindex = nHeight != -1 ? WITH_LOCK(cs_main, return chainman.ActiveChain()[nHeight]) : WITH_LOCK(cs_main, return chainman.ActiveChain().Tip()); - for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pblockindex)) { + for (const auto& type : llmq::GetEnabledQuorumTypes(pblockindex)) { const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); @@ -299,7 +299,7 @@ static UniValue quorum_dkgstatus(const JSONRPCRequest& request, const Chainstate UniValue minableCommitments(UniValue::VARR); UniValue quorumArrConnections(UniValue::VARR); - for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pindexTip)) { + for (const auto& type : llmq::GetEnabledQuorumTypes(pindexTip)) { const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); const auto& llmq_params = llmq_params_opt.value(); @@ -403,7 +403,7 @@ static UniValue quorum_memberof(const JSONRPCRequest& request, const ChainstateM } UniValue result(UniValue::VARR); - for (const auto& type : llmq::utils::GetEnabledQuorumTypes(pindexTip)) { + for (const auto& type : llmq::GetEnabledQuorumTypes(pindexTip)) { const auto& llmq_params_opt = Params().GetLLMQ(type); CHECK_NONFATAL(llmq_params_opt.has_value()); size_t count = llmq_params_opt->signingActiveQuorumCount; diff --git a/src/test/evo_utils_tests.cpp b/src/test/evo_utils_tests.cpp index 2660ddcbde84..1810f5aef14e 100644 --- a/src/test/evo_utils_tests.cpp +++ b/src/test/evo_utils_tests.cpp @@ -5,7 +5,7 @@ #include #include -#include +#include #include @@ -13,12 +13,12 @@ #include -/* TODO: rename this file and test to llmq_utils_test */ +/* TODO: rename this file and test to llmq_options_test */ BOOST_AUTO_TEST_SUITE(evo_utils_tests) void Test(NodeContext& node) { - using namespace llmq::utils; + using namespace llmq; auto tip = node.chainman->ActiveTip(); const auto& consensus_params = Params().GetConsensus(); BOOST_CHECK_EQUAL(IsQuorumTypeEnabledInternal(consensus_params.llmqTypeDIP0024InstantSend, tip, false), false); From 45957d53bc311ae6fb2cf2aac7b0304c1cf6b299 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 28 Dec 2023 03:50:39 +0700 Subject: [PATCH 15/15] refactor: drop circular dependency llmq/quorums <-> llmq/utils --- src/llmq/utils.cpp | 7 ++++++- test/lint/lint-circular-dependencies.sh | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/llmq/utils.cpp b/src/llmq/utils.cpp index ad7a5121539a..5f170221d8a4 100644 --- a/src/llmq/utils.cpp +++ b/src/llmq/utils.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include @@ -25,6 +24,12 @@ #include class CBLSSignature; +namespace llmq +{ +class CQuorum; +using CQuorumPtr = std::shared_ptr; +using CQuorumCPtr = std::shared_ptr; +} /** * Forward declarations diff --git a/test/lint/lint-circular-dependencies.sh b/test/lint/lint-circular-dependencies.sh index 3ad88a486c60..8ac4c0d8beff 100755 --- a/test/lint/lint-circular-dependencies.sh +++ b/test/lint/lint-circular-dependencies.sh @@ -33,10 +33,10 @@ EXPECTED_CIRCULAR_DEPENDENCIES=( "governance/classes -> governance/governance -> governance/classes" "governance/governance -> governance/object -> governance/governance" "governance/governance -> masternode/sync -> governance/governance" - "llmq/quorums -> llmq/utils -> llmq/quorums" "llmq/chainlocks -> llmq/instantsend -> llmq/chainlocks" "llmq/chainlocks -> llmq/instantsend -> net_processing -> llmq/chainlocks" "llmq/dkgsessionmgr -> net_processing -> llmq/dkgsessionmgr" + "llmq/dkgsessionmgr -> net_processing -> llmq/quorums -> llmq/dkgsessionmgr" "llmq/instantsend -> net_processing -> llmq/instantsend" "llmq/instantsend -> txmempool -> llmq/instantsend" "llmq/instantsend -> validation -> llmq/instantsend" @@ -85,6 +85,7 @@ EXPECTED_CIRCULAR_DEPENDENCIES=( "evo/simplifiedmns -> llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> evo/simplifiedmns" "llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> llmq/blockprocessor" "llmq/context -> llmq/dkgsessionmgr -> net_processing -> llmq/context" + "llmq/dkgsession -> llmq/dkgsessionmgr -> net_processing -> llmq/quorums -> llmq/dkgsession" "llmq/commitment -> llmq/utils -> llmq/snapshot -> llmq/commitment" "spork -> validation -> spork" "governance/governance -> validation -> governance/governance"