Skip to content

Commit 533d8e2

Browse files
Merge dashpay#5871: refactor: alias Dash-specific globals to NodeContext, reduce globals use in GUI, interface, RPC and test logic
fb272dd refactor: use NodeContext members instead of globals in interface logic (Kittywhiskers Van Gogh) aba57ce qt: add interface for CGovernanceObject querying (Kittywhiskers Van Gogh) 8d73cec refactor: reduce globals use in RPC and bench, use LLMQContext members (Kittywhiskers Van Gogh) e8270ca refactor: use NodeContext members instead of globals in RPC logic (Kittywhiskers Van Gogh) 2efebca refactor: use aliases of globals in unit tests (Kittywhiskers Van Gogh) 89f41fa refactor: dereference CDeterministicMNManager instance before use (Kittywhiskers Van Gogh) d3dfdf3 refactor: use aliases of globals in initialization logic (Kittywhiskers Van Gogh) bb7fe58 refactor: rename creditPoolManager to cpoolman in NodeContext, fix order (Kittywhiskers Van Gogh) 6f08e10 refactor: remove extraneous creditPoolManager initialization (Kittywhiskers Van Gogh) d136c40 refactor: add aliases for Dash-specific global pointers in NodeContext (Kittywhiskers Van Gogh) Pull request description: ## Additional Notes * In some limited circumstances, we need to pass a reference to a smart pointer _before_ it is initialized. This is permissible if we know for sure that the pointer will be dereferenced _after_ it is initialized (usually, by `assert`'ing `!= nullptr`). This requires us to pass the const ref of the smart pointer object, to ensure that when dereferenced, we get access to the updated value that is set later on the initialization sequence. This means we cannot use the bare pointer alias as an argument as it would remain `nullptr` and will not be updated. Currently known examples are: * `CChainState` through `ChainstateManager::InitializeChainstate` * `llmq::CChainLocksHandler` (as `llmq::chainLocksHandler`) * `llmq::CInstantSendManager` (as `llmq::quorumInstantSendManager`) * `llmq::CQuorumBlockProcessor` (as `llmq::quorumBlockProcessor`) * `CDSNotificationInterface` * `CDeterministicMNManager` (as `deterministicMNManager`) * `CJContext` (as `NodeContext::cj_ctx`) * `LLMQContext` (as `NodeContext::llmq_ctx`) * We can verify the absence of globals in GUI, interface, RPC and test logic with the commands below (the above caveat applies) ```bash $ function make_filter() { echo "$1->|\*$1|::$1"; } $ PROHIBITED_TERMS="$(make_filter creditPoolManager)|$(make_filter deterministicMNManager)|$(make_filter dstxManager)|$(make_filter governance)|$(make_filter mmetaman)|$(make_filter netfulfilledman)|$(make_filter sporkManager)"; $ PROHIBITED_LLMQ_TERMS="$(make_filter quorumBlockProcessor)|$(make_filter quorumManager)|$(make_filter chainLocksHandler)|$(make_filter quorumInstantSendManager)"; $ grep -E "$PROHIBITED_TERMS|$PROHIBITED_LLMQ_TERMS" src/bench/*.{cpp,h} src/node/interfaces.cpp src/qt/*.{cpp,h} src/qt/test/*.{cpp,h} src/rpc/*.{cpp,h} src/test/*.{cpp,h} src/wallet/rpc*.{cpp,h}; src/test/validation_chainstate_tests.cpp: CChainState& c1 = WITH_LOCK(cs_main, return manager.InitializeChainstate(&mempool, *m_node.mnhf_manager, *m_node.evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor)); src/test/validation_chainstatemanager_tests.cpp: CChainState& c1 = WITH_LOCK(::cs_main, return manager.InitializeChainstate(&mempool, *m_node.mnhf_manager, evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor)); src/test/validation_chainstatemanager_tests.cpp: &mempool, *m_node.mnhf_manager, evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor, src/test/validation_chainstatemanager_tests.cpp: CChainState& c1 = WITH_LOCK(cs_main, return manager.InitializeChainstate(&mempool, *m_node.mnhf_manager, evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor)); src/test/validation_chainstatemanager_tests.cpp: CChainState& c2 = WITH_LOCK(cs_main, return manager.InitializeChainstate(&mempool, *m_node.mnhf_manager, evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor, GetRandHash())); src/test/validation_flush_tests.cpp: CChainState chainstate(&mempool, blockman, *m_node.mnhf_manager, *m_node.evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor); ``` * We can also check the usage of globals in (test) initialization logic (it will also include all the actual (de)initialization logic and any usage of the bare pointer alias if the name of the global and the alias are the same, as is the case with `netfulfilledman`) ```bash $ grep -E "$PROHIBITED_TERMS|$PROHIBITED_LLMQ_TERMS" src/init.cpp src/test/util/setup_common.cpp; src/init.cpp: ::netfulfilledman.reset(); src/init.cpp: ::mmetaman.reset(); src/init.cpp: ::dstxManager.reset(); src/init.cpp: ::sporkManager.reset(); src/init.cpp: ::governance.reset(); src/init.cpp: assert(!::governance); src/init.cpp: ::governance = std::make_unique<CGovernanceManager>(); src/init.cpp: node.govman = ::governance.get(); src/init.cpp: assert(!::sporkManager); src/init.cpp: ::sporkManager = std::make_unique<CSporkManager>(); src/init.cpp: node.sporkman = ::sporkManager.get(); src/init.cpp: *node.connman, *node.mn_sync, ::deterministicMNManager, *node.govman, node.llmq_ctx, node.cj_ctx src/init.cpp: chainman.InitializeChainstate(Assert(node.mempool.get()), *node.mnhf_manager, *node.evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor); src/init.cpp: assert(!::dstxManager); src/init.cpp: ::dstxManager = std::make_unique<CDSTXManager>(); src/init.cpp: node.dstxman = ::dstxManager.get(); src/init.cpp: assert(!::mmetaman); src/init.cpp: ::mmetaman = std::make_unique<CMasternodeMetaMan>(fLoadCacheFiles); src/init.cpp: node.mn_metaman = ::mmetaman.get(); src/init.cpp: assert(!::netfulfilledman); src/init.cpp: ::netfulfilledman = std::make_unique<CNetFulfilledRequestManager>(fLoadCacheFiles); src/init.cpp: node.netfulfilledman = ::netfulfilledman.get(); src/init.cpp: if (!node.netfulfilledman->IsValid()) { src/test/util/setup_common.cpp: ::deterministicMNManager = std::make_unique<CDeterministicMNManager>(chainstate, *node.connman, *node.evodb); src/test/util/setup_common.cpp: node.dmnman = ::deterministicMNManager.get(); src/test/util/setup_common.cpp: ::deterministicMNManager.reset(); src/test/util/setup_common.cpp: ::sporkManager = std::make_unique<CSporkManager>(); src/test/util/setup_common.cpp: m_node.sporkman = ::sporkManager.get(); src/test/util/setup_common.cpp: ::governance = std::make_unique<CGovernanceManager>(); src/test/util/setup_common.cpp: m_node.govman = ::governance.get(); src/test/util/setup_common.cpp: ::dstxManager = std::make_unique<CDSTXManager>(); src/test/util/setup_common.cpp: m_node.dstxman = ::dstxManager.get(); src/test/util/setup_common.cpp: ::mmetaman = std::make_unique<CMasternodeMetaMan>(/* load_cache */ false); src/test/util/setup_common.cpp: m_node.mn_metaman = ::mmetaman.get(); src/test/util/setup_common.cpp: ::netfulfilledman = std::make_unique<CNetFulfilledRequestManager>(/* load_cache */ false); src/test/util/setup_common.cpp: m_node.netfulfilledman = ::netfulfilledman.get(); src/test/util/setup_common.cpp: ::netfulfilledman.reset(); src/test/util/setup_common.cpp: ::mmetaman.reset(); src/test/util/setup_common.cpp: ::dstxManager.reset(); src/test/util/setup_common.cpp: ::governance.reset(); src/test/util/setup_common.cpp: ::sporkManager.reset(); src/test/util/setup_common.cpp: m_node.chainman->InitializeChainstate(m_node.mempool.get(), *m_node.mnhf_manager, *m_node.evodb, llmq::chainLocksHandler, llmq::quorumInstantSendManager, llmq::quorumBlockProcessor); ``` ## Breaking Changes None, changes are limited to refactoring and do not logically change behaviour. ## Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests - [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)_ Top commit has no ACKs. Tree-SHA512: f6d1a668728525e7cab7af200858a6ab6e20a24786d691630530a9019e8d2b4f474ed4358f40b76266b938dfe96420e0c64ee66a1a0986a3d3f254670162bb1c
2 parents d6b5590 + fb272dd commit 533d8e2

24 files changed

+429
-255
lines changed

src/bench/rpc_blockchain.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <consensus/validation.h>
99
#include <llmq/chainlocks.h>
10+
#include <llmq/context.h>
1011
#include <llmq/instantsend.h>
1112
#include <rpc/blockchain.h>
1213
#include <streams.h>
@@ -42,8 +43,9 @@ struct TestBlockAndIndex {
4243
static void BlockToJsonVerbose(benchmark::Bench& bench)
4344
{
4445
TestBlockAndIndex data;
46+
const LLMQContext& llmq_ctx = *data.test_setup.m_node.llmq_ctx;
4547
bench.run([&] {
46-
auto univalue = blockToJSON(data.block, &data.blockindex, &data.blockindex, *llmq::chainLocksHandler, *llmq::quorumInstantSendManager, /*verbose*/ true);
48+
auto univalue = blockToJSON(data.block, &data.blockindex, &data.blockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, /*verbose*/ true);
4749
ankerl::nanobench::doNotOptimizeAway(univalue);
4850
});
4951
}
@@ -53,7 +55,8 @@ BENCHMARK(BlockToJsonVerbose);
5355
static void BlockToJsonVerboseWrite(benchmark::Bench& bench)
5456
{
5557
TestBlockAndIndex data;
56-
auto univalue = blockToJSON(data.block, &data.blockindex, &data.blockindex, *llmq::chainLocksHandler, *llmq::quorumInstantSendManager, /*verbose*/ true);
58+
const LLMQContext& llmq_ctx = *data.test_setup.m_node.llmq_ctx;
59+
auto univalue = blockToJSON(data.block, &data.blockindex, &data.blockindex, *llmq_ctx.clhandler, *llmq_ctx.isman, /*verbose*/ true);
5760
bench.run([&] {
5861
auto str = univalue.write();
5962
ankerl::nanobench::doNotOptimizeAway(str);

src/governance/vote.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class CKey;
1616
class CKeyID;
1717

1818
// INTENTION OF MASTERNODES REGARDING ITEM
19-
enum vote_outcome_enum_t {
19+
enum vote_outcome_enum_t : uint8_t {
2020
VOTE_OUTCOME_NONE = 0,
2121
VOTE_OUTCOME_YES = 1,
2222
VOTE_OUTCOME_NO = 2,
@@ -25,7 +25,7 @@ enum vote_outcome_enum_t {
2525

2626

2727
// SIGNAL VARIOUS THINGS TO HAPPEN:
28-
enum vote_signal_enum_t {
28+
enum vote_signal_enum_t : uint8_t {
2929
VOTE_SIGNAL_NONE = 0,
3030
VOTE_SIGNAL_FUNDING = 1, // -- fund this object for it's stated amount
3131
VOTE_SIGNAL_VALID = 2, // -- this object checks out in sentinel engine

src/init.cpp

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -304,12 +304,18 @@ void PrepareShutdown(NodeContext& node)
304304

305305
// After all scheduled tasks have been flushed, destroy pointers
306306
// and reset all to nullptr.
307-
::governance.reset();
308-
::sporkManager.reset();
309-
::masternodeSync.reset();
307+
node.netfulfilledman = nullptr;
310308
::netfulfilledman.reset();
309+
node.mn_metaman = nullptr;
311310
::mmetaman.reset();
311+
node.dstxman = nullptr;
312312
::dstxManager.reset();
313+
node.mn_sync = nullptr;
314+
::masternodeSync.reset();
315+
node.sporkman = nullptr;
316+
::sporkManager.reset();
317+
node.govman = nullptr;
318+
::governance.reset();
313319

314320
// Stop and delete all indexes only after flushing background callbacks.
315321
if (g_txindex) {
@@ -342,9 +348,10 @@ void PrepareShutdown(NodeContext& node)
342348
node.llmq_ctx.reset();
343349
}
344350
llmq::quorumSnapshotManager.reset();
351+
node.dmnman = nullptr;
345352
deterministicMNManager.reset();
353+
node.cpoolman = nullptr;
346354
creditPoolManager.reset();
347-
node.creditPoolManager = nullptr;
348355
node.mnhf_manager.reset();
349356
node.evodb.reset();
350357
}
@@ -1705,15 +1712,17 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
17051712

17061713
assert(!::governance);
17071714
::governance = std::make_unique<CGovernanceManager>();
1715+
node.govman = ::governance.get();
17081716

17091717
assert(!node.peerman);
17101718
node.peerman = PeerManager::make(chainparams, *node.connman, *node.addrman, node.banman.get(),
1711-
*node.scheduler, chainman, *node.mempool, *::governance,
1719+
*node.scheduler, chainman, *node.mempool, *node.govman,
17121720
node.cj_ctx, node.llmq_ctx, ignores_incoming_txs);
17131721
RegisterValidationInterface(node.peerman.get());
17141722

17151723
assert(!::sporkManager);
17161724
::sporkManager = std::make_unique<CSporkManager>();
1725+
node.sporkman = ::sporkManager.get();
17171726

17181727
std::vector<std::string> vSporkAddresses;
17191728
if (args.IsArgSet("-sporkaddr")) {
@@ -1722,24 +1731,26 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
17221731
vSporkAddresses = Params().SporkAddresses();
17231732
}
17241733
for (const auto& address: vSporkAddresses) {
1725-
if (!::sporkManager->SetSporkAddress(address)) {
1734+
if (!node.sporkman->SetSporkAddress(address)) {
17261735
return InitError(_("Invalid spork address specified with -sporkaddr"));
17271736
}
17281737
}
17291738

17301739
int minsporkkeys = args.GetArg("-minsporkkeys", Params().MinSporkKeys());
1731-
if (!::sporkManager->SetMinSporkKeys(minsporkkeys)) {
1740+
if (!node.sporkman->SetMinSporkKeys(minsporkkeys)) {
17321741
return InitError(_("Invalid minimum number of spork signers specified with -minsporkkeys"));
17331742
}
17341743

17351744

17361745
if (args.IsArgSet("-sporkkey")) { // spork priv key
1737-
if (!::sporkManager->SetPrivKey(args.GetArg("-sporkkey", ""))) {
1746+
if (!node.sporkman->SetPrivKey(args.GetArg("-sporkkey", ""))) {
17381747
return InitError(_("Unable to sign spork message, wrong key?"));
17391748
}
17401749
}
17411750

1742-
::masternodeSync = std::make_unique<CMasternodeSync>(*node.connman, *::governance);
1751+
assert(!::masternodeSync);
1752+
::masternodeSync = std::make_unique<CMasternodeSync>(*node.connman, *node.govman);
1753+
node.mn_sync = ::masternodeSync.get();
17431754

17441755
// sanitize comments per BIP-0014, format user agent and check total size
17451756
std::vector<std::string> uacomments;
@@ -1861,10 +1872,8 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
18611872
}
18621873
#endif
18631874

1864-
assert(::governance != nullptr);
1865-
assert(::masternodeSync != nullptr);
18661875
pdsNotificationInterface = new CDSNotificationInterface(
1867-
*node.connman, *::masternodeSync, ::deterministicMNManager, *::governance, node.llmq_ctx, node.cj_ctx
1876+
*node.connman, *node.mn_sync, ::deterministicMNManager, *node.govman, node.llmq_ctx, node.cj_ctx
18681877
);
18691878
RegisterValidationInterface(pdsNotificationInterface);
18701879

@@ -1876,7 +1885,7 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
18761885

18771886
// ********************************************************* Step 7a: Load sporks
18781887

1879-
if (!::sporkManager->LoadCache()) {
1888+
if (!node.sporkman->LoadCache()) {
18801889
auto file_path = (GetDataDir() / "sporks.dat").string();
18811890
return InitError(strprintf(_("Failed to load sporks cache from %s"), file_path));
18821891
}
@@ -1956,10 +1965,11 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
19561965

19571966
// Same logic as above with pblocktree
19581967
deterministicMNManager.reset();
1959-
deterministicMNManager.reset(new CDeterministicMNManager(chainman.ActiveChainstate(), *node.connman, *node.evodb));
1968+
deterministicMNManager = std::make_unique<CDeterministicMNManager>(chainman.ActiveChainstate(), *node.connman, *node.evodb);
1969+
node.dmnman = deterministicMNManager.get();
19601970
creditPoolManager.reset();
19611971
creditPoolManager = std::make_unique<CCreditPoolManager>(*node.evodb);
1962-
node.creditPoolManager = creditPoolManager.get();
1972+
node.cpoolman = creditPoolManager.get();
19631973
llmq::quorumSnapshotManager.reset();
19641974
llmq::quorumSnapshotManager.reset(new llmq::CQuorumSnapshotManager(*node.evodb));
19651975

@@ -1968,7 +1978,7 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
19681978
node.llmq_ctx->Stop();
19691979
}
19701980
node.llmq_ctx.reset();
1971-
node.llmq_ctx.reset(new LLMQContext(chainman.ActiveChainstate(), *node.connman, *node.evodb, *::sporkManager, *node.mempool, node.peerman, false, fReset || fReindexChainState));
1981+
node.llmq_ctx.reset(new LLMQContext(chainman.ActiveChainstate(), *node.connman, *node.evodb, *node.sporkman, *node.mempool, node.peerman, false, fReset || fReindexChainState));
19721982
// Have to start it early to let VerifyDB check ChainLock signatures in coinbase
19731983
node.llmq_ctx->Start();
19741984

@@ -2101,11 +2111,11 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
21012111
break; // out of the chainstate activation do-while
21022112
}
21032113

2104-
if (!deterministicMNManager->MigrateDBIfNeeded()) {
2114+
if (!node.dmnman->MigrateDBIfNeeded()) {
21052115
strLoadError = _("Error upgrading evo database");
21062116
break;
21072117
}
2108-
if (!deterministicMNManager->MigrateDBIfNeeded2()) {
2118+
if (!node.dmnman->MigrateDBIfNeeded2()) {
21092119
strLoadError = _("Error upgrading evo database");
21102120
break;
21112121
}
@@ -2209,7 +2219,7 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
22092219

22102220
// ********************************************************* Step 7c: Setup CoinJoin
22112221

2212-
node.cj_ctx = std::make_unique<CJContext>(chainman.ActiveChainstate(), *node.connman, *node.mempool, *::masternodeSync, !ignores_incoming_txs);
2222+
node.cj_ctx = std::make_unique<CJContext>(chainman.ActiveChainstate(), *node.connman, *node.mempool, *node.mn_sync, !ignores_incoming_txs);
22132223

22142224
#ifdef ENABLE_WALLET
22152225
node.coinjoin_loader = interfaces::MakeCoinJoinLoader(*node.cj_ctx->walletman);
@@ -2221,7 +2231,7 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
22212231
bool fLoadCacheFiles = !(fReindex || fReindexChainState) && (::ChainActive().Tip() != nullptr);
22222232

22232233
if (!fDisableGovernance) {
2224-
if (!::governance->LoadCache(fLoadCacheFiles)) {
2234+
if (!node.govman->LoadCache(fLoadCacheFiles)) {
22252235
auto file_path = (GetDataDir() / "governance.dat").string();
22262236
if (fLoadCacheFiles && !fDisableGovernance) {
22272237
return InitError(strprintf(_("Failed to load governance cache from %s"), file_path));
@@ -2232,10 +2242,12 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
22322242

22332243
assert(!::dstxManager);
22342244
::dstxManager = std::make_unique<CDSTXManager>();
2245+
node.dstxman = ::dstxManager.get();
22352246

22362247
assert(!::mmetaman);
22372248
::mmetaman = std::make_unique<CMasternodeMetaMan>(fLoadCacheFiles);
2238-
if (!::mmetaman->IsValid()) {
2249+
node.mn_metaman = ::mmetaman.get();
2250+
if (!node.mn_metaman->IsValid()) {
22392251
auto file_path = (GetDataDir() / "mncache.dat").string();
22402252
if (fLoadCacheFiles) {
22412253
return InitError(strprintf(_("Failed to load masternode cache from %s"), file_path));
@@ -2245,7 +2257,8 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
22452257

22462258
assert(!::netfulfilledman);
22472259
::netfulfilledman = std::make_unique<CNetFulfilledRequestManager>(fLoadCacheFiles);
2248-
if (!::netfulfilledman->IsValid()) {
2260+
node.netfulfilledman = ::netfulfilledman.get();
2261+
if (!node.netfulfilledman->IsValid()) {
22492262
auto file_path = (GetDataDir() / "netfulfilled.dat").string();
22502263
if (fLoadCacheFiles) {
22512264
return InitError(strprintf(_("Failed to load fulfilled requests cache from %s"), file_path));
@@ -2316,13 +2329,13 @@ bool AppInitMain(const CoreContext& context, NodeContext& node, interfaces::Bloc
23162329

23172330
// ********************************************************* Step 10a: schedule Dash-specific tasks
23182331

2319-
node.scheduler->scheduleEvery(std::bind(&CNetFulfilledRequestManager::DoMaintenance, std::ref(*netfulfilledman)), std::chrono::minutes{1});
2320-
node.scheduler->scheduleEvery(std::bind(&CMasternodeSync::DoMaintenance, std::ref(*::masternodeSync)), std::chrono::seconds{1});
2321-
node.scheduler->scheduleEvery(std::bind(&CMasternodeUtils::DoMaintenance, std::ref(*node.connman), std::ref(*::masternodeSync), std::ref(*node.cj_ctx)), std::chrono::minutes{1});
2322-
node.scheduler->scheduleEvery(std::bind(&CDeterministicMNManager::DoMaintenance, std::ref(*deterministicMNManager)), std::chrono::seconds{10});
2332+
node.scheduler->scheduleEvery(std::bind(&CNetFulfilledRequestManager::DoMaintenance, std::ref(*node.netfulfilledman)), std::chrono::minutes{1});
2333+
node.scheduler->scheduleEvery(std::bind(&CMasternodeSync::DoMaintenance, std::ref(*node.mn_sync)), std::chrono::seconds{1});
2334+
node.scheduler->scheduleEvery(std::bind(&CMasternodeUtils::DoMaintenance, std::ref(*node.connman), std::ref(*node.mn_sync), std::ref(*node.cj_ctx)), std::chrono::minutes{1});
2335+
node.scheduler->scheduleEvery(std::bind(&CDeterministicMNManager::DoMaintenance, std::ref(*node.dmnman)), std::chrono::seconds{10});
23232336

23242337
if (!fDisableGovernance) {
2325-
node.scheduler->scheduleEvery(std::bind(&CGovernanceManager::DoMaintenance, std::ref(*::governance), std::ref(*node.connman)), std::chrono::minutes{5});
2338+
node.scheduler->scheduleEvery(std::bind(&CGovernanceManager::DoMaintenance, std::ref(*node.govman), std::ref(*node.connman)), std::chrono::minutes{5});
23262339
}
23272340

23282341
if (fMasternodeMode) {

src/interfaces/node.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ enum class SynchronizationState;
3737
struct CNodeStateStats;
3838
struct NodeContext;
3939

40+
enum vote_signal_enum_t : uint8_t;
41+
4042
namespace interfaces {
4143
class Handler;
4244
class WalletLoader;
@@ -51,6 +53,7 @@ class EVO
5153
public:
5254
virtual ~EVO() {}
5355
virtual std::pair<CDeterministicMNList, const CBlockIndex*> getListAtChainTip() = 0;
56+
virtual void setContext(NodeContext* context) {}
5457
};
5558

5659
//! Interface for the src/governance part of a dash node (dashd process).
@@ -59,6 +62,9 @@ class GOV
5962
public:
6063
virtual ~GOV() {}
6164
virtual void getAllNewerThan(std::vector<CGovernanceObject> &objs, int64_t nMoreThanTime) = 0;
65+
virtual int32_t getObjAbsYesCount(const CGovernanceObject& obj, vote_signal_enum_t vote_signal) = 0;
66+
virtual bool getObjLocalValidity(const CGovernanceObject& obj, std::string& error, bool check_collateral) = 0;
67+
virtual void setContext(NodeContext* context) {}
6268
};
6369

6470
//! Interface for the src/llmq part of a dash node (dashd process).
@@ -67,6 +73,7 @@ class LLMQ
6773
public:
6874
virtual ~LLMQ() {}
6975
virtual size_t getInstantSentLockCount() = 0;
76+
virtual void setContext(NodeContext* context) {}
7077
};
7178

7279
//! Interface for the src/masternode part of a dash node (dashd process).
@@ -79,6 +86,7 @@ class Sync
7986
virtual bool isBlockchainSynced() = 0;
8087
virtual bool isSynced() = 0;
8188
virtual std::string getSyncStatus() = 0;
89+
virtual void setContext(NodeContext* context) {}
8290
};
8391
}
8492

src/node/context.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,16 @@ class CAddrMan;
1616
class CBlockPolicyEstimator;
1717
class CConnman;
1818
class CCreditPoolManager;
19+
class CDeterministicMNManager;
1920
class ChainstateManager;
21+
class CDSTXManager;
2022
class CEvoDB;
23+
class CGovernanceManager;
24+
class CMasternodeMetaMan;
25+
class CMasternodeSync;
26+
class CNetFulfilledRequestManager;
2127
class CScheduler;
28+
class CSporkManager;
2229
class CTxMemPool;
2330
class CMNHFManager;
2431
class PeerManager;
@@ -63,12 +70,18 @@ struct NodeContext {
6370
std::unique_ptr<CScheduler> scheduler;
6471
std::function<void()> rpc_interruption_point = [] {};
6572
//! Dash
66-
std::unique_ptr<LLMQContext> llmq_ctx;
67-
CCreditPoolManager* creditPoolManager;
68-
std::unique_ptr<CMNHFManager> mnhf_manager;
69-
std::unique_ptr<CJContext> cj_ctx;
70-
7173
std::unique_ptr<CEvoDB> evodb;
74+
std::unique_ptr<CJContext> cj_ctx;
75+
std::unique_ptr<CMNHFManager> mnhf_manager;
76+
std::unique_ptr<LLMQContext> llmq_ctx;
77+
CCreditPoolManager* cpoolman{nullptr};
78+
CDeterministicMNManager* dmnman{nullptr};
79+
CDSTXManager* dstxman{nullptr};
80+
CGovernanceManager* govman{nullptr};
81+
CMasternodeMetaMan* mn_metaman{nullptr};
82+
CMasternodeSync* mn_sync{nullptr};
83+
CNetFulfilledRequestManager* netfulfilledman{nullptr};
84+
CSporkManager* sporkman{nullptr};
7285

7386
//! Declare default constructor and destructor that are not inline, so code
7487
//! instantiating the NodeContext struct doesn't need to #include class

0 commit comments

Comments
 (0)