Skip to content

Commit 01c0b94

Browse files
committed
refactor: separate active session routines into dedicated class
1 parent bb90306 commit 01c0b94

File tree

9 files changed

+170
-89
lines changed

9 files changed

+170
-89
lines changed

src/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ endif
151151
.PHONY: FORCE check-symbols check-security
152152
# dash core #
153153
BITCOIN_CORE_H = \
154+
active/dkgsession.h \
154155
active/dkgsessionhandler.h \
155156
active/quorums.h \
156157
addrdb.h \

src/active/dkgsession.cpp

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Distributed under the MIT software license, see the accompanying
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

5-
#include <llmq/dkgsession.h>
5+
#include <active/dkgsession.h>
66

77
#include <evo/deterministicmns.h>
88
#include <llmq/debug.h>
@@ -20,7 +20,22 @@
2020
#include <cxxtimer.hpp>
2121

2222
namespace llmq {
23-
void CDKGSession::Contribute(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
23+
ActiveDKGSession::ActiveDKGSession(CBLSWorker& bls_worker, CDeterministicMNManager& dmnman, CDKGDebugManager& dkgdbgman,
24+
CDKGSessionManager& qdkgsman, CMasternodeMetaMan& mn_metaman,
25+
CQuorumSnapshotManager& qsnapman, const CActiveMasternodeManager& mn_activeman,
26+
const ChainstateManager& chainman, const CSporkManager& sporkman,
27+
const CBlockIndex* base_block_index, const Consensus::LLMQParams& params) :
28+
CDKGSession(bls_worker, dmnman, dkgdbgman, qdkgsman, qsnapman, chainman, base_block_index, params),
29+
m_mn_metaman{mn_metaman},
30+
m_mn_activeman{mn_activeman},
31+
m_sporkman{sporkman},
32+
m_use_legacy_bls{!DeploymentActiveAfter(m_quorum_base_block_index, Params().GetConsensus(), Consensus::DEPLOYMENT_V19)}
33+
{
34+
}
35+
36+
ActiveDKGSession::~ActiveDKGSession() = default;
37+
38+
void ActiveDKGSession::Contribute(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
2439
{
2540
CDKGLogger logger(*this, __func__, __LINE__);
2641

@@ -43,7 +58,7 @@ void CDKGSession::Contribute(CDKGPendingMessages& pendingMessages, PeerManager&
4358
SendContributions(pendingMessages, peerman);
4459
}
4560

46-
void CDKGSession::SendContributions(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
61+
void ActiveDKGSession::SendContributions(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
4762
{
4863
CDKGLogger logger(*this, __func__, __LINE__);
4964

@@ -83,7 +98,7 @@ void CDKGSession::SendContributions(CDKGPendingMessages& pendingMessages, PeerMa
8398

8499
logger.Batch("encrypted contributions. time=%d", t1.count());
85100

86-
qc.sig = m_mn_activeman->Sign(qc.GetSignHash(), m_use_legacy_bls);
101+
qc.sig = m_mn_activeman.Sign(qc.GetSignHash(), m_use_legacy_bls);
87102

88103
logger.Flush();
89104

@@ -100,7 +115,7 @@ void CDKGSession::SendContributions(CDKGPendingMessages& pendingMessages, PeerMa
100115
// The resulting aggregated vvec is then used to recover a public key share
101116
// The public key share must match the public key belonging to the aggregated secret key contributions
102117
// See CBLSWorker::VerifyContributionShares for more details.
103-
void CDKGSession::VerifyPendingContributions()
118+
void ActiveDKGSession::VerifyPendingContributions()
104119
{
105120
AssertLockHeld(cs_pending);
106121

@@ -154,7 +169,7 @@ void CDKGSession::VerifyPendingContributions()
154169
pendingContributionVerifications.clear();
155170
}
156171

157-
void CDKGSession::VerifyAndComplain(CConnman& connman, CDKGPendingMessages& pendingMessages, PeerManager& peerman)
172+
void ActiveDKGSession::VerifyAndComplain(CConnman& connman, CDKGPendingMessages& pendingMessages, PeerManager& peerman)
158173
{
159174
if (!AreWeMember()) {
160175
return;
@@ -195,7 +210,7 @@ void CDKGSession::VerifyAndComplain(CConnman& connman, CDKGPendingMessages& pend
195210
SendComplaint(pendingMessages, peerman);
196211
}
197212

198-
void CDKGSession::VerifyConnectionAndMinProtoVersions(CConnman& connman) const
213+
void ActiveDKGSession::VerifyConnectionAndMinProtoVersions(CConnman& connman) const
199214
{
200215
assert(m_mn_metaman.IsValid());
201216

@@ -239,7 +254,7 @@ void CDKGSession::VerifyConnectionAndMinProtoVersions(CConnman& connman) const
239254
}
240255
}
241256

242-
void CDKGSession::SendComplaint(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
257+
void ActiveDKGSession::SendComplaint(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
243258
{
244259
CDKGLogger logger(*this, __func__, __LINE__);
245260

@@ -269,7 +284,7 @@ void CDKGSession::SendComplaint(CDKGPendingMessages& pendingMessages, PeerManage
269284

270285
logger.Batch("sending complaint. badCount=%d, complaintCount=%d", badCount, complaintCount);
271286

272-
qc.sig = m_mn_activeman->Sign(qc.GetSignHash(), m_use_legacy_bls);
287+
qc.sig = m_mn_activeman.Sign(qc.GetSignHash(), m_use_legacy_bls);
273288

274289
logger.Flush();
275290

@@ -281,7 +296,7 @@ void CDKGSession::SendComplaint(CDKGPendingMessages& pendingMessages, PeerManage
281296
pendingMessages.PushPendingMessage(-1, qc, peerman);
282297
}
283298

284-
void CDKGSession::VerifyAndJustify(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
299+
void ActiveDKGSession::VerifyAndJustify(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
285300
{
286301
if (!AreWeMember()) {
287302
return;
@@ -322,8 +337,8 @@ void CDKGSession::VerifyAndJustify(CDKGPendingMessages& pendingMessages, PeerMan
322337
}
323338
}
324339

325-
void CDKGSession::SendJustification(CDKGPendingMessages& pendingMessages, PeerManager& peerman,
326-
const std::set<uint256>& forMembers)
340+
void ActiveDKGSession::SendJustification(CDKGPendingMessages& pendingMessages, PeerManager& peerman,
341+
const std::set<uint256>& forMembers)
327342
{
328343
CDKGLogger logger(*this, __func__, __LINE__);
329344

@@ -359,7 +374,7 @@ void CDKGSession::SendJustification(CDKGPendingMessages& pendingMessages, PeerMa
359374
return;
360375
}
361376

362-
qj.sig = m_mn_activeman->Sign(qj.GetSignHash(), m_use_legacy_bls);
377+
qj.sig = m_mn_activeman.Sign(qj.GetSignHash(), m_use_legacy_bls);
363378

364379
logger.Flush();
365380

@@ -371,7 +386,7 @@ void CDKGSession::SendJustification(CDKGPendingMessages& pendingMessages, PeerMa
371386
pendingMessages.PushPendingMessage(-1, qj, peerman);
372387
}
373388

374-
void CDKGSession::VerifyAndCommit(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
389+
void ActiveDKGSession::VerifyAndCommit(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
375390
{
376391
if (!AreWeMember()) {
377392
return;
@@ -416,7 +431,7 @@ void CDKGSession::VerifyAndCommit(CDKGPendingMessages& pendingMessages, PeerMana
416431
SendCommitment(pendingMessages, peerman);
417432
}
418433

419-
void CDKGSession::SendCommitment(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
434+
void ActiveDKGSession::SendCommitment(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
420435
{
421436
CDKGLogger logger(*this, __func__, __LINE__);
422437

@@ -498,7 +513,7 @@ void CDKGSession::SendCommitment(CDKGPendingMessages& pendingMessages, PeerManag
498513
(*commitmentHash.begin())++;
499514
}
500515

501-
qc.sig = m_mn_activeman->Sign(commitmentHash, m_use_legacy_bls);
516+
qc.sig = m_mn_activeman.Sign(commitmentHash, m_use_legacy_bls);
502517
qc.quorumSig = skShare.Sign(commitmentHash, m_use_legacy_bls);
503518

504519
if (lieType == 3) {
@@ -528,7 +543,7 @@ void CDKGSession::SendCommitment(CDKGPendingMessages& pendingMessages, PeerManag
528543
pendingMessages.PushPendingMessage(-1, qc, peerman);
529544
}
530545

531-
std::vector<CFinalCommitment> CDKGSession::FinalizeCommitments()
546+
std::vector<CFinalCommitment> ActiveDKGSession::FinalizeCommitments()
532547
{
533548
if (!AreWeMember()) {
534549
return {};
@@ -637,7 +652,7 @@ std::vector<CFinalCommitment> CDKGSession::FinalizeCommitments()
637652
return finalCommitments;
638653
}
639654

640-
CFinalCommitment CDKGSession::FinalizeSingleCommitment()
655+
CFinalCommitment ActiveDKGSession::FinalizeSingleCommitment()
641656
{
642657
if (!AreWeMember()) {
643658
return {};
@@ -664,7 +679,7 @@ CFinalCommitment CDKGSession::FinalizeSingleCommitment()
664679
// TODO: use sk1 here instead and use recovery mechanism from shares, but that's not trivial to do
665680
const bool workaround_qpublic_key = true;
666681
if (workaround_qpublic_key) {
667-
fqc.quorumPublicKey = m_mn_activeman->GetPubKey();
682+
fqc.quorumPublicKey = m_mn_activeman.GetPubKey();
668683
}
669684
const bool isQuorumRotationEnabled{false};
670685
fqc.nVersion = CFinalCommitment::GetVersion(isQuorumRotationEnabled,
@@ -676,7 +691,7 @@ CFinalCommitment CDKGSession::FinalizeSingleCommitment()
676691
fqc.quorumVvecHash);
677692
fqc.quorumSig = sk1.Sign(commitmentHash, m_use_legacy_bls);
678693

679-
fqc.membersSig = m_mn_activeman->Sign(commitmentHash, m_use_legacy_bls);
694+
fqc.membersSig = m_mn_activeman.Sign(commitmentHash, m_use_legacy_bls);
680695

681696
if (workaround_qpublic_key) {
682697
fqc.quorumSig = fqc.membersSig;
@@ -694,4 +709,10 @@ CFinalCommitment CDKGSession::FinalizeSingleCommitment()
694709

695710
return fqc;
696711
}
712+
713+
bool ActiveDKGSession::MaybeDecrypt(const CBLSIESMultiRecipientObjects<CBLSSecretKey>& obj, size_t idx,
714+
CBLSSecretKey& ret_obj, int version)
715+
{
716+
return m_mn_activeman.Decrypt(obj, idx, ret_obj, version);
717+
}
697718
} // namespace llmq

src/active/dkgsession.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) 2018-2025 The Dash Core developers
2+
// Distributed under the MIT software license, see the accompanying
3+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
#ifndef BITCOIN_ACTIVE_DKGSESSION_H
6+
#define BITCOIN_ACTIVE_DKGSESSION_H
7+
8+
#include <llmq/dkgsession.h>
9+
10+
namespace llmq {
11+
class ActiveDKGSession final : public llmq::CDKGSession
12+
{
13+
private:
14+
CMasternodeMetaMan& m_mn_metaman;
15+
const CActiveMasternodeManager& m_mn_activeman;
16+
const CSporkManager& m_sporkman;
17+
const bool m_use_legacy_bls{false};
18+
19+
public:
20+
ActiveDKGSession() = delete;
21+
ActiveDKGSession(const ActiveDKGSession&) = delete;
22+
ActiveDKGSession& operator=(const ActiveDKGSession&) = delete;
23+
ActiveDKGSession(CBLSWorker& bls_worker, CDeterministicMNManager& dmnman, CDKGDebugManager& dkgdbgman,
24+
CDKGSessionManager& qdkgsman, CMasternodeMetaMan& mn_metaman, CQuorumSnapshotManager& qsnapman,
25+
const CActiveMasternodeManager& mn_activeman, const ChainstateManager& chainman,
26+
const CSporkManager& sporkman, const CBlockIndex* base_block_index,
27+
const Consensus::LLMQParams& params);
28+
~ActiveDKGSession();
29+
30+
public:
31+
// Phase 1: contribution
32+
void Contribute(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override;
33+
void SendContributions(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override;
34+
void VerifyPendingContributions() override EXCLUSIVE_LOCKS_REQUIRED(cs_pending);
35+
36+
// Phase 2: complaint
37+
void VerifyAndComplain(CConnman& connman, CDKGPendingMessages& pendingMessages, PeerManager& peerman) override
38+
EXCLUSIVE_LOCKS_REQUIRED(!cs_pending);
39+
void VerifyConnectionAndMinProtoVersions(CConnman& connman) const override;
40+
void SendComplaint(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override;
41+
42+
// Phase 3: justification
43+
void VerifyAndJustify(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override
44+
EXCLUSIVE_LOCKS_REQUIRED(!invCs);
45+
void SendJustification(CDKGPendingMessages& pendingMessages, PeerManager& peerman,
46+
const std::set<uint256>& forMembers) override;
47+
48+
// Phase 4: commit
49+
void VerifyAndCommit(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override;
50+
void SendCommitment(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override;
51+
52+
// Phase 5: aggregate/finalize
53+
std::vector<CFinalCommitment> FinalizeCommitments() EXCLUSIVE_LOCKS_REQUIRED(!invCs) override;
54+
55+
// All Phases 5-in-1 for single-node-quorum
56+
CFinalCommitment FinalizeSingleCommitment() override;
57+
58+
private:
59+
//! CDKGSession
60+
bool MaybeDecrypt(const CBLSIESMultiRecipientObjects<CBLSSecretKey>& obj, size_t idx, CBLSSecretKey& ret_obj,
61+
int version) override;
62+
};
63+
} // namespace llmq
64+
65+
#endif // BITCOIN_ACTIVE_DKGSESSION_H

src/active/dkgsessionhandler.cpp

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

55
#include <active/dkgsessionhandler.h>
66

7+
#include <active/dkgsession.h>
78
#include <evo/deterministicmns.h>
89
#include <llmq/blockprocessor.h>
910
#include <llmq/debug.h>
@@ -23,8 +24,8 @@ ActiveDKGSessionHandler::ActiveDKGSessionHandler(
2324
llmq::CDKGDebugManager& dkgdbgman, llmq::CDKGSessionManager& qdkgsman, llmq::CQuorumBlockProcessor& qblockman,
2425
llmq::CQuorumSnapshotManager& qsnapman, const CActiveMasternodeManager& mn_activeman, const ChainstateManager& chainman,
2526
const CSporkManager& sporkman, const Consensus::LLMQParams& llmq_params, bool quorums_watch, int quorums_idx) :
26-
llmq::CDKGSessionHandler(bls_worker, dmnman, dkgdbgman, qdkgsman, mn_metaman, qblockman, qsnapman, &mn_activeman,
27-
chainman, sporkman, llmq_params, quorums_watch, quorums_idx),
27+
llmq::CDKGSessionHandler(bls_worker, dmnman, dkgdbgman, qdkgsman, qsnapman, chainman, llmq_params, quorums_watch,
28+
quorums_idx),
2829
m_bls_worker{bls_worker},
2930
m_dmnman{dmnman},
3031
m_mn_metaman{mn_metaman},
@@ -37,6 +38,11 @@ ActiveDKGSessionHandler::ActiveDKGSessionHandler(
3738
m_sporkman{sporkman},
3839
m_quorums_watch{quorums_watch}
3940
{
41+
// Overwrite session initialized in parent
42+
curSession.reset();
43+
curSession = std::make_unique<ActiveDKGSession>(m_bls_worker, m_dmnman, m_dkgdbgman, m_qdkgsman, m_mn_metaman,
44+
m_qsnapman, m_mn_activeman, m_chainman, m_sporkman,
45+
/*pQuorumBaseBlockIndex=*/nullptr, llmq_params);
4046
}
4147

4248
ActiveDKGSessionHandler::~ActiveDKGSessionHandler() = default;
@@ -99,9 +105,9 @@ bool ActiveDKGSessionHandler::InitNewQuorum(const CBlockIndex* pQuorumBaseBlockI
99105
return false;
100106
}
101107

102-
curSession = std::make_unique<CDKGSession>(pQuorumBaseBlockIndex, params, m_bls_worker, m_dmnman, m_qdkgsman,
103-
m_dkgdbgman, m_mn_metaman, m_qsnapman, &m_mn_activeman, m_chainman,
104-
m_sporkman);
108+
curSession = std::make_unique<ActiveDKGSession>(m_bls_worker, m_dmnman, m_dkgdbgman, m_qdkgsman, m_mn_metaman,
109+
m_qsnapman, m_mn_activeman, m_chainman, m_sporkman,
110+
pQuorumBaseBlockIndex, params);
105111

106112
if (!curSession->Init(m_mn_activeman.GetProTxHash(), quorumIndex)) {
107113
LogPrintf("ActiveDKGSessionHandler::%s -- height[%d] quorum initialization failed for %s qi[%d]\n", __func__,

src/llmq/dkgsession.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,24 @@ CDKGMember::CDKGMember(const CDeterministicMNCPtr& _dmn, size_t _idx) :
6666
{
6767
}
6868

69-
CDKGSession::CDKGSession(const CBlockIndex* pQuorumBaseBlockIndex, const Consensus::LLMQParams& _params,
70-
CBLSWorker& _blsWorker, CDeterministicMNManager& dmnman, CDKGSessionManager& _dkgManager,
71-
CDKGDebugManager& _dkgDebugManager, CMasternodeMetaMan& mn_metaman,
72-
CQuorumSnapshotManager& qsnapman, const CActiveMasternodeManager* const mn_activeman,
73-
const ChainstateManager& chainman, const CSporkManager& sporkman) :
74-
params{_params},
69+
CDKGSession::CDKGSession(CBLSWorker& _blsWorker, CDeterministicMNManager& dmnman, CDKGDebugManager& _dkgDebugManager,
70+
CDKGSessionManager& _dkgManager, CQuorumSnapshotManager& qsnapman,
71+
const ChainstateManager& chainman, const CBlockIndex* pQuorumBaseBlockIndex,
72+
const Consensus::LLMQParams& _params) :
7573
blsWorker{_blsWorker},
7674
cache{_blsWorker},
7775
m_dmnman{dmnman},
78-
dkgManager{_dkgManager},
7976
dkgDebugManager{_dkgDebugManager},
80-
m_mn_metaman{mn_metaman},
77+
dkgManager{_dkgManager},
8178
m_qsnapman{qsnapman},
82-
m_mn_activeman{mn_activeman},
8379
m_chainman{chainman},
84-
m_sporkman{sporkman},
85-
m_quorum_base_block_index{pQuorumBaseBlockIndex},
86-
m_use_legacy_bls{!DeploymentActiveAfter(m_quorum_base_block_index, chainman.GetConsensus(), Consensus::DEPLOYMENT_V19)}
80+
params{_params},
81+
m_quorum_base_block_index{pQuorumBaseBlockIndex}
8782
{
8883
}
8984

85+
CDKGSession::~CDKGSession() = default;
86+
9087
bool CDKGSession::Init(const uint256& _myProTxHash, int _quorumIndex)
9188
{
9289
const auto mns = utils::GetAllQuorumMembers(params.type, {m_dmnman, m_qsnapman, m_chainman, m_quorum_base_block_index});
@@ -255,7 +252,7 @@ std::optional<CInv> CDKGSession::ReceiveMessage(const CDKGContribution& qc)
255252

256253
bool complain = false;
257254
CBLSSecretKey skContribution;
258-
if (!m_mn_activeman->Decrypt(*qc.contributions, *myIdx, skContribution, PROTOCOL_VERSION)) {
255+
if (!MaybeDecrypt(*qc.contributions, *myIdx, skContribution, PROTOCOL_VERSION)) {
259256
logger.Batch("contribution from %s could not be decrypted", member->dmn->proTxHash.ToString());
260257
complain = true;
261258
} else if (member->idx != myIdx && ShouldSimulateError(DKGError::type::COMPLAIN_LIE)) {

0 commit comments

Comments
 (0)