Skip to content

Commit ff1ddc9

Browse files
Merge #6443: refactor: move CConnman and PeerManager out of CDeterministicMNManager, LLMQContext member ctors, reduce use in CJContext
7d26061 refactor: move `CConnman`, `PeerManager` out of `CCoinJoinClientQueueManager` ctor (Kittywhiskers Van Gogh) 953ba96 refactor: move `CConnman` out of `CoinJoinWalletManager` ctor (Kittywhiskers Van Gogh) ac930a8 refactor: remove unused `CConnman` from `CDeterministicMNManager` ctor (Kittywhiskers Van Gogh) a14e604 refactor: remove `CConnman`, `PeerManager` from `LLMQContext` ctor (Kittywhiskers Van Gogh) d9e5cc7 refactor: move `PeerManager` out of `CInstantSendManager` ctor (Kittywhiskers Van Gogh) 82d1aed refactor: move `CConnman`, `PeerManager` out of `CSigSharesManager` ctor (Kittywhiskers Van Gogh) 7498a38 refactor: move `PeerManager` out of `CSigningManager` ctor (Kittywhiskers Van Gogh) 7ebc61e refactor: move `CConnman` out of `CQuorumManager` ctor (Kittywhiskers Van Gogh) c07b522 refactor: move `CConnman` out of `CDKGSession{,Handler,Manager}` ctor (Kittywhiskers Van Gogh) 01876c7 refactor: move `PeerManager` out of `CDKGSession{,Handler,Manager}` ctor (Kittywhiskers Van Gogh) cc0e771 refactor: start BLS thread in `LLMQContext` ctor, move `Start` downwards (Kittywhiskers Van Gogh) Pull request description: ## Additional Information * Depends on #6425 * Dependency for #6304 * In order to reduce the logic used in chainstate initialization (that will be split out of `init.cpp` in [bitcoin#23280](bitcoin#23280)), the spinning up of threads (as done in `LLMQContext::Start()`) needs to be moved down. * They were moved up in [dash#5752](#5752) as `CBLSWorker` is a part of `LLMQContext` and `CBLSWorker` is needed during chainstate verification. As suggested in dash#5752, an alternate fix to the one already merged in was to move `CBLSWorker` `Start()`/`Stop()` to the constructor, which is done here. * Another alternate fix is that we move it out of `LLMQContext` entirely and let it remain in `NodeContext` though this approach has not been taken. * The reason we cannot retain the status quo is because `bitcoin-chainstate` (the binary introduced in [bitcoin#24304](bitcoin#24304) that's built on the code split off in [bitcoin#23280](bitcoin#23280)) aims to be devoid of P2P logic and this is reflected in the source files used to build it ([source](https://github.com/bitcoin/bitcoin/pull/24304/files#diff-4cb884d03ebb901069e4ee5de5d02538c40dd9b39919c615d8eaa9d364bbbd77R794)). (Also, there's no `NodeContext`, [source](https://github.com/bitcoin/bitcoin/pull/24304/files#diff-4cb884d03ebb901069e4ee5de5d02538c40dd9b39919c615d8eaa9d364bbbd77R795-R798)) * This means need to separate P2P and validation components from Dash-specific logic in order for the split to work as expected. This PR is a step in that direction by moving P2P elements (`CConnman` and `PeerManager`) out of constructors. * As it stands, there are two sources for Dash-specific components to have access to P2P components, initialization (e.g. through `LLMQContext::Start()` or `PeerManagerImpl::ProcessMessage()`). ## Breaking Changes None expected. While changes are present in initialization order, consensus behaviour should remain unchanged. ## Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas **(note: N/A)** - [x] I have added or updated relevant unit/integration/functional/e2e tests **(note: N/A)** - [x] I have made corresponding changes to the documentation **(note: N/A)** - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ACKs for top commit: knst: utACK 7d26061 UdjinM6: utACK 7d26061 Tree-SHA512: 4f12cbda935cad3a186acb31fed513cea489b0d3a55aa80be8e1336d10cbe1579d6d3db862a78a167134650c9e97816732acaf0c85ab759f6555b1b6be99ec02
2 parents c588944 + 7d26061 commit ff1ddc9

27 files changed

+386
-388
lines changed

src/coinjoin/client.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,20 @@
3030
#include <memory>
3131
#include <univalue.h>
3232

33-
PeerMsgRet CCoinJoinClientQueueManager::ProcessMessage(const CNode& peer, std::string_view msg_type, CDataStream& vRecv)
33+
PeerMsgRet CCoinJoinClientQueueManager::ProcessMessage(const CNode& peer, CConnman& connman, PeerManager& peerman,
34+
std::string_view msg_type, CDataStream& vRecv)
3435
{
3536
if (m_is_masternode) return {};
3637
if (!m_mn_sync.IsBlockchainSynced()) return {};
3738

3839
if (msg_type == NetMsgType::DSQUEUE) {
39-
return CCoinJoinClientQueueManager::ProcessDSQueue(peer, vRecv);
40+
return CCoinJoinClientQueueManager::ProcessDSQueue(peer, connman, peerman, vRecv);
4041
}
4142
return {};
4243
}
4344

44-
PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataStream& vRecv)
45+
PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CConnman& connman, PeerManager& peerman,
46+
CDataStream& vRecv)
4547
{
4648
assert(m_mn_metaman.IsValid());
4749

@@ -50,7 +52,7 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
5052

5153
{
5254
LOCK(cs_main);
53-
Assert(peerman)->EraseObjectRequest(peer.GetId(), CInv(MSG_DSQ, dsq.GetHash()));
55+
peerman.EraseObjectRequest(peer.GetId(), CInv(MSG_DSQ, dsq.GetHash()));
5456
}
5557

5658
if (dsq.masternodeOutpoint.IsNull() && dsq.m_protxHash.IsNull()) {
@@ -102,8 +104,9 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
102104
}
103105

104106
// if the queue is ready, submit if we can
105-
if (dsq.fReady && m_walletman.ForAnyCJClientMan([this, &dmn](std::unique_ptr<CCoinJoinClientManager>& clientman) {
106-
return clientman->TrySubmitDenominate(dmn->pdmnState->addr, this->connman);
107+
if (dsq.fReady &&
108+
m_walletman.ForAnyCJClientMan([this, &connman, &dmn](std::unique_ptr<CCoinJoinClientManager>& clientman) {
109+
return clientman->TrySubmitDenominate(dmn->pdmnState->addr, connman);
107110
})) {
108111
LogPrint(BCLog::COINJOIN, "DSQUEUE -- CoinJoin queue (%s) is ready on masternode %s\n", dsq.ToString(),
109112
dmn->pdmnState->addr.ToStringAddrPort());
@@ -132,7 +135,7 @@ PeerMsgRet CCoinJoinClientQueueManager::ProcessDSQueue(const CNode& peer, CDataS
132135
WITH_LOCK(cs_vecqueue, vecCoinJoinQueue.push_back(dsq));
133136
}
134137
} // cs_ProcessDSQueue
135-
peerman->RelayDSQ(dsq);
138+
peerman.RelayDSQ(dsq);
136139
return {};
137140
}
138141

@@ -1917,11 +1920,11 @@ void CoinJoinWalletManager::Add(const std::shared_ptr<CWallet>& wallet)
19171920
g_wallet_init_interface.InitCoinJoinSettings(*this);
19181921
}
19191922

1920-
void CoinJoinWalletManager::DoMaintenance()
1923+
void CoinJoinWalletManager::DoMaintenance(CConnman& connman)
19211924
{
19221925
LOCK(cs_wallet_manager_map);
19231926
for (auto& [_, clientman] : m_wallet_manager_map) {
1924-
clientman->DoMaintenance(m_chainman, m_connman, m_mempool);
1927+
clientman->DoMaintenance(m_chainman, connman, m_mempool);
19251928
}
19261929
}
19271930

src/coinjoin/client.h

+7-13
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,10 @@ class CoinJoinWalletManager {
7676
using wallet_name_cjman_map = std::map<const std::string, std::unique_ptr<CCoinJoinClientManager>>;
7777

7878
public:
79-
CoinJoinWalletManager(ChainstateManager& chainman, CConnman& connman, CDeterministicMNManager& dmnman,
80-
CMasternodeMetaMan& mn_metaman, const CTxMemPool& mempool, const CMasternodeSync& mn_sync,
79+
CoinJoinWalletManager(ChainstateManager& chainman, CDeterministicMNManager& dmnman, CMasternodeMetaMan& mn_metaman,
80+
const CTxMemPool& mempool, const CMasternodeSync& mn_sync,
8181
const std::unique_ptr<CCoinJoinClientQueueManager>& queueman, bool is_masternode) :
8282
m_chainman(chainman),
83-
m_connman(connman),
8483
m_dmnman(dmnman),
8584
m_mn_metaman(mn_metaman),
8685
m_mempool(mempool),
@@ -97,7 +96,7 @@ class CoinJoinWalletManager {
9796
}
9897

9998
void Add(const std::shared_ptr<CWallet>& wallet);
100-
void DoMaintenance();
99+
void DoMaintenance(CConnman& connman);
101100

102101
void Remove(const std::string& name);
103102
void Flush(const std::string& name);
@@ -122,7 +121,6 @@ class CoinJoinWalletManager {
122121

123122
private:
124123
ChainstateManager& m_chainman;
125-
CConnman& m_connman;
126124
CDeterministicMNManager& m_dmnman;
127125
CMasternodeMetaMan& m_mn_metaman;
128126
const CTxMemPool& m_mempool;
@@ -234,8 +232,6 @@ class CCoinJoinClientSession : public CCoinJoinBaseSession
234232
class CCoinJoinClientQueueManager : public CCoinJoinBaseManager
235233
{
236234
private:
237-
CConnman& connman;
238-
std::unique_ptr<PeerManager>& peerman;
239235
CoinJoinWalletManager& m_walletman;
240236
CDeterministicMNManager& m_dmnman;
241237
CMasternodeMetaMan& m_mn_metaman;
@@ -245,20 +241,18 @@ class CCoinJoinClientQueueManager : public CCoinJoinBaseManager
245241
const bool m_is_masternode;
246242

247243
public:
248-
explicit CCoinJoinClientQueueManager(CConnman& _connman, std::unique_ptr<PeerManager>& _peerman,
249-
CoinJoinWalletManager& walletman, CDeterministicMNManager& dmnman,
244+
explicit CCoinJoinClientQueueManager(CoinJoinWalletManager& walletman, CDeterministicMNManager& dmnman,
250245
CMasternodeMetaMan& mn_metaman, const CMasternodeSync& mn_sync,
251246
bool is_masternode) :
252-
connman(_connman),
253-
peerman(_peerman),
254247
m_walletman(walletman),
255248
m_dmnman(dmnman),
256249
m_mn_metaman(mn_metaman),
257250
m_mn_sync(mn_sync),
258251
m_is_masternode{is_masternode} {};
259252

260-
PeerMsgRet ProcessMessage(const CNode& peer, std::string_view msg_type, CDataStream& vRecv) EXCLUSIVE_LOCKS_REQUIRED(!cs_vecqueue);
261-
PeerMsgRet ProcessDSQueue(const CNode& peer, CDataStream& vRecv);
253+
PeerMsgRet ProcessMessage(const CNode& peer, CConnman& connman, PeerManager& peerman, std::string_view msg_type,
254+
CDataStream& vRecv) EXCLUSIVE_LOCKS_REQUIRED(!cs_vecqueue);
255+
PeerMsgRet ProcessDSQueue(const CNode& peer, CConnman& connman, PeerManager& peerman, CDataStream& vRecv);
262256
void DoMaintenance();
263257
};
264258

src/coinjoin/context.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ CJContext::CJContext(ChainstateManager& chainman, CConnman& connman, CDeterminis
1515
std::unique_ptr<PeerManager>& peerman, bool relay_txes) :
1616
dstxman{std::make_unique<CDSTXManager>()},
1717
#ifdef ENABLE_WALLET
18-
walletman{std::make_unique<CoinJoinWalletManager>(chainman, connman, dmnman, mn_metaman, mempool, mn_sync, queueman,
19-
/* is_masternode = */ mn_activeman != nullptr)},
20-
queueman{relay_txes
21-
? std::make_unique<CCoinJoinClientQueueManager>(connman, peerman, *walletman, dmnman, mn_metaman,
22-
mn_sync, /* is_masternode = */ mn_activeman != nullptr)
23-
: nullptr},
18+
walletman{std::make_unique<CoinJoinWalletManager>(chainman, dmnman, mn_metaman, mempool, mn_sync, queueman,
19+
/*is_masternode=*/mn_activeman != nullptr)},
20+
queueman{relay_txes ? std::make_unique<CCoinJoinClientQueueManager>(*walletman, dmnman, mn_metaman, mn_sync,
21+
/*is_masternode=*/mn_activeman != nullptr)
22+
: nullptr},
2423
#endif // ENABLE_WALLET
2524
server{std::make_unique<CCoinJoinServer>(chainman, connman, dmnman, *dstxman, mn_metaman, mempool, mn_activeman,
2625
mn_sync, peerman)}

src/dsnotificationinterface.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ void CDSNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindexNew, con
9393
m_llmq_ctx->isman->UpdatedBlockTip(pindexNew);
9494
m_llmq_ctx->clhandler->UpdatedBlockTip();
9595

96-
m_llmq_ctx->qman->UpdatedBlockTip(pindexNew, fInitialDownload);
96+
m_llmq_ctx->qman->UpdatedBlockTip(pindexNew, m_connman, fInitialDownload);
9797
m_llmq_ctx->qdkgsman->UpdatedBlockTip(pindexNew, fInitialDownload);
9898
m_llmq_ctx->ehfSignalsHandler->UpdatedBlockTip(pindexNew, /* is_masternode = */ m_mn_activeman != nullptr);
9999

@@ -107,7 +107,7 @@ void CDSNotificationInterface::TransactionAddedToMempool(const CTransactionRef&
107107
{
108108
assert(m_cj_ctx && m_llmq_ctx);
109109

110-
m_llmq_ctx->isman->TransactionAddedToMempool(ptx);
110+
m_llmq_ctx->isman->TransactionAddedToMempool(m_peerman, ptx);
111111
m_llmq_ctx->clhandler->TransactionAddedToMempool(ptx, nAcceptTime);
112112
m_cj_ctx->dstxman->TransactionAddedToMempool(ptx);
113113
}

src/evo/deterministicmns.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class CBlock;
3030
class CBlockIndex;
3131
class CChainState;
3232
class CCoinsViewCache;
33-
class CConnman;
3433
class CEvoDB;
3534
class TxValidationState;
3635

@@ -583,7 +582,6 @@ class CDeterministicMNManager
583582
std::atomic<int> to_cleanup {0};
584583

585584
CChainState& m_chainstate;
586-
CConnman& connman;
587585
CEvoDB& m_evoDb;
588586

589587
std::unordered_map<uint256, CDeterministicMNList, StaticSaltedHasher> mnListsCache GUARDED_BY(cs);
@@ -592,8 +590,11 @@ class CDeterministicMNManager
592590
const CBlockIndex* m_initial_snapshot_index GUARDED_BY(cs) {nullptr};
593591

594592
public:
595-
explicit CDeterministicMNManager(CChainState& chainstate, CConnman& _connman, CEvoDB& evoDb) :
596-
m_chainstate(chainstate), connman(_connman), m_evoDb(evoDb) {}
593+
explicit CDeterministicMNManager(CChainState& chainstate, CEvoDB& evoDb) :
594+
m_chainstate(chainstate),
595+
m_evoDb(evoDb)
596+
{
597+
}
597598
~CDeterministicMNManager() = default;
598599

599600
bool ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state,

src/init.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -1893,7 +1893,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
18931893

18941894
// Same logic as above with pblocktree
18951895
node.dmnman.reset();
1896-
node.dmnman = std::make_unique<CDeterministicMNManager>(chainman.ActiveChainstate(), *node.connman, *node.evodb);
1896+
node.dmnman = std::make_unique<CDeterministicMNManager>(chainman.ActiveChainstate(), *node.evodb);
18971897
node.mempool->ConnectManagers(node.dmnman.get());
18981898

18991899
node.cpoolman.reset();
@@ -1907,12 +1907,10 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
19071907
node.llmq_ctx->Stop();
19081908
}
19091909
node.llmq_ctx.reset();
1910-
node.llmq_ctx = std::make_unique<LLMQContext>(chainman, *node.connman, *node.dmnman, *node.evodb, *node.mn_metaman, *node.mnhf_manager, *node.sporkman,
1911-
*node.mempool, node.mn_activeman.get(), *node.mn_sync, node.peerman, /* unit_tests = */ false, /* wipe = */ fReset || fReindexChainState);
1910+
node.llmq_ctx = std::make_unique<LLMQContext>(chainman, *node.dmnman, *node.evodb, *node.mn_metaman, *node.mnhf_manager, *node.sporkman,
1911+
*node.mempool, node.mn_activeman.get(), *node.mn_sync, /*unit_tests=*/false, /*wipe=*/fReset || fReindexChainState);
19121912
// Enable CMNHFManager::{Process, Undo}Block
19131913
node.mnhf_manager->ConnectManagers(node.chainman.get(), node.llmq_ctx->qman.get());
1914-
// Have to start it early to let VerifyDB check ChainLock signatures in coinbase
1915-
node.llmq_ctx->Start();
19161914

19171915
node.chain_helper.reset();
19181916
node.chain_helper = std::make_unique<CChainstateHelper>(*node.cpoolman, *node.dmnman, *node.mnhf_manager, *node.govman, *(node.llmq_ctx->quorum_block_processor), *node.chainman,
@@ -2287,6 +2285,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
22872285

22882286
// ********************************************************* Step 10a: schedule Dash-specific tasks
22892287

2288+
node.llmq_ctx->Start(*node.connman, *node.peerman);
2289+
22902290
node.scheduler->scheduleEvery(std::bind(&CNetFulfilledRequestManager::DoMaintenance, std::ref(*node.netfulfilledman)), std::chrono::minutes{1});
22912291
node.scheduler->scheduleEvery(std::bind(&CMasternodeSync::DoMaintenance, std::ref(*node.mn_sync), std::cref(*node.peerman), std::cref(*node.govman)), std::chrono::seconds{1});
22922292
node.scheduler->scheduleEvery(std::bind(&CMasternodeUtils::DoMaintenance, std::ref(*node.connman), std::ref(*node.dmnman), std::ref(*node.mn_sync), std::ref(*node.cj_ctx)), std::chrono::minutes{1});
@@ -2302,7 +2302,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
23022302
#ifdef ENABLE_WALLET
23032303
} else if (!ignores_incoming_txs) {
23042304
node.scheduler->scheduleEvery(std::bind(&CCoinJoinClientQueueManager::DoMaintenance, std::ref(*node.cj_ctx->queueman)), std::chrono::seconds{1});
2305-
node.scheduler->scheduleEvery(std::bind(&CoinJoinWalletManager::DoMaintenance, std::ref(*node.cj_ctx->walletman)), std::chrono::seconds{1});
2305+
node.scheduler->scheduleEvery(std::bind(&CoinJoinWalletManager::DoMaintenance, std::ref(*node.cj_ctx->walletman), std::ref(*node.connman)), std::chrono::seconds{1});
23062306
#endif // ENABLE_WALLET
23072307
}
23082308

src/llmq/context.cpp

+23-22
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,22 @@
1818
#include <llmq/signing.h>
1919
#include <llmq/signing_shares.h>
2020

21-
LLMQContext::LLMQContext(ChainstateManager& chainman, CConnman& connman, CDeterministicMNManager& dmnman,
22-
CEvoDB& evo_db, CMasternodeMetaMan& mn_metaman, CMNHFManager& mnhfman, CSporkManager& sporkman,
21+
LLMQContext::LLMQContext(ChainstateManager& chainman, CDeterministicMNManager& dmnman, CEvoDB& evo_db,
22+
CMasternodeMetaMan& mn_metaman, CMNHFManager& mnhfman, CSporkManager& sporkman,
2323
CTxMemPool& mempool, const CActiveMasternodeManager* const mn_activeman,
24-
const CMasternodeSync& mn_sync, const std::unique_ptr<PeerManager>& peerman, bool unit_tests,
25-
bool wipe) :
24+
const CMasternodeSync& mn_sync, bool unit_tests, bool wipe) :
2625
is_masternode{mn_activeman != nullptr},
2726
bls_worker{std::make_shared<CBLSWorker>()},
2827
dkg_debugman{std::make_unique<llmq::CDKGDebugManager>()},
2928
quorum_block_processor{std::make_unique<llmq::CQuorumBlockProcessor>(chainman.ActiveChainstate(), dmnman, evo_db)},
30-
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(*bls_worker, chainman.ActiveChainstate(), connman, dmnman,
31-
*dkg_debugman, mn_metaman, *quorum_block_processor,
32-
mn_activeman, sporkman, peerman, unit_tests, wipe)},
33-
qman{std::make_unique<llmq::CQuorumManager>(*bls_worker, chainman.ActiveChainstate(), connman, dmnman, *qdkgsman,
34-
evo_db, *quorum_block_processor, mn_activeman, mn_sync, sporkman,
35-
unit_tests, wipe)},
36-
sigman{std::make_unique<llmq::CSigningManager>(mn_activeman, chainman.ActiveChainstate(), *qman, peerman,
37-
unit_tests, wipe)},
38-
shareman{std::make_unique<llmq::CSigSharesManager>(connman, *sigman, mn_activeman, *qman, sporkman, peerman)},
29+
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(*bls_worker, chainman.ActiveChainstate(), dmnman, *dkg_debugman,
30+
mn_metaman, *quorum_block_processor, mn_activeman, sporkman,
31+
unit_tests, wipe)},
32+
qman{std::make_unique<llmq::CQuorumManager>(*bls_worker, chainman.ActiveChainstate(), dmnman, *qdkgsman, evo_db,
33+
*quorum_block_processor, mn_activeman, mn_sync, sporkman, unit_tests,
34+
wipe)},
35+
sigman{std::make_unique<llmq::CSigningManager>(mn_activeman, chainman.ActiveChainstate(), *qman, unit_tests, wipe)},
36+
shareman{std::make_unique<llmq::CSigSharesManager>(*sigman, mn_activeman, *qman, sporkman)},
3937
clhandler{[&]() -> llmq::CChainLocksHandler* const {
4038
assert(llmq::chainLocksHandler == nullptr);
4139
llmq::chainLocksHandler = std::make_unique<llmq::CChainLocksHandler>(chainman.ActiveChainstate(), *qman,
@@ -48,15 +46,19 @@ LLMQContext::LLMQContext(ChainstateManager& chainman, CConnman& connman, CDeterm
4846
llmq::quorumInstantSendManager = std::make_unique<llmq::CInstantSendManager>(*llmq::chainLocksHandler,
4947
chainman.ActiveChainstate(), *qman,
5048
*sigman, *shareman, sporkman,
51-
mempool, mn_sync, peerman,
52-
is_masternode, unit_tests, wipe);
49+
mempool, mn_sync, is_masternode,
50+
unit_tests, wipe);
5351
return llmq::quorumInstantSendManager.get();
5452
}()},
5553
ehfSignalsHandler{std::make_unique<llmq::CEHFSignalsHandler>(chainman, mnhfman, *sigman, *shareman, *qman)}
5654
{
55+
// Have to start it early to let VerifyDB check ChainLock signatures in coinbase
56+
bls_worker->Start();
5757
}
5858

5959
LLMQContext::~LLMQContext() {
60+
bls_worker->Stop();
61+
6062
// LLMQContext doesn't own these objects, but still need to care of them for consistency:
6163
llmq::quorumInstantSendManager.reset();
6264
llmq::chainLocksHandler.reset();
@@ -70,21 +72,21 @@ void LLMQContext::Interrupt() {
7072
llmq::quorumInstantSendManager->InterruptWorkerThread();
7173
}
7274

73-
void LLMQContext::Start() {
75+
void LLMQContext::Start(CConnman& connman, PeerManager& peerman)
76+
{
7477
assert(clhandler == llmq::chainLocksHandler.get());
7578
assert(isman == llmq::quorumInstantSendManager.get());
7679

77-
bls_worker->Start();
7880
if (is_masternode) {
79-
qdkgsman->StartThreads();
81+
qdkgsman->StartThreads(connman, peerman);
8082
}
8183
qman->Start();
8284
shareman->RegisterAsRecoveredSigsListener();
83-
shareman->StartWorkerThread();
84-
sigman->StartWorkerThread();
85+
shareman->StartWorkerThread(connman, peerman);
86+
sigman->StartWorkerThread(peerman);
8587

8688
llmq::chainLocksHandler->Start();
87-
llmq::quorumInstantSendManager->Start();
89+
llmq::quorumInstantSendManager->Start(peerman);
8890
}
8991

9092
void LLMQContext::Stop() {
@@ -101,5 +103,4 @@ void LLMQContext::Stop() {
101103
if (is_masternode) {
102104
qdkgsman->StopThreads();
103105
}
104-
bls_worker->Stop();
105106
}

src/llmq/context.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ struct LLMQContext {
3939
public:
4040
LLMQContext() = delete;
4141
LLMQContext(const LLMQContext&) = delete;
42-
LLMQContext(ChainstateManager& chainman, CConnman& connman, CDeterministicMNManager& dmnman, CEvoDB& evo_db,
42+
LLMQContext(ChainstateManager& chainman, CDeterministicMNManager& dmnman, CEvoDB& evo_db,
4343
CMasternodeMetaMan& mn_metaman, CMNHFManager& mnhfman, CSporkManager& sporkman, CTxMemPool& mempool,
44-
const CActiveMasternodeManager* const mn_activeman, const CMasternodeSync& mn_sync,
45-
const std::unique_ptr<PeerManager>& peerman, bool unit_tests, bool wipe);
44+
const CActiveMasternodeManager* const mn_activeman, const CMasternodeSync& mn_sync, bool unit_tests,
45+
bool wipe);
4646
~LLMQContext();
4747

4848
void Interrupt();
49-
void Start();
49+
void Start(CConnman& connman, PeerManager& peerman);
5050
void Stop();
5151

5252
/** Guaranteed if LLMQContext is initialized then all members are valid too

0 commit comments

Comments
 (0)