Skip to content

Commit 53be42b

Browse files
committed
refactor: move DKG bootstrap from ActiveContext/ObserverContext into NetDKG
1 parent a2b8dd8 commit 53be42b

8 files changed

Lines changed: 86 additions & 93 deletions

File tree

src/active/context.cpp

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
#include <active/context.h>
66

7-
#include <active/dkgsessionhandler.h>
87
#include <active/masternode.h>
98
#include <bls/bls_worker.h>
109
#include <chainlock/handler.h>
@@ -26,13 +25,12 @@
2625
#include <validationinterface.h>
2726

2827
ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
29-
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman,
30-
CSporkManager& sporkman, const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool,
28+
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CSporkManager& sporkman,
29+
const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool,
3130
chainlock::ChainlockHandler& clhandler, llmq::CInstantSendManager& isman,
32-
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,
33-
llmq::CQuorumSnapshotManager& qsnapman, llmq::CSigningManager& sigman,
34-
const CMasternodeSync& mn_sync, const CBLSSecretKey& operator_sk,
35-
const util::DbWrapperParams& db_params, bool quorums_watch) :
31+
llmq::CQuorumManager& qman, llmq::CQuorumSnapshotManager& qsnapman,
32+
llmq::CSigningManager& sigman, const CMasternodeSync& mn_sync,
33+
const CBLSSecretKey& operator_sk, const util::DbWrapperParams& db_params, bool quorums_watch) :
3634
llmq::QuorumRole{qman},
3735
m_bls_worker{bls_worker},
3836
m_quorums_watch{quorums_watch},
@@ -47,19 +45,9 @@ ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman
4745
is_signer{std::make_unique<instantsend::InstantSendSigner>(chainman.ActiveChainstate(), chainlocks, isman, sigman,
4846
*shareman, qman, sporkman, mempool, mn_sync)}
4947
{
50-
qdkgsman->InitializeHandlers([&](const Consensus::LLMQParams& llmq_params,
51-
int quorum_idx) -> std::unique_ptr<llmq::ActiveDKGSessionHandler> {
52-
return std::make_unique<llmq::ActiveDKGSessionHandler>(bls_worker, dmnman, mn_metaman, *dkgdbgman, *qdkgsman,
53-
qblockman, qsnapman, *nodeman, chainman, sporkman,
54-
llmq_params, quorums_watch, quorum_idx);
55-
});
56-
m_qman.ConnectManagers(this, qdkgsman.get());
5748
}
5849

59-
ActiveContext::~ActiveContext()
60-
{
61-
m_qman.DisconnectManagers();
62-
}
50+
ActiveContext::~ActiveContext() = default;
6351

6452
void ActiveContext::Start()
6553
{

src/active/context.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ class CBLSWorker;
1919
class CCoinJoinServer;
2020
class CConnman;
2121
class CGovernanceManager;
22-
class CMasternodeMetaMan;
2322
class CMasternodeSync;
2423
class CMNHFManager;
2524
class CSporkManager;
@@ -54,13 +53,12 @@ struct ActiveContext final : public llmq::QuorumRole, public CValidationInterfac
5453
ActiveContext(const ActiveContext&) = delete;
5554
ActiveContext& operator=(const ActiveContext&) = delete;
5655
explicit ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman, CConnman& connman,
57-
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CMasternodeMetaMan& mn_metaman,
58-
CSporkManager& sporkman, const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool,
56+
CDeterministicMNManager& dmnman, CGovernanceManager& govman, CSporkManager& sporkman,
57+
const chainlock::Chainlocks& chainlocks, CTxMemPool& mempool,
5958
chainlock::ChainlockHandler& clhandler, llmq::CInstantSendManager& isman,
60-
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,
61-
llmq::CQuorumSnapshotManager& qsnapman, llmq::CSigningManager& sigman,
62-
const CMasternodeSync& mn_sync, const CBLSSecretKey& operator_sk,
63-
const util::DbWrapperParams& db_params, bool quorums_watch);
59+
llmq::CQuorumManager& qman, llmq::CQuorumSnapshotManager& qsnapman,
60+
llmq::CSigningManager& sigman, const CMasternodeSync& mn_sync,
61+
const CBLSSecretKey& operator_sk, const util::DbWrapperParams& db_params, bool quorums_watch);
6462
~ActiveContext();
6563

6664
void Start();

src/init.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2188,14 +2188,13 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
21882188
return InitError(_("Invalid masternodeblsprivkey. Please see documentation."));
21892189
}
21902190
// Will init later in ThreadImport
2191-
node.active_ctx = std::make_unique<ActiveContext>(*node.llmq_ctx->bls_worker, chainman, *node.connman, *node.dmnman, *node.govman, *node.mn_metaman,
2191+
node.active_ctx = std::make_unique<ActiveContext>(*node.llmq_ctx->bls_worker, chainman, *node.connman, *node.dmnman, *node.govman,
21922192
*node.sporkman, *node.chainlocks, *node.mempool, *node.clhandler, *node.llmq_ctx->isman,
2193-
*node.llmq_ctx->quorum_block_processor, *node.llmq_ctx->qman, *node.llmq_ctx->qsnapman, *node.llmq_ctx->sigman,
2193+
*node.llmq_ctx->qman, *node.llmq_ctx->qsnapman, *node.llmq_ctx->sigman,
21942194
*node.mn_sync, operator_sk, dash_db_params, quorums_watch);
21952195
RegisterValidationInterface(node.active_ctx.get());
21962196
} else if (quorums_watch) {
2197-
node.observer_ctx = std::make_unique<llmq::ObserverContext>(*node.llmq_ctx->bls_worker, *node.dmnman, *node.mn_metaman,
2198-
*node.llmq_ctx->quorum_block_processor, *node.llmq_ctx->qman, *node.llmq_ctx->qsnapman,
2197+
node.observer_ctx = std::make_unique<llmq::ObserverContext>(*node.dmnman, *node.llmq_ctx->qman, *node.llmq_ctx->qsnapman,
21992198
chainman, *node.sporkman, dash_db_params);
22002199
RegisterValidationInterface(node.observer_ctx.get());
22012200
}
@@ -2233,12 +2232,14 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
22332232
if (node.active_ctx) {
22342233
node.peerman->AddExtraHandler(std::make_unique<llmq::NetDKG>(
22352234
node.peerman.get(), *node.sporkman, *node.active_ctx->qdkgsman, chainman, quorums_watch,
2235+
*node.llmq_ctx->qman, *node.active_ctx,
22362236
*node.llmq_ctx->bls_worker, *node.dmnman, *node.mn_metaman,
22372237
*node.active_ctx->dkgdbgman, *node.llmq_ctx->quorum_block_processor, *node.llmq_ctx->qsnapman,
22382238
*node.active_ctx->nodeman, *node.connman));
22392239
} else if (node.observer_ctx) {
22402240
node.peerman->AddExtraHandler(std::make_unique<llmq::NetDKG>(
2241-
node.peerman.get(), *node.sporkman, *node.observer_ctx->qdkgsman, chainman, /*quorums_watch=*/true));
2241+
node.peerman.get(), *node.sporkman, *node.observer_ctx->qdkgsman, chainman, /*quorums_watch=*/true,
2242+
*node.llmq_ctx->qman, *node.observer_ctx));
22422243
} else {
22432244
node.peerman->AddExtraHandler(std::make_unique<llmq::NetDKGStub>(node.peerman.get()));
22442245
}

src/llmq/net_dkg.cpp

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <llmq/dkgsession.h>
1414
#include <llmq/dkgsessionmgr.h>
1515
#include <llmq/options.h>
16+
#include <llmq/quorumsman.h>
1617
#include <llmq/utils.h>
1718
#include <net.h>
1819
#include <netmessagemaker.h>
@@ -212,38 +213,52 @@ bool ProcessPendingMessageBatch(const CConnman& connman, CDKGSession& session, C
212213

213214

214215
NetDKG::NetDKG(PeerManagerInternal* peer_manager, const CSporkManager& sporkman, CDKGSessionManager& qdkgsman,
215-
const ChainstateManager& chainman, bool quorums_watch) :
216+
const ChainstateManager& chainman, bool quorums_watch, CQuorumManager& qman, QuorumRole& role) :
216217
NetHandler(peer_manager),
217218
m_qdkgsman{qdkgsman},
219+
m_qman{qman},
218220
m_sporkman{sporkman},
219221
m_chainman{chainman},
220222
m_quorums_watch{quorums_watch},
221223
m_active{nullptr}
222224
{
225+
m_qdkgsman.InitializeHandlers([](const Consensus::LLMQParams& llmq_params,
226+
[[maybe_unused]] int quorum_idx) -> std::unique_ptr<CDKGSessionHandler> {
227+
return std::make_unique<CDKGSessionHandler>(llmq_params);
228+
});
229+
m_qman.ConnectManagers(&role, &m_qdkgsman);
223230
}
224231

225232
NetDKG::NetDKG(PeerManagerInternal* peer_manager, const CSporkManager& sporkman, CDKGSessionManager& qdkgsman,
226-
const ChainstateManager& chainman, bool quorums_watch,
233+
const ChainstateManager& chainman, bool quorums_watch, CQuorumManager& qman, QuorumRole& role,
227234
CBLSWorker& bls_worker, CDeterministicMNManager& dmnman, CMasternodeMetaMan& mn_metaman,
228235
CDKGDebugManager& dkgdbgman, CQuorumBlockProcessor& qblockman, CQuorumSnapshotManager& qsnapman,
229236
const CActiveMasternodeManager& mn_activeman, CConnman& connman) :
230237
NetHandler(peer_manager),
231238
m_qdkgsman{qdkgsman},
239+
m_qman{qman},
232240
m_sporkman{sporkman},
233241
m_chainman{chainman},
234242
m_quorums_watch{quorums_watch},
235-
m_active{std::make_unique<ActiveDKG>(ActiveDKG{bls_worker, dmnman, mn_metaman, dkgdbgman, qblockman, qsnapman,
236-
mn_activeman, connman})}
243+
m_active{std::make_unique<ActiveDKG>(ActiveDKG{dmnman, mn_metaman, dkgdbgman, qblockman, qsnapman, connman})}
237244
{
245+
m_qdkgsman.InitializeHandlers(
246+
[&](const Consensus::LLMQParams& llmq_params, int quorum_idx) -> std::unique_ptr<ActiveDKGSessionHandler> {
247+
return std::make_unique<ActiveDKGSessionHandler>(bls_worker, dmnman, mn_metaman, dkgdbgman, qdkgsman,
248+
qblockman, qsnapman, mn_activeman, chainman, sporkman,
249+
llmq_params, quorums_watch, quorum_idx);
250+
});
251+
m_qman.ConnectManagers(&role, &m_qdkgsman);
238252
}
239253

254+
NetDKG::~NetDKG() { m_qman.DisconnectManagers(); }
255+
240256
void NetDKG::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv)
241257
{
242258
if (!IsQuorumDKGEnabled(m_sporkman)) return;
243259

244-
if (msg_type != NetMsgType::QCONTRIB && msg_type != NetMsgType::QCOMPLAINT
245-
&& msg_type != NetMsgType::QJUSTIFICATION && msg_type != NetMsgType::QPCOMMITMENT
246-
&& msg_type != NetMsgType::QWATCH) {
260+
if (msg_type != NetMsgType::QCONTRIB && msg_type != NetMsgType::QCOMPLAINT && msg_type != NetMsgType::QJUSTIFICATION &&
261+
msg_type != NetMsgType::QPCOMMITMENT && msg_type != NetMsgType::QWATCH) {
247262
return;
248263
}
249264

@@ -296,7 +311,7 @@ void NetDKG::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStre
296311

297312
if (quorumIndex == -1) {
298313
const CBlockIndex* pQuorumBaseBlockIndex = WITH_LOCK(::cs_main,
299-
return m_chainman.m_blockman.LookupBlockIndex(quorumHash));
314+
return m_chainman.m_blockman.LookupBlockIndex(quorumHash));
300315
if (pQuorumBaseBlockIndex == nullptr) {
301316
LogPrintf("NetDKG -- unknown quorumHash %s\n", quorumHash.ToString());
302317
// NOTE: do not insta-ban for this, we might be lagging behind
@@ -320,10 +335,14 @@ void NetDKG::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStre
320335
}
321336

322337
int inv_type = 0;
323-
if (msg_type == NetMsgType::QCONTRIB) inv_type = MSG_QUORUM_CONTRIB;
324-
else if (msg_type == NetMsgType::QCOMPLAINT) inv_type = MSG_QUORUM_COMPLAINT;
325-
else if (msg_type == NetMsgType::QJUSTIFICATION) inv_type = MSG_QUORUM_JUSTIFICATION;
326-
else if (msg_type == NetMsgType::QPCOMMITMENT) inv_type = MSG_QUORUM_PREMATURE_COMMITMENT;
338+
if (msg_type == NetMsgType::QCONTRIB)
339+
inv_type = MSG_QUORUM_CONTRIB;
340+
else if (msg_type == NetMsgType::QCOMPLAINT)
341+
inv_type = MSG_QUORUM_COMPLAINT;
342+
else if (msg_type == NetMsgType::QJUSTIFICATION)
343+
inv_type = MSG_QUORUM_JUSTIFICATION;
344+
else if (msg_type == NetMsgType::QPCOMMITMENT)
345+
inv_type = MSG_QUORUM_PREMATURE_COMMITMENT;
327346
Assume(inv_type != 0); // guarded by the early-return above
328347

329348
auto pm = std::make_shared<CDataStream>(std::move(vRecv));
@@ -332,19 +351,26 @@ void NetDKG::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStre
332351
const uint256 hash = hw.GetHash();
333352

334353
const NodeId from = pfrom.GetId();
335-
const bool dispatched = m_qdkgsman.DoForHandler({llmqType, quorumIndex},
336-
[&](CDKGSessionHandler& handler) {
337-
CDKGPendingMessages* pending = nullptr;
338-
switch (inv_type) {
339-
case MSG_QUORUM_CONTRIB: pending = &handler.pendingContributions; break;
340-
case MSG_QUORUM_COMPLAINT: pending = &handler.pendingComplaints; break;
341-
case MSG_QUORUM_JUSTIFICATION: pending = &handler.pendingJustifications; break;
342-
case MSG_QUORUM_PREMATURE_COMMITMENT: pending = &handler.pendingPrematureCommitments; break;
343-
}
344-
Assume(pending != nullptr);
345-
WITH_LOCK(::cs_main, m_peer_manager->PeerEraseObjectRequest(from, CInv{static_cast<uint32_t>(inv_type), hash}));
346-
pending->PushPendingMessage(from, std::move(pm), hash);
347-
});
354+
const bool dispatched = m_qdkgsman.DoForHandler({llmqType, quorumIndex}, [&](CDKGSessionHandler& handler) {
355+
CDKGPendingMessages* pending = nullptr;
356+
switch (inv_type) {
357+
case MSG_QUORUM_CONTRIB:
358+
pending = &handler.pendingContributions;
359+
break;
360+
case MSG_QUORUM_COMPLAINT:
361+
pending = &handler.pendingComplaints;
362+
break;
363+
case MSG_QUORUM_JUSTIFICATION:
364+
pending = &handler.pendingJustifications;
365+
break;
366+
case MSG_QUORUM_PREMATURE_COMMITMENT:
367+
pending = &handler.pendingPrematureCommitments;
368+
break;
369+
}
370+
Assume(pending != nullptr);
371+
WITH_LOCK(::cs_main, m_peer_manager->PeerEraseObjectRequest(from, CInv{static_cast<uint32_t>(inv_type), hash}));
372+
pending->PushPendingMessage(from, std::move(pm), hash);
373+
});
348374
if (!dispatched) {
349375
LogPrintf("NetDKG -- no session handlers for quorumIndex [%d]\n", quorumIndex);
350376
m_peer_manager->PeerMisbehaving(pfrom.GetId(), 100);
@@ -365,8 +391,8 @@ bool NetDKG::AlreadyHave(const CInv& inv)
365391
bool seen = false;
366392
m_qdkgsman.ForEachHandler([&](CDKGSessionHandler& h) {
367393
if (seen) return;
368-
if (h.pendingContributions.HasSeen(inv.hash) || h.pendingComplaints.HasSeen(inv.hash)
369-
|| h.pendingJustifications.HasSeen(inv.hash) || h.pendingPrematureCommitments.HasSeen(inv.hash)) {
394+
if (h.pendingContributions.HasSeen(inv.hash) || h.pendingComplaints.HasSeen(inv.hash) ||
395+
h.pendingJustifications.HasSeen(inv.hash) || h.pendingPrematureCommitments.HasSeen(inv.hash)) {
370396
seen = true;
371397
}
372398
});
@@ -504,8 +530,8 @@ void NetDKG::HandleDKGRound(ActiveDKGSessionHandler& handler)
504530

505531
const auto tip_mn_list = active.dmnman.GetListAtChainTip();
506532
utils::EnsureQuorumConnections(handler.params, active.connman, m_sporkman,
507-
{active.dmnman, active.qsnapman, m_chainman, pQuorumBaseBlockIndex},
508-
tip_mn_list, curSession->ProTx(), /*is_masternode=*/true, handler.QuorumsWatch());
533+
{active.dmnman, active.qsnapman, m_chainman, pQuorumBaseBlockIndex}, tip_mn_list,
534+
curSession->ProTx(), /*is_masternode=*/true, handler.QuorumsWatch());
509535
if (curSession->AreWeMember()) {
510536
utils::AddQuorumProbeConnections(handler.params, active.connman, active.mn_metaman, m_sporkman,
511537
{active.dmnman, active.qsnapman, m_chainman, pQuorumBaseBlockIndex},

src/llmq/net_dkg.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#include <consensus/params.h>
99
#include <net_processing.h>
1010
#include <sync.h>
11-
#include <unordered_lru_cache.h>
1211
#include <uint256.h>
12+
#include <unordered_lru_cache.h>
1313

1414
#include <map>
1515
#include <memory>
@@ -28,7 +28,9 @@ class ActiveDKGSessionHandler;
2828
class CDKGDebugManager;
2929
class CDKGSessionManager;
3030
class CQuorumBlockProcessor;
31+
class CQuorumManager;
3132
class CQuorumSnapshotManager;
33+
class QuorumRole;
3234
} // namespace llmq
3335

3436
namespace llmq {
@@ -52,15 +54,17 @@ class NetDKG final : public NetHandler
5254
public:
5355
//! Observer-mode constructor.
5456
NetDKG(PeerManagerInternal* peer_manager, const CSporkManager& sporkman, CDKGSessionManager& qdkgsman,
55-
const ChainstateManager& chainman, bool quorums_watch);
57+
const ChainstateManager& chainman, bool quorums_watch, CQuorumManager& qman, QuorumRole& role);
5658

5759
//! Active-mode constructor: takes the masternode-only dep bundle as required references.
5860
NetDKG(PeerManagerInternal* peer_manager, const CSporkManager& sporkman, CDKGSessionManager& qdkgsman,
59-
const ChainstateManager& chainman, bool quorums_watch,
61+
const ChainstateManager& chainman, bool quorums_watch, CQuorumManager& qman, QuorumRole& role,
6062
CBLSWorker& bls_worker, CDeterministicMNManager& dmnman, CMasternodeMetaMan& mn_metaman,
6163
CDKGDebugManager& dkgdbgman, CQuorumBlockProcessor& qblockman, CQuorumSnapshotManager& qsnapman,
6264
const CActiveMasternodeManager& mn_activeman, CConnman& connman);
6365

66+
~NetDKG();
67+
6468
// NetHandler
6569
void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv) override;
6670
bool AlreadyHave(const CInv& inv) override;
@@ -76,20 +80,19 @@ class NetDKG final : public NetHandler
7680
private:
7781
//! Bundle of refs that exist only in active masternode mode.
7882
struct ActiveDKG {
79-
CBLSWorker& bls_worker;
8083
CDeterministicMNManager& dmnman;
8184
CMasternodeMetaMan& mn_metaman;
8285
CDKGDebugManager& dkgdbgman;
8386
CQuorumBlockProcessor& qblockman;
8487
CQuorumSnapshotManager& qsnapman;
85-
const CActiveMasternodeManager& mn_activeman;
8688
CConnman& connman;
8789
};
8890

8991
void PhaseHandlerThread(ActiveDKGSessionHandler& handler);
9092
void HandleDKGRound(ActiveDKGSessionHandler& handler);
9193

9294
CDKGSessionManager& m_qdkgsman;
95+
CQuorumManager& m_qman;
9396
const CSporkManager& m_sporkman;
9497
const ChainstateManager& m_chainman;
9598
const bool m_quorums_watch;

src/llmq/observer.cpp

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,19 @@
55
#include <llmq/observer.h>
66

77
#include <llmq/debug.h>
8-
#include <llmq/dkgsessionhandler.h>
98
#include <llmq/dkgsessionmgr.h>
109

11-
#include <chain.h>
12-
#include <validation.h>
13-
1410
namespace llmq {
15-
ObserverContext::ObserverContext(CBLSWorker& bls_worker, CDeterministicMNManager& dmnman,
16-
CMasternodeMetaMan& mn_metaman,
17-
llmq::CQuorumBlockProcessor& qblockman, llmq::CQuorumManager& qman,
11+
ObserverContext::ObserverContext(CDeterministicMNManager& dmnman, llmq::CQuorumManager& qman,
1812
llmq::CQuorumSnapshotManager& qsnapman, const ChainstateManager& chainman,
1913
const CSporkManager& sporkman, const util::DbWrapperParams& db_params) :
2014
QuorumRole{qman},
2115
dkgdbgman{std::make_unique<llmq::CDKGDebugManager>(dmnman, qsnapman, chainman)},
2216
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(dmnman, qsnapman, chainman, sporkman, db_params)}
2317
{
24-
qdkgsman->InitializeHandlers([&](const Consensus::LLMQParams& llmq_params,
25-
[[maybe_unused]] int quorum_idx) -> std::unique_ptr<llmq::CDKGSessionHandler> {
26-
return std::make_unique<llmq::CDKGSessionHandler>(llmq_params);
27-
});
28-
m_qman.ConnectManagers(this, qdkgsman.get());
2918
}
3019

31-
ObserverContext::~ObserverContext()
32-
{
33-
m_qman.DisconnectManagers();
34-
}
20+
ObserverContext::~ObserverContext() = default;
3521

3622
void ObserverContext::InitializeCurrentBlockTip(const CBlockIndex* tip, bool ibd)
3723
{

0 commit comments

Comments
 (0)