Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ endif
.PHONY: FORCE check-symbols check-security
# dash core #
BITCOIN_CORE_H = \
active/context.h \
active/dkgsession.h \
active/dkgsessionhandler.h \
active/masternode.h \
active/quorums.h \
addrdb.h \
addressindex.h \
Expand Down Expand Up @@ -292,9 +296,6 @@ BITCOIN_CORE_H = \
logging.h \
logging/timer.h \
mapport.h \
masternode/active/context.h \
masternode/active/notificationinterface.h \
masternode/node.h \
masternode/meta.h \
masternode/payments.h \
masternode/sync.h \
Expand Down Expand Up @@ -482,6 +483,10 @@ libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h
libbitcoin_node_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(MINIUPNPC_CPPFLAGS) $(NATPMP_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS)
libbitcoin_node_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
libbitcoin_node_a_SOURCES = \
active/context.cpp \
active/dkgsession.cpp \
active/dkgsessionhandler.cpp \
active/masternode.cpp \
active/quorums.cpp \
addrdb.cpp \
addressindex.cpp \
Expand Down Expand Up @@ -562,9 +567,6 @@ libbitcoin_node_a_SOURCES = \
llmq/observer/context.cpp \
llmq/observer/quorums.cpp \
mapport.cpp \
masternode/active/context.cpp \
masternode/active/notificationinterface.cpp \
masternode/node.cpp \
masternode/meta.cpp \
masternode/payments.cpp \
masternode/sync.cpp \
Expand Down
122 changes: 122 additions & 0 deletions src/active/context.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// Copyright (c) 2025 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 <active/context.h>

#include <active/dkgsessionhandler.h>
#include <active/masternode.h>
#include <active/quorums.h>
#include <chainlock/chainlock.h>
#include <chainlock/signing.h>
#include <governance/governance.h>
#include <governance/signing.h>
#include <instantsend/instantsend.h>
#include <instantsend/signing.h>
#include <llmq/context.h>
#include <llmq/debug.h>
#include <llmq/dkgsessionmgr.h>
#include <llmq/ehf_signals.h>
#include <llmq/quorumsman.h>
#include <llmq/signing_shares.h>

#include <util/check.h>
#include <validation.h>

ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
CDeterministicMNManager& dmnman, CGovernanceManager& govman,
CMasternodeMetaMan& mn_metaman, CMNHFManager& mnhfman, CSporkManager& sporkman,
CTxMemPool& mempool, llmq::CChainLocksHandler& clhandler, llmq::CInstantSendManager& isman,
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,
llmq::CQuorumSnapshotManager& qsnapman, llmq::CSigningManager& sigman,
PeerManager& peerman, const CMasternodeSync& mn_sync, const CBLSSecretKey& operator_sk,
const llmq::QvvecSyncModeMap& sync_map, const util::DbWrapperParams& db_params,
bool quorums_recovery, bool quorums_watch) :
m_clhandler{clhandler},
m_isman{isman},
m_qman{qman},
nodeman{std::make_unique<CActiveMasternodeManager>(connman, dmnman, operator_sk)},
dkgdbgman{std::make_unique<llmq::CDKGDebugManager>()},
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(dmnman, qsnapman, chainman, sporkman, db_params, quorums_watch)},
shareman{std::make_unique<llmq::CSigSharesManager>(connman, chainman.ActiveChainstate(), sigman, peerman, *nodeman,
qman, sporkman)},
gov_signer{std::make_unique<GovernanceSigner>(connman, dmnman, govman, *nodeman, chainman, mn_sync)},
ehf_sighandler{std::make_unique<llmq::CEHFSignalsHandler>(chainman, mnhfman, sigman, *shareman, qman)},
qman_handler{std::make_unique<llmq::QuorumParticipant>(bls_worker, connman, dmnman, qman, qsnapman, *nodeman, chainman,
mn_sync, sporkman, sync_map, quorums_recovery, quorums_watch)},
cl_signer{std::make_unique<chainlock::ChainLockSigner>(chainman.ActiveChainstate(), clhandler, sigman, *shareman,
sporkman, mn_sync)},
is_signer{std::make_unique<instantsend::InstantSendSigner>(chainman.ActiveChainstate(), clhandler, isman, sigman,
*shareman, qman, sporkman, mempool, mn_sync)}
{
qdkgsman->InitializeHandlers([&](const Consensus::LLMQParams& llmq_params,
int quorum_idx) -> std::unique_ptr<llmq::ActiveDKGSessionHandler> {
return std::make_unique<llmq::ActiveDKGSessionHandler>(bls_worker, dmnman, mn_metaman, *dkgdbgman, *qdkgsman,
qblockman, qsnapman, *nodeman, chainman, sporkman,
llmq_params, quorums_watch, quorum_idx);
});
m_clhandler.ConnectSigner(cl_signer.get());
m_isman.ConnectSigner(is_signer.get());
m_qman.ConnectManagers(qman_handler.get(), qdkgsman.get());
}
Comment on lines +1 to +61
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix clang-format issues to satisfy CI

CI reports a Clang Diff Format Check failure for this file. Please run the project’s clang-format script (e.g. clang-format-diff.py over this hunk) to normalize indentation and spacing before merging.

🧰 Tools
🪛 Cppcheck (2.19.0)

[error] 10-10: failed to evaluate #if condition, undefined function-like macro invocation

(syntaxError)


[error] 24-24: #error No known always_inline attribute for this platform.

(preprocessorErrorDirective)

🪛 GitHub Actions: Clang Diff Format Check

[error] 1-1: Clang format differences found. Run the clang-format-diff.py script to fix formatting in this file.

🤖 Prompt for AI Agents
In @src/active/context.cpp around lines 1-61, The ActiveContext constructor
formatting in this file fails clang-format CI; run the project's clang-format
wrapper (e.g. clang-format-diff.py or the repo's format script) on the changed
hunk or on src/active/context.cpp to normalize indentation/spacing around the
ActiveContext constructor, member initializer list (m_clhandler, m_isman,
m_qman, nodeman, dkgdbgman, qdkgsman, shareman, gov_signer, ehf_sighandler,
qman_handler, cl_signer, is_signer) and the lambda passed to
qdkgsman->InitializeHandlers, then add the resulting formatted changes and push
the commit.


ActiveContext::~ActiveContext()
{
m_qman.DisconnectManagers();
m_isman.DisconnectSigner();
m_clhandler.DisconnectSigner();
}

void ActiveContext::Interrupt()
{
shareman->InterruptWorkerThread();
}

void ActiveContext::Start(CConnman& connman, PeerManager& peerman)
{
qman_handler->Start();
qdkgsman->StartThreads(connman, peerman);
shareman->Start();
cl_signer->RegisterRecoveryInterface();
is_signer->RegisterRecoveryInterface();
shareman->RegisterRecoveryInterface();
}

void ActiveContext::Stop()
{
shareman->UnregisterRecoveryInterface();
is_signer->UnregisterRecoveryInterface();
cl_signer->UnregisterRecoveryInterface();
shareman->Stop();
qdkgsman->StopThreads();
qman_handler->Stop();
}

CCoinJoinServer& ActiveContext::GetCJServer() const
{
return *Assert(m_cj_server);
}

void ActiveContext::SetCJServer(gsl::not_null<CCoinJoinServer*> cj_server)
{
// Prohibit double initialization
assert(m_cj_server == nullptr);
m_cj_server = cj_server;
}

void ActiveContext::UpdatedBlockTip(const CBlockIndex* pindexNew, const CBlockIndex* pindexFork, bool fInitialDownload)
{
if (fInitialDownload || pindexNew == pindexFork) // In IBD or blocks were disconnected without any new ones
return;

nodeman->UpdatedBlockTip(pindexNew, pindexFork, fInitialDownload);
ehf_sighandler->UpdatedBlockTip(pindexNew);
gov_signer->UpdatedBlockTip(pindexNew);
qdkgsman->UpdatedBlockTip(pindexNew, fInitialDownload);
qman_handler->UpdatedBlockTip(pindexNew, fInitialDownload);
}

void ActiveContext::NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig>& sig, bool proactive_relay)
{
shareman->NotifyRecoveredSig(sig, proactive_relay);
}
66 changes: 44 additions & 22 deletions src/masternode/active/context.h → src/active/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#ifndef BITCOIN_MASTERNODE_ACTIVE_CONTEXT_H
#define BITCOIN_MASTERNODE_ACTIVE_CONTEXT_H
#ifndef BITCOIN_ACTIVE_CONTEXT_H
#define BITCOIN_ACTIVE_CONTEXT_H

#include <llmq/options.h>

#include <validationinterface.h>

#include <gsl/pointers.h>

#include <memory>

class CActiveMasternodeManager;
class CBLSSecretKey;
class CBLSWorker;
class ChainstateManager;
class CCoinJoinServer;
class CConnman;
Expand All @@ -22,65 +28,81 @@ class CSporkManager;
class CTxMemPool;
class GovernanceSigner;
class PeerManager;
struct LLMQContext;
namespace chainlock {
class ChainLockSigner;
} // namespace chainlock
namespace instantsend {
class InstantSendSigner;
} // namespace instantsend
namespace llmq {
class CChainLocksHandler;
class CDKGDebugManager;
class CDKGSessionManager;
class CEHFSignalsHandler;
class CInstantSendManager;
class CQuorumBlockProcessor;
class CQuorumManager;
class CQuorumSnapshotManager;
class CSigningManager;
class CSigSharesManager;
class QuorumParticipant;
} // namespace llmq
namespace util {
struct DbWrapperParams;
} // namespace util

struct ActiveContext {
struct ActiveContext final : public CValidationInterface {
private:
// TODO: Switch to references to members when migration is finished
LLMQContext& m_llmq_ctx;
llmq::CChainLocksHandler& m_clhandler;
llmq::CInstantSendManager& m_isman;
llmq::CQuorumManager& m_qman;

public:
ActiveContext() = delete;
ActiveContext(const ActiveContext&) = delete;
ActiveContext& operator=(const ActiveContext&) = delete;
explicit ActiveContext(CCoinJoinServer& cj_server, CConnman& connman, CDeterministicMNManager& dmnman,
CGovernanceManager& govman, ChainstateManager& chainman, CMasternodeMetaMan& mn_metaman,
CMNHFManager& mnhfman, CSporkManager& sporkman, CTxMemPool& mempool, LLMQContext& llmq_ctx,
PeerManager& peerman, const CActiveMasternodeManager& mn_activeman,
const CMasternodeSync& mn_sync, const llmq::QvvecSyncModeMap& sync_map,
const util::DbWrapperParams& db_params, bool quorums_recovery, bool quorums_watch);
explicit ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman,
CMNHFManager& mnhfman, CSporkManager& sporkman, CTxMemPool& mempool,
llmq::CChainLocksHandler& clhandler, llmq::CInstantSendManager& isman,
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,
llmq::CQuorumSnapshotManager& qsnapman, llmq::CSigningManager& sigman, PeerManager& peerman,
const CMasternodeSync& mn_sync, const CBLSSecretKey& operator_sk,
const llmq::QvvecSyncModeMap& sync_map, const util::DbWrapperParams& db_params,
bool quorums_recovery, bool quorums_watch);
~ActiveContext();

void Interrupt();
void Start(CConnman& connman, PeerManager& peerman);
void Stop();

CCoinJoinServer& GetCJServer() const;
void SetCJServer(gsl::not_null<CCoinJoinServer*> cj_server);

protected:
// CValidationInterface
void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig>& sig, bool proactive_relay) override;
void UpdatedBlockTip(const CBlockIndex* pindexNew, const CBlockIndex* pindexFork, bool fInitialDownload) override;

public:
/*
* Entities that are only utilized when masternode mode is enabled
* and are accessible in their own right
* TODO: Move CActiveMasternodeManager here when dependents have been migrated
*/
CCoinJoinServer& m_cj_server;
const std::unique_ptr<GovernanceSigner> gov_signer;
const std::unique_ptr<CActiveMasternodeManager> nodeman;
const std::unique_ptr<llmq::CDKGDebugManager> dkgdbgman;
const std::unique_ptr<llmq::CDKGSessionManager> qdkgsman;
const std::unique_ptr<llmq::CSigSharesManager> shareman;
const std::unique_ptr<llmq::CEHFSignalsHandler> ehf_sighandler;
const std::unique_ptr<llmq::QuorumParticipant> qman_handler;

private:
/*
* Entities that are registered with LLMQContext members are not accessible
* and are managed with (Dis)connectSigner() in the (c/d)tor instead
*/
const std::unique_ptr<GovernanceSigner> gov_signer;
const std::unique_ptr<llmq::CEHFSignalsHandler> ehf_sighandler;
const std::unique_ptr<llmq::QuorumParticipant> qman_handler;
const std::unique_ptr<chainlock::ChainLockSigner> cl_signer;
const std::unique_ptr<instantsend::InstantSendSigner> is_signer;

/** Owned by PeerManager, use GetCJServer() */
CCoinJoinServer* m_cj_server{nullptr};
};

#endif // BITCOIN_MASTERNODE_ACTIVE_CONTEXT_H
#endif // BITCOIN_ACTIVE_CONTEXT_H
Loading
Loading