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
214215NetDKG::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
225232NetDKG::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+
240256void 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},
0 commit comments