From 9cf98c6ec6cf58de05900ffdb42047e6ccdd6a91 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Tue, 8 Jul 2025 03:02:21 +0700 Subject: [PATCH] refactor: create InstantSendStorage to break circular dependency over instantsend/signing --- src/instantsend/instantsend.h | 11 ++++++----- src/instantsend/signing.cpp | 3 +-- src/instantsend/signing.h | 23 +++++++++++++++++------ test/lint/lint-circular-dependencies.py | 1 - 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/instantsend/instantsend.h b/src/instantsend/instantsend.h index 1e4f3c4e764f..cdacf7e27caf 100644 --- a/src/instantsend/instantsend.h +++ b/src/instantsend/instantsend.h @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -43,7 +44,7 @@ class CQuorumManager; class CSigningManager; class CSigSharesManager; -class CInstantSendManager +class CInstantSendManager final : public instantsend::InstantSendStorage { private: instantsend::CInstantSendDb db; @@ -128,9 +129,9 @@ class CInstantSendManager EXCLUSIVE_LOCKS_REQUIRED(!cs_nonLocked, !cs_pendingRetry); public: - bool IsLocked(const uint256& txHash) const; + bool IsLocked(const uint256& txHash) const override; bool IsWaitingForTx(const uint256& txHash) const EXCLUSIVE_LOCKS_REQUIRED(!cs_pendingLocks); - instantsend::InstantSendLockPtr GetConflictingLock(const CTransaction& tx) const; + instantsend::InstantSendLockPtr GetConflictingLock(const CTransaction& tx) const override; PeerMsgRet ProcessMessage(const CNode& pfrom, PeerManager& peerman, std::string_view msg_type, CDataStream& vRecv); @@ -152,12 +153,12 @@ class CInstantSendManager EXCLUSIVE_LOCKS_REQUIRED(!cs_nonLocked, !cs_pendingRetry); void RemoveConflictingLock(const uint256& islockHash, const instantsend::InstantSendLock& islock); - void TryEmplacePendingLock(const uint256& hash, const NodeId id, const instantsend::InstantSendLockPtr& islock) + void TryEmplacePendingLock(const uint256& hash, const NodeId id, const instantsend::InstantSendLockPtr& islock) override EXCLUSIVE_LOCKS_REQUIRED(!cs_pendingLocks); size_t GetInstantSendLockCount() const; - bool IsInstantSendEnabled() const; + bool IsInstantSendEnabled() const override; /** * If true, MN should sign all transactions, if false, MN should not sign * transactions in mempool, but should sign txes included in a block. This diff --git a/src/instantsend/signing.cpp b/src/instantsend/signing.cpp index 63bbcd13677a..bfdfbc21199d 100644 --- a/src/instantsend/signing.cpp +++ b/src/instantsend/signing.cpp @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -31,7 +30,7 @@ namespace instantsend { static const std::string_view INPUTLOCK_REQUESTID_PREFIX = "inlock"; InstantSendSigner::InstantSendSigner(CChainState& chainstate, llmq::CChainLocksHandler& clhandler, - llmq::CInstantSendManager& isman, llmq::CSigningManager& sigman, + InstantSendStorage& isman, llmq::CSigningManager& sigman, llmq::CSigSharesManager& shareman, llmq::CQuorumManager& qman, CSporkManager& sporkman, CTxMemPool& mempool, const CMasternodeSync& mn_sync) : m_chainstate{chainstate}, diff --git a/src/instantsend/signing.h b/src/instantsend/signing.h index 1256fcdefe08..5e9100ad0dfb 100644 --- a/src/instantsend/signing.h +++ b/src/instantsend/signing.h @@ -18,19 +18,31 @@ struct Params; } // namespace Consensus namespace llmq { class CChainLocksHandler; -class CInstantSendManager; class CSigningManager; class CSigSharesManager; class CQuorumManager; } // namespace llmq namespace instantsend { + +class InstantSendStorage +{ +public: + virtual ~InstantSendStorage() = default; + + virtual bool IsInstantSendEnabled() const = 0; + virtual bool IsLocked(const uint256& txHash) const = 0; + virtual instantsend::InstantSendLockPtr GetConflictingLock(const CTransaction& tx) const = 0; + virtual void TryEmplacePendingLock(const uint256& hash, const NodeId id, + const instantsend::InstantSendLockPtr& islock) = 0; +}; + class InstantSendSigner : public llmq::CRecoveredSigsListener { private: CChainState& m_chainstate; llmq::CChainLocksHandler& m_clhandler; - llmq::CInstantSendManager& m_isman; + InstantSendStorage& m_isman; llmq::CSigningManager& m_sigman; llmq::CSigSharesManager& m_shareman; llmq::CQuorumManager& m_qman; @@ -58,10 +70,9 @@ class InstantSendSigner : public llmq::CRecoveredSigsListener std::unordered_map txToCreatingInstantSendLocks GUARDED_BY(cs_creating); public: - explicit InstantSendSigner(CChainState& chainstate, llmq::CChainLocksHandler& clhandler, - llmq::CInstantSendManager& isman, llmq::CSigningManager& sigman, - llmq::CSigSharesManager& shareman, llmq::CQuorumManager& qman, CSporkManager& sporkman, - CTxMemPool& mempool, const CMasternodeSync& mn_sync); + explicit InstantSendSigner(CChainState& chainstate, llmq::CChainLocksHandler& clhandler, InstantSendStorage& isman, + llmq::CSigningManager& sigman, llmq::CSigSharesManager& shareman, llmq::CQuorumManager& qman, + CSporkManager& sporkman, CTxMemPool& mempool, const CMasternodeSync& mn_sync); ~InstantSendSigner(); void Start(); diff --git a/test/lint/lint-circular-dependencies.py b/test/lint/lint-circular-dependencies.py index e9c0efc438e5..c89eed880066 100755 --- a/test/lint/lint-circular-dependencies.py +++ b/test/lint/lint-circular-dependencies.py @@ -44,7 +44,6 @@ "governance/governance -> governance/object -> governance/governance", "governance/governance -> masternode/sync -> governance/governance", "governance/governance -> net_processing -> governance/governance", - "instantsend/instantsend -> instantsend/signing -> instantsend/instantsend", "instantsend/instantsend -> llmq/chainlocks -> instantsend/instantsend", "instantsend/instantsend -> net_processing -> instantsend/instantsend", "instantsend/instantsend -> net_processing -> llmq/context -> instantsend/instantsend",