From 22af04b52361719bd9116aaa425dd35e0fcaa2dd Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 25 Jun 2025 20:33:19 +0700 Subject: [PATCH 1/2] refactor: nuke circular dependencies over validationinterface These circular dependencies exists only because excessive logging here. Prepared extra debug info outside of validationinterface --- src/governance/governance.cpp | 2 +- src/governance/object.cpp | 3 ++- src/llmq/chainlocks.cpp | 2 +- src/llmq/signing.cpp | 2 +- src/validationinterface.cpp | 21 ++++++++------------- src/validationinterface.h | 10 +++++----- src/zmq/zmqabstractnotifier.cpp | 2 +- src/zmq/zmqabstractnotifier.h | 2 +- src/zmq/zmqnotificationinterface.cpp | 2 +- src/zmq/zmqnotificationinterface.h | 2 +- src/zmq/zmqpublishnotifier.cpp | 6 +++--- src/zmq/zmqpublishnotifier.h | 4 ++-- test/lint/lint-circular-dependencies.py | 2 -- 13 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/governance/governance.cpp b/src/governance/governance.cpp index 8d87a235cb37..d2ca46cffd74 100644 --- a/src/governance/governance.cpp +++ b/src/governance/governance.cpp @@ -358,7 +358,7 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, PeerMana CheckOrphanVotes(govobj, peerman); // SEND NOTIFICATION TO SCRIPT/ZMQ - GetMainSignals().NotifyGovernanceObject(std::make_shared(govobj.Object())); + GetMainSignals().NotifyGovernanceObject(std::make_shared(govobj.Object()), nHash.ToString()); } void CGovernanceManager::CheckAndRemove() diff --git a/src/governance/object.cpp b/src/governance/object.cpp index 6c57af78aa86..839d7d118f3c 100644 --- a/src/governance/object.cpp +++ b/src/governance/object.cpp @@ -162,7 +162,8 @@ bool CGovernanceObject::ProcessVote(CMasternodeMetaMan& mn_metaman, CGovernanceM fileVotes.AddVote(vote); fDirtyCache = true; // SEND NOTIFICATION TO SCRIPT/ZMQ - GetMainSignals().NotifyGovernanceVote(tip_mn_list, std::make_shared(vote)); + GetMainSignals().NotifyGovernanceVote(std::make_shared(tip_mn_list), + std::make_shared(vote), vote.GetHash().ToString()); return true; } diff --git a/src/llmq/chainlocks.cpp b/src/llmq/chainlocks.cpp index f25628dfcc15..7bef167fc638 100644 --- a/src/llmq/chainlocks.cpp +++ b/src/llmq/chainlocks.cpp @@ -506,7 +506,7 @@ void CChainLocksHandler::EnforceBestChainLock() lastNotifyChainLockBlockIndex = currentBestChainLockBlockIndex; } - GetMainSignals().NotifyChainLock(currentBestChainLockBlockIndex, clsig); + GetMainSignals().NotifyChainLock(currentBestChainLockBlockIndex, clsig, clsig->ToString()); uiInterface.NotifyChainLock(clsig->getBlockHash().ToString(), clsig->getHeight()); ::g_stats_client->gauge("chainlocks.blockHeight", clsig->getHeight(), 1.0f); } diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index deabfe7231aa..154d5af7d032 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -644,7 +644,7 @@ void CSigningManager::ProcessRecoveredSig(const std::shared_ptrHandleNewRecoveredSig(*recoveredSig)); } - GetMainSignals().NotifyRecoveredSig(recoveredSig); + GetMainSignals().NotifyRecoveredSig(recoveredSig, recoveredSig->GetHash().ToString()); } void CSigningManager::PushReconstructedRecoveredSig(const std::shared_ptr& recoveredSig) diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index e00a8bdb533e..70e094105204 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -7,15 +7,10 @@ #include #include -#include #include #include #include #include -#include -#include -#include -#include #include #include @@ -279,27 +274,27 @@ void CMainSignals::NotifyTransactionLock(const CTransactionRef &tx, const std::s tx->GetHash().ToString()); } -void CMainSignals::NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr& clsig) { +void CMainSignals::NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr& clsig, const std::string& id) { auto event = [pindex, clsig, this] { m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyChainLock(pindex, clsig); }); }; ENQUEUE_AND_LOG_EVENT(event, "%s: notify chainlock at block=%s cl=%s", __func__, pindex->GetBlockHash().ToString(), - clsig->ToString()); + id); } -void CMainSignals::NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) { +void CMainSignals::NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote, const std::string& id) { auto event = [vote, tip_mn_list, this] { m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyGovernanceVote(tip_mn_list, vote); }); }; - ENQUEUE_AND_LOG_EVENT(event, "%s: notify governance vote: %s", __func__, vote->GetHash().ToString()); + ENQUEUE_AND_LOG_EVENT(event, "%s: notify governance vote: %s", __func__, id); } -void CMainSignals::NotifyGovernanceObject(const std::shared_ptr& object) { +void CMainSignals::NotifyGovernanceObject(const std::shared_ptr& object, const std::string& id) { auto event = [object, this] { m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyGovernanceObject(object); }); }; - ENQUEUE_AND_LOG_EVENT(event, "%s: notify governance object: %s", __func__, object->GetHash().ToString()); + ENQUEUE_AND_LOG_EVENT(event, "%s: notify governance object: %s", __func__, id); } void CMainSignals::NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) { @@ -311,12 +306,12 @@ void CMainSignals::NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& cu previousTx->GetHash().ToString()); } -void CMainSignals::NotifyRecoveredSig(const std::shared_ptr& sig) { +void CMainSignals::NotifyRecoveredSig(const std::shared_ptr& sig, const std::string& id) { auto event = [sig, this] { m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyRecoveredSig(sig); }); }; ENQUEUE_AND_LOG_EVENT(event, "%s: notify recoveredsig=%s", __func__, - sig->GetHash().ToString()); + id); } void CMainSignals::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) { diff --git a/src/validationinterface.h b/src/validationinterface.h index a3b45dcf9d62..281fad978bfa 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -166,7 +166,7 @@ class CValidationInterface { virtual void BlockDisconnected(const std::shared_ptr &block, const CBlockIndex *pindex) {} virtual void NotifyTransactionLock(const CTransactionRef &tx, const std::shared_ptr& islock) {} virtual void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr& clsig) {} - virtual void NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) {} + virtual void NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote) {} virtual void NotifyGovernanceObject(const std::shared_ptr& object) {} virtual void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) {} virtual void NotifyRecoveredSig(const std::shared_ptr& sig) {} @@ -233,11 +233,11 @@ class CMainSignals { void BlockConnected(const std::shared_ptr &, const CBlockIndex *pindex); void BlockDisconnected(const std::shared_ptr &, const CBlockIndex* pindex); void NotifyTransactionLock(const CTransactionRef &tx, const std::shared_ptr& islock); - void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr& clsig); - void NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote); - void NotifyGovernanceObject(const std::shared_ptr& object); + void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr& clsig, const std::string& id); + void NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote, const std::string& id); + void NotifyGovernanceObject(const std::shared_ptr& object, const std::string& id); void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef ¤tTx, const CTransactionRef &previousTx); - void NotifyRecoveredSig(const std::shared_ptr &sig); + void NotifyRecoveredSig(const std::shared_ptr &sig, const std::string& id); void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff); void ChainStateFlushed(const CBlockLocator &); void BlockChecked(const CBlock&, const BlockValidationState&); diff --git a/src/zmq/zmqabstractnotifier.cpp b/src/zmq/zmqabstractnotifier.cpp index e3a1d98cfe71..aa3feb605f70 100644 --- a/src/zmq/zmqabstractnotifier.cpp +++ b/src/zmq/zmqabstractnotifier.cpp @@ -53,7 +53,7 @@ bool CZMQAbstractNotifier::NotifyTransactionLock(const CTransactionRef &/*transa return true; } -bool CZMQAbstractNotifier::NotifyGovernanceVote(const CDeterministicMNList& /*tip_mn_list*/, const std::shared_ptr & /*vote*/) +bool CZMQAbstractNotifier::NotifyGovernanceVote(const std::shared_ptr& /*tip_mn_list*/, const std::shared_ptr & /*vote*/) { return true; } diff --git a/src/zmq/zmqabstractnotifier.h b/src/zmq/zmqabstractnotifier.h index 9ba89ff51575..c1a7dc67f882 100644 --- a/src/zmq/zmqabstractnotifier.h +++ b/src/zmq/zmqabstractnotifier.h @@ -72,7 +72,7 @@ class CZMQAbstractNotifier virtual bool NotifyTransaction(const CTransaction &transaction); virtual bool NotifyChainLock(const CBlockIndex *pindex, const std::shared_ptr& clsig); virtual bool NotifyTransactionLock(const CTransactionRef& transaction, const std::shared_ptr& islock); - virtual bool NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote); + virtual bool NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote); virtual bool NotifyGovernanceObject(const std::shared_ptr& object); virtual bool NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx); virtual bool NotifyRecoveredSig(const std::shared_ptr& sig); diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp index 4077433f99ef..82b683154001 100644 --- a/src/zmq/zmqnotificationinterface.cpp +++ b/src/zmq/zmqnotificationinterface.cpp @@ -220,7 +220,7 @@ void CZMQNotificationInterface::NotifyTransactionLock(const CTransactionRef& tx, }); } -void CZMQNotificationInterface::NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr &vote) +void CZMQNotificationInterface::NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr &vote) { TryForEachAndRemoveFailed(notifiers, [&tip_mn_list, &vote](CZMQAbstractNotifier* notifier) { return notifier->NotifyGovernanceVote(tip_mn_list, vote); diff --git a/src/zmq/zmqnotificationinterface.h b/src/zmq/zmqnotificationinterface.h index 4dd078a45faf..70510fee07fa 100644 --- a/src/zmq/zmqnotificationinterface.h +++ b/src/zmq/zmqnotificationinterface.h @@ -33,7 +33,7 @@ class CZMQNotificationInterface final : public CValidationInterface void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override; void NotifyChainLock(const CBlockIndex *pindex, const std::shared_ptr& clsig) override; void NotifyTransactionLock(const CTransactionRef &tx, const std::shared_ptr& islock) override; - void NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) override; + void NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote) override; void NotifyGovernanceObject(const std::shared_ptr& object) override; void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) override; void NotifyRecoveredSig(const std::shared_ptr& sig) override; diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp index 11a5344506c0..c08c64f58e2b 100644 --- a/src/zmq/zmqpublishnotifier.cpp +++ b/src/zmq/zmqpublishnotifier.cpp @@ -264,7 +264,7 @@ bool CZMQPublishHashTransactionLockNotifier::NotifyTransactionLock(const CTransa return SendZmqMessage(MSG_HASHTXLOCK, data, 32); } -bool CZMQPublishHashGovernanceVoteNotifier::NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) +bool CZMQPublishHashGovernanceVoteNotifier::NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote) { uint256 hash = vote->GetHash(); LogPrint(BCLog::ZMQ, "Publish hashgovernancevote %s to %s\n", hash.GetHex(), this->address); @@ -435,10 +435,10 @@ bool CZMQPublishRawTransactionLockSigNotifier::NotifyTransactionLock(const CTran return SendZmqMessage(MSG_RAWTXLOCKSIG, &(*ss.begin()), ss.size()); } -bool CZMQPublishRawGovernanceVoteNotifier::NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) +bool CZMQPublishRawGovernanceVoteNotifier::NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote) { uint256 nHash = vote->GetHash(); - LogPrint(BCLog::ZMQ, "Publish rawgovernanceobject %s with vote %d to %s\n", nHash.ToString(), vote->ToString(tip_mn_list), this->address); + LogPrint(BCLog::ZMQ, "Publish rawgovernanceobject %s with vote %d to %s\n", nHash.ToString(), vote->ToString(*tip_mn_list), this->address); CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << *vote; return SendZmqMessage(MSG_RAWGVOTE, &(*ss.begin()), ss.size()); diff --git a/src/zmq/zmqpublishnotifier.h b/src/zmq/zmqpublishnotifier.h index 7dc632d077db..2bcb3c068446 100644 --- a/src/zmq/zmqpublishnotifier.h +++ b/src/zmq/zmqpublishnotifier.h @@ -63,7 +63,7 @@ class CZMQPublishHashTransactionLockNotifier : public CZMQAbstractPublishNotifie class CZMQPublishHashGovernanceVoteNotifier : public CZMQAbstractPublishNotifier { public: - bool NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) override; + bool NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote) override; }; class CZMQPublishHashGovernanceObjectNotifier : public CZMQAbstractPublishNotifier @@ -132,7 +132,7 @@ class CZMQPublishRawTransactionLockSigNotifier : public CZMQAbstractPublishNotif class CZMQPublishRawGovernanceVoteNotifier : public CZMQAbstractPublishNotifier { public: - bool NotifyGovernanceVote(const CDeterministicMNList& tip_mn_list, const std::shared_ptr& vote) override; + bool NotifyGovernanceVote(const std::shared_ptr& tip_mn_list, const std::shared_ptr& vote) override; }; class CZMQPublishRawGovernanceObjectNotifier : public CZMQAbstractPublishNotifier diff --git a/test/lint/lint-circular-dependencies.py b/test/lint/lint-circular-dependencies.py index 01a2800a4ee6..3c2d95fb20a5 100755 --- a/test/lint/lint-circular-dependencies.py +++ b/test/lint/lint-circular-dependencies.py @@ -46,7 +46,6 @@ "governance/governance -> governance/object -> governance/governance", "governance/governance -> masternode/sync -> governance/governance", "governance/governance -> net_processing -> governance/governance", - "governance/vote -> masternode/node -> validationinterface -> governance/vote", "llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> llmq/blockprocessor", "llmq/chainlocks -> llmq/instantsend -> llmq/chainlocks", "llmq/chainlocks -> llmq/instantsend -> net_processing -> llmq/chainlocks", @@ -58,7 +57,6 @@ "llmq/instantsend -> net_processing -> llmq/instantsend", "llmq/instantsend -> txmempool -> llmq/instantsend", "llmq/signing -> llmq/signing_shares -> llmq/signing", - "llmq/signing -> masternode/node -> validationinterface -> llmq/signing", "llmq/signing -> net_processing -> llmq/signing", "llmq/signing_shares -> net_processing -> llmq/signing_shares", "logging -> util/system -> logging", From e875c4294cd0187b69948f4f620c396ae3ae2a7a Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 26 Jun 2025 12:32:54 +0700 Subject: [PATCH 2/2] refactor: drop dependency net on coinjoin/coinjoin by removing unused header --- src/net.cpp | 1 - test/lint/lint-circular-dependencies.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index d28a891921af..2f6376868a59 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -41,7 +41,6 @@ #include #include -#include #include #include diff --git a/test/lint/lint-circular-dependencies.py b/test/lint/lint-circular-dependencies.py index 3c2d95fb20a5..698d013bb068 100755 --- a/test/lint/lint-circular-dependencies.py +++ b/test/lint/lint-circular-dependencies.py @@ -27,7 +27,6 @@ "banman -> common/bloom -> evo/assetlocktx -> llmq/signing -> net_processing -> banman", "coinjoin/client -> net_processing -> coinjoin/client", "coinjoin/client -> net_processing -> coinjoin/context -> coinjoin/client", - "coinjoin/coinjoin -> llmq/chainlocks -> net -> coinjoin/coinjoin", "coinjoin/context -> coinjoin/server -> net_processing -> coinjoin/context", "coinjoin/server -> net_processing -> coinjoin/server", "common/bloom -> evo/assetlocktx -> llmq/quorums -> net -> common/bloom", @@ -38,7 +37,6 @@ "evo/chainhelper -> evo/specialtxman -> validation -> evo/chainhelper", "evo/deterministicmns -> index/txindex -> validation -> evo/deterministicmns", "evo/deterministicmns -> index/txindex -> validation -> txmempool -> evo/deterministicmns", - "evo/deterministicmns -> index/txindex -> index/base -> validationinterface -> evo/deterministicmns", "evo/netinfo -> evo/providertx -> evo/netinfo", "evo/simplifiedmns -> llmq/blockprocessor -> llmq/utils -> llmq/snapshot -> evo/simplifiedmns", "core_io -> evo/assetlocktx -> llmq/signing -> net_processing -> evo/simplifiedmns -> core_io",