Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
c5e4449
refactor: drop `IsWatchQuorumsEnabled()`
kwvg Dec 10, 2025
83009ab
refactor: drop `QuorumDataRecoveryEnabled()`
kwvg Dec 8, 2025
85fee1a
refactor: move `GetEnabledQuorumVvecSyncEntries()` invocation to init
kwvg Dec 8, 2025
64d6aa1
refactor: drop remaining `gArgs` usage in LLMQ code
kwvg Dec 8, 2025
857ac90
refactor: couple listener registration with instantiation
kwvg Dec 4, 2025
355aa23
refactor: accept `ChainstateManager` in `CMNHFManager` ctor
kwvg Oct 19, 2025
cf20f61
refactor: make `CDKGSessionManager` a plugable obj for `CQuorumManager`
kwvg Dec 8, 2025
6d21b1b
refactor: introduce `MakePeerManager()` helper for test setup
kwvg Dec 8, 2025
7cc7b08
refactor: create stub class for watch-only mode context
kwvg Dec 8, 2025
9fda806
refactor: move `CDKGSessionManager` to `{Active,Observer}Context`
kwvg Dec 8, 2025
343f4e3
refactor: initialize `CJWalletManager` after `ActiveContext`
kwvg Dec 9, 2025
e92062c
refactor: use `gsl::not_null` in `CQuorumManager` wherever possible
kwvg Dec 8, 2025
aa55d8d
rpc: add `GetJsonHelp()` defs for `CDKGDebug{,Session}Status`
kwvg Dec 12, 2025
47d1bba
rpc: add help text for `quorum dkgstatus`
kwvg Dec 12, 2025
b896866
rpc: add help text for `protx listdiff`, `masternode status`
kwvg Dec 11, 2025
2b48c72
rpc: add help text for `masternode list`
kwvg Dec 12, 2025
5644605
move-only: consolidate governance `ToJson()` defs to `core_write.cpp`
kwvg Dec 12, 2025
4cb24bd
rpc: add `GetJsonHelp()` defs for `CGovernance{Manager,Object},Object`
kwvg Dec 12, 2025
376fdfe
rpc: deduplicate routines used to generate governance RPC results
kwvg Dec 12, 2025
50804fe
rpc: add JSON help defs for `CGovernanceObject` fragments
kwvg Dec 12, 2025
c8808e3
test: only call `quorum dkg{info,status}` on nodes that can see DKG
kwvg Dec 10, 2025
c2b4766
rpc: add watch-only/masternode mode limits for `quorum dkg{info,status}`
kwvg Dec 12, 2025
d6d2b7b
refactor: move `CDKGDebugManager` to `{Active,Observer}Context`
kwvg Dec 8, 2025
cd3d695
doc: add release notes for breaking changes
kwvg Dec 12, 2025
9917014
refactor: move `mapQuorumDataRequests` to `CQuorumManager`, use `Mutex`
kwvg Dec 8, 2025
a23ce09
refactor: inline error handler in `CQuorumManager::ProcessMessage()`
kwvg Dec 1, 2025
f05233e
refactor: extract `ENCRYPTED_CONTRIBUTIONS` processing case
kwvg Dec 8, 2025
6e70ad6
refactor: extract masternode-mode specific `SetSecretKeyShare()`
kwvg Dec 1, 2025
6ba4b48
move-only: move observer/participant logic to `active/quorums.cpp`
kwvg Dec 12, 2025
61bd0ef
refactor: separate observer/participant logic into dedicated class
kwvg Dec 6, 2025
1a4d6ea
refactor: pull data recovery lambda to a dedicated function
kwvg Dec 13, 2025
94a9c7b
refactor: disentangle watch-only and masternode mode thread triggers
kwvg Dec 8, 2025
49e26c8
refactor: pull deletable quorums routine to dedicated function
kwvg Dec 5, 2025
4b4290e
refactor: disentangle watch-only and masternode mode conn checking
kwvg Dec 2, 2025
99dfb26
move-only: move observer/common routines to `llmq/observer`
kwvg Dec 6, 2025
4d1f6f9
refactor: separate observer/common routines into dedicated class
kwvg Dec 6, 2025
8ff4247
refactor: pull handler initialization out of `CQuorumManager`
kwvg Dec 12, 2025
b044c57
refactor: move quorum manager to separate source file
kwvg Dec 13, 2025
e9a9f89
refactor: drop unnecessary `CConnman` argument in handlers
kwvg Dec 13, 2025
3530765
refactor: streamline quorum cache logic
kwvg Dec 13, 2025
f950f08
refactor: abstract away parent implementation from handler
kwvg Dec 13, 2025
ca30d99
refactor: use `unique_ptr` in DKG session handler map
kwvg Dec 13, 2025
931d70d
refactor: move DKG session handler init out of ctor
kwvg Dec 8, 2025
70855f8
move-only: move DKG session handler participant logic to `llmq/active`
kwvg Dec 6, 2025
c3c775d
refactor: separate active session handler routines into dedicated class
kwvg Dec 7, 2025
71e0840
move-only: move DKG session participant logic to `llmq/active`
kwvg Dec 7, 2025
6cd8ece
refactor: separate active session routines into dedicated class
kwvg Dec 13, 2025
248824b
refactor: drop `CActiveMasternodeManager` from `LLMQContext`
kwvg Dec 13, 2025
bf8bef4
refactor: move `CActiveMasternodeManager` to `ActiveContext`
kwvg Dec 13, 2025
6b0303a
refactor: merge `CActiveMasternodeInfo` into `CActiveMasternodeManager`
kwvg Dec 13, 2025
81258f3
refactor: merge `ActiveNotificationInterface` into `ActiveContext`
kwvg Dec 13, 2025
18d7f5c
refactor: consolidate masternode mode logic to `src/active/`
kwvg Dec 13, 2025
275ca55
chore: update lint circular dependencies allowlist
kwvg Dec 13, 2025
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
8 changes: 8 additions & 0 deletions doc/release-notes-7061.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# RPC changes

- `quorum dkginfo` will now require that nodes run either in watch-only mode (`-watchquorums`) or as an
active masternode (i.e. masternode mode) as regular nodes do not have insight into network DKG activity.

- `quorum dkgstatus` will no longer emit the return values `time`, `timeStr` and `session` on nodes that
do not run in either watch-only or masternode mode as regular nodes do not have insight into network
DKG activity.
23 changes: 17 additions & 6 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,11 @@ 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 \
spentindex.h \
Expand Down Expand Up @@ -271,19 +276,19 @@ BITCOIN_CORE_H = \
llmq/options.h \
llmq/params.h \
llmq/quorums.h \
llmq/quorumsman.h \
llmq/signhash.h \
llmq/signing.h \
llmq/net_signing.h \
llmq/signing_shares.h \
llmq/snapshot.h \
llmq/types.h \
llmq/utils.h \
llmq/observer/context.h \
llmq/observer/quorums.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 @@ -470,6 +475,11 @@ 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 \
addrman.cpp \
Expand Down Expand Up @@ -539,15 +549,15 @@ libbitcoin_node_a_SOURCES = \
llmq/net_signing.cpp \
llmq/options.cpp \
llmq/quorums.cpp \
llmq/quorumsman.cpp \
llmq/signhash.cpp \
llmq/signing.cpp \
llmq/signing_shares.cpp \
llmq/snapshot.cpp \
llmq/utils.cpp \
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 Expand Up @@ -910,6 +920,7 @@ libbitcoin_common_a_SOURCES = \
evo/netinfo.cpp \
external_signer.cpp \
governance/common.cpp \
governance/core_write.cpp \
init/common.cpp \
key.cpp \
key_io.cpp \
Expand Down
113 changes: 113 additions & 0 deletions src/active/context.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// 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 <coinjoin/server.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 <validation.h>

ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
CDeterministicMNManager& dmnman, CDSTXManager& dstxman, 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)},
cj_server{std::make_unique<CCoinJoinServer>(chainman, connman, dmnman, dstxman, mn_metaman, mempool, peerman,
*nodeman, mn_sync, isman)},
dkgdbgman{std::make_unique<llmq::CDKGDebugManager>()},
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(chainman.ActiveChainstate(), dmnman, qsnapman, 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,
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::dkg::ActiveSessionHandler> {
return std::make_unique<llmq::dkg::ActiveSessionHandler>(bls_worker, chainman.ActiveChainstate(), dmnman,
mn_metaman, *dkgdbgman, *qdkgsman, qblockman, qsnapman,
*nodeman, 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());
}

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->RegisterAsRecoveredSigsListener();
is_signer->RegisterAsRecoveredSigsListener();
shareman->RegisterAsRecoveredSigsListener();
}

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

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);
}
102 changes: 102 additions & 0 deletions src/active/context.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// 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.

#ifndef BITCOIN_ACTIVE_CONTEXT_H
#define BITCOIN_ACTIVE_CONTEXT_H

#include <llmq/options.h>

#include <validationinterface.h>

#include <memory>

class CActiveMasternodeManager;
class CBLSSecretKey;
class CBLSWorker;
class ChainstateManager;
class CCoinJoinServer;
class CConnman;
class CDeterministicMNManager;
class CDSTXManager;
class CGovernanceManager;
class CMasternodeMetaMan;
class CMasternodeSync;
class CMNHFManager;
class CSporkManager;
class CTxMemPool;
class GovernanceSigner;
class PeerManager;
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 final : public CValidationInterface {
private:
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(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
CDeterministicMNManager& dmnman, CDSTXManager& dstxman, 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();

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
*/
const std::unique_ptr<CActiveMasternodeManager> nodeman;
const std::unique_ptr<CCoinJoinServer> cj_server;
const std::unique_ptr<llmq::CDKGDebugManager> dkgdbgman;
const std::unique_ptr<llmq::CDKGSessionManager> qdkgsman;
const std::unique_ptr<llmq::CSigSharesManager> shareman;

private:
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;
};

#endif // BITCOIN_ACTIVE_CONTEXT_H
Loading
Loading