Skip to content
8 changes: 4 additions & 4 deletions src/active/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ ActiveContext::ActiveContext(CBLSWorker& bls_worker, ChainstateManager& chainman
m_isman{isman},
m_qman{qman},
nodeman{std::make_unique<CActiveMasternodeManager>(connman, dmnman, operator_sk)},
dkgdbgman{std::make_unique<llmq::CDKGDebugManager>()},
dkgdbgman{std::make_unique<llmq::CDKGDebugManager>(dmnman, qsnapman, chainman)},
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(dmnman, qsnapman, chainman, sporkman, db_params, quorums_watch)},
shareman{std::make_unique<llmq::CSigSharesManager>(connman, chainman.ActiveChainstate(), sigman, peerman, *nodeman,
qman, sporkman)},
Expand Down Expand Up @@ -72,11 +72,11 @@ void ActiveContext::Interrupt()
shareman->InterruptWorkerThread();
}

void ActiveContext::Start(CConnman& connman, PeerManager& peerman)
void ActiveContext::Start(CConnman& connman, PeerManager& peerman, int8_t worker_count)
{
qman_handler->Start();
qman_handler->Start(worker_count);
qdkgsman->StartThreads(connman, peerman);
shareman->Start();
shareman->Start(worker_count);
cl_signer->RegisterRecoveryInterface();
is_signer->RegisterRecoveryInterface();
shareman->RegisterRecoveryInterface();
Expand Down
2 changes: 1 addition & 1 deletion src/active/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ struct ActiveContext final : public CValidationInterface {
~ActiveContext();

void Interrupt();
void Start(CConnman& connman, PeerManager& peerman);
void Start(CConnman& connman, PeerManager& peerman, int8_t worker_count);
void Stop();

CCoinJoinServer& GetCJServer() const;
Expand Down
8 changes: 4 additions & 4 deletions src/active/dkgsession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ ActiveDKGSession::~ActiveDKGSession() = default;

void ActiveDKGSession::Contribute(CDKGPendingMessages& pendingMessages, PeerManager& peerman)
{
CDKGLogger logger(*this, __func__, __LINE__);

if (!AreWeMember()) {
return;
}

assert(params.threshold > 1); // we should not get there with single-node-quorums

CDKGLogger logger(*this, __func__, __LINE__);

cxxtimer::Timer t1(true);
logger.Batch("generating contributions");
if (!blsWorker.GenerateContributions(params.threshold, memberIds, vvecContribution, m_sk_contributions)) {
Expand Down Expand Up @@ -304,7 +304,7 @@ void ActiveDKGSession::VerifyAndJustify(CDKGPendingMessages& pendingMessages, Pe

CDKGLogger logger(*this, __func__, __LINE__);

std::set<uint256> justifyFor;
Uint256HashSet justifyFor;

for (const auto& m : members) {
if (m->bad) {
Expand Down Expand Up @@ -338,7 +338,7 @@ void ActiveDKGSession::VerifyAndJustify(CDKGPendingMessages& pendingMessages, Pe
}

void ActiveDKGSession::SendJustification(CDKGPendingMessages& pendingMessages, PeerManager& peerman,
const std::set<uint256>& forMembers)
const Uint256HashSet& forMembers)
{
CDKGLogger logger(*this, __func__, __LINE__);

Expand Down
2 changes: 1 addition & 1 deletion src/active/dkgsession.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class ActiveDKGSession final : public llmq::CDKGSession
void VerifyAndJustify(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override
EXCLUSIVE_LOCKS_REQUIRED(!invCs);
void SendJustification(CDKGPendingMessages& pendingMessages, PeerManager& peerman,
const std::set<uint256>& forMembers) override;
const Uint256HashSet& forMembers) override;

// Phase 4: commit
void VerifyAndCommit(CDKGPendingMessages& pendingMessages, PeerManager& peerman) override;
Expand Down
6 changes: 3 additions & 3 deletions src/active/dkgsessionhandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -251,19 +251,19 @@ void ActiveDKGSessionHandler::HandlePhase(QuorumPhase curPhase, QuorumPhase next

// returns a set of NodeIds which sent invalid messages
template<typename Message>
std::set<NodeId> BatchVerifyMessageSigs(CDKGSession& session, const std::vector<std::pair<NodeId, std::shared_ptr<Message>>>& messages)
std::unordered_set<NodeId> BatchVerifyMessageSigs(CDKGSession& session, const std::vector<std::pair<NodeId, std::shared_ptr<Message>>>& messages)
{
if (messages.empty()) {
return {};
}

std::set<NodeId> ret;
std::unordered_set<NodeId> ret;
bool revertToSingleVerification = false;

CBLSSignature aggSig;
std::vector<CBLSPublicKey> pubKeys;
std::vector<uint256> messageHashes;
std::set<uint256> messageHashesSet;
Uint256HashSet messageHashesSet;
pubKeys.reserve(messages.size());
messageHashes.reserve(messages.size());
bool first = true;
Expand Down
5 changes: 4 additions & 1 deletion src/bench/bls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <bench/bench.h>

#include <bls/bls_worker.h>
#include <llmq/options.h>

#include <random.h>
#include <util/time.h>

Expand Down Expand Up @@ -321,7 +324,7 @@ static void BLS_Verify_BatchedParallel(benchmark::Bench& bench)
};

CBLSWorker blsWorker;
blsWorker.Start();
blsWorker.Start(llmq::DEFAULT_WORKER_COUNT);

// Benchmark.
bench.minEpochIterations(bench.output() ? 1000 : 1).run([&] {
Expand Down
9 changes: 6 additions & 3 deletions src/bench/bls_dkg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <bench/bench.h>

#include <bls/bls_worker.h>
#include <random.h>
#include <llmq/options.h>
#include <util/irange.h>

#include <random.h>
Comment on lines +6 to +11
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why moved random.h? there's nothing SPECIAL in this header to be in its own group; use alphabetic order as all other. This file is not backported also, so, no need to care about possible conflicts


struct Member {
CBLSId id;

Expand Down Expand Up @@ -67,7 +70,7 @@ class DKG
ids.emplace_back(id);
}

blsWorker.Start();
blsWorker.Start(llmq::DEFAULT_WORKER_COUNT);
for (auto& member : members) {
blsWorker.GenerateContributions(quorumSize / 2 + 1, ids, member.vvec, member.skShares);
}
Expand Down Expand Up @@ -110,7 +113,7 @@ class DKG
static void BLSDKG_GenerateContributions(benchmark::Bench& bench, uint32_t epoch_iters, int quorumSize)
{
CBLSWorker blsWorker;
blsWorker.Start();
blsWorker.Start(llmq::DEFAULT_WORKER_COUNT);
std::vector<CBLSId> ids;
std::vector<Member> members;
if (!bench.output()) {
Expand Down
6 changes: 2 additions & 4 deletions src/bls/bls_worker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,9 @@ CBLSWorker::~CBLSWorker()
Stop();
}

void CBLSWorker::Start()
void CBLSWorker::Start(int8_t worker_count)
{
int workerCount = std::thread::hardware_concurrency() / 2;
workerCount = std::clamp(workerCount, 1, 4);
workerPool.resize(workerCount);
workerPool.resize(worker_count);
RenameThreadPool(workerPool, "bls-work");
}

Expand Down
2 changes: 1 addition & 1 deletion src/bls/bls_worker.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class CBLSWorker
CBLSWorker();
~CBLSWorker();

void Start();
void Start(int8_t worker_count);
void Stop();
Comment on lines +57 to 58
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# 1) Find all CBLSWorker::Start call sites
echo "=== Searching for CBLSWorker::Start() call sites ==="
rg -n --type=cpp --type=cc --type=h --type=hpp 'Start\s*\(' src/bls src/llmq 2>/dev/null | grep -i worker | head -30

echo -e "\n=== Searching for CBLSWorker in header files ==="
rg -n --type=h --type=hpp 'class CBLSWorker' src

echo -e "\n=== Searching for DEFAULT_WORKER_COUNT ==="
rg -n --type=cpp --type=cc --type=h --type=hpp 'DEFAULT_WORKER_COUNT' src

Repository: dashpay/dash

Length of output: 274


🏁 Script executed:

#!/bin/bash
# 2) Look at the actual implementation of Start() in bls_worker.cpp
echo "=== Finding bls_worker.cpp ==="
find src -name "bls_worker.cpp" -type f

echo -e "\n=== Checking if file exists and reading it ==="
if [ -f "src/bls/bls_worker.cpp" ]; then
  echo "File found. Reading Start() implementation:"
  rg -n -A 10 'void CBLSWorker::Start' src/bls/bls_worker.cpp
fi

Repository: dashpay/dash

Length of output: 451


🏁 Script executed:

#!/bin/bash
# 3) Check for any validation or constraints on worker_count parameter
echo "=== Searching for worker_count usage and constraints ==="
rg -n --type=cpp --type=h 'worker_count' src/bls src/llmq | head -40

Repository: dashpay/dash

Length of output: 1111


🏁 Script executed:

#!/bin/bash
# Fix the file type issue and search more broadly
echo "=== Searching for worker_count initialization ==="
rg -n 'worker_count\s*=' src --type c | head -30

echo -e "\n=== Searching for params initialization in context.cpp ==="
rg -n -B 5 'bls_worker->Start' src/bls/context.cpp

echo -e "\n=== Looking for LLMQParams or similar definition ==="
rg -n 'struct.*Params.*{' src/llmq | head -10

Repository: dashpay/dash

Length of output: 394


🏁 Script executed:

#!/bin/bash
# Check what params is and where worker_count comes from
echo "=== Examining src/bls/context.cpp around Start() call ==="
cat -n src/bls/context.cpp | head -50

echo -e "\n=== Checking llmq/options.h for LLMQParams ==="
cat -n src/llmq/options.h | grep -A 10 -B 10 'worker_count'

Repository: dashpay/dash

Length of output: 1009


🏁 Script executed:

#!/bin/bash
# Search for validation of worker_count anywhere
echo "=== Searching for any validation of worker_count ==="
rg -n 'worker_count.*>' src --type c
rg -n 'assert.*worker_count' src --type c
rg -n 'if.*worker_count' src --type c | head -20

Repository: dashpay/dash

Length of output: 108


🏁 Script executed:

#!/bin/bash
echo "=== Searching for DashParams initialization ==="
rg -n 'DashParams' src --type c | head -30

echo -e "\n=== Examining src/llmq/context.cpp ==="
cat -n src/llmq/context.cpp | head -60

Repository: dashpay/dash

Length of output: 2950


🏁 Script executed:

#!/bin/bash
echo "=== Searching for where worker_count/bls_threads are set ==="
rg -n 'bls_threads|worker_count' src --type c | grep -E '(=|DEFAULT|gArgs)' | head -30

echo -e "\n=== Searching for gArgs or parameter parsing related to bls/worker ==="
rg -n -i 'bls.thread|worker.count|llmq.*thread' src --type c | head -30

Repository: dashpay/dash

Length of output: 921


🏁 Script executed:

#!/bin/bash
echo "=== Looking for where DashParams gets populated ==="
rg -n 'bls_threads\s*=' src --type c -A 2 -B 2
rg -n 'worker_count\s*=' src --type c -A 2 -B 2

Repository: dashpay/dash

Length of output: 107


🏁 Script executed:

#!/bin/bash
echo "=== Searching for where DashParams is constructed ==="
rg -n 'DashParams\s*{' src --type c -A 3 | head -50

echo -e "\n=== Searching for any place where DashParams gets created ==="
rg -n 'llmq::DashParams' src --type c | head -30

Repository: dashpay/dash

Length of output: 632


🏁 Script executed:

#!/bin/bash
echo "=== Looking for parameter parsing or initialization related to worker_count ==="
rg -n -i 'worker|llmq' src --type c | grep -i -E 'parse|arg|init|create|param' | head -30

echo -e "\n=== Checking if there are command-line argument parsers ==="
find src -name "*args*" -o -name "*params*" | head -10

Repository: dashpay/dash

Length of output: 3380


🏁 Script executed:

#!/bin/bash
echo "=== Searching in chainstate or main initialization files ==="
find src -name "*.h" -o -name "*.cpp" | xargs grep -l 'DashParams' | head -10

Repository: dashpay/dash

Length of output: 265


🏁 Script executed:

#!/bin/bash
echo "=== Checking src/init.cpp for DashParams construction ==="
rg -n 'DashParams' src/init.cpp -A 5 -B 5

echo -e "\n=== Checking src/node/chainstate.cpp for DashParams ==="
rg -n 'DashParams' src/node/chainstate.cpp -A 5 -B 5

echo -e "\n=== Searching for llmq:: DashParams initialization ==="
rg -n -A 10 'llmq::DashParams' src --type c | head -60

Repository: dashpay/dash

Length of output: 5393


🏁 Script executed:

#!/bin/bash
echo "=== Looking for worker_count assignments or initialization ==="
rg -n 'worker_count' src/init.cpp src/node/chainstate.cpp -B 3 -A 3

echo -e "\n=== Checking test setup files ==="
cat src/test/util/setup_common.cpp | grep -n -A 10 -B 5 'DashParams\|worker_count' | head -50

Repository: dashpay/dash

Length of output: 3392


Add assertion to guard the int8_t to size_t conversion in workerPool.resize().

While worker_count is currently always positive (clamped to [1, 4]), the implicit int8_t to size_t conversion in resize() is a hazard if this parameter ever becomes user-configurable or dynamically set. Add an assertion to prevent negative values:

Proposed fix (in src/bls/bls_worker.cpp)
 void CBLSWorker::Start(int8_t worker_count)
 {
+    assert(worker_count > 0);
     workerPool.resize(worker_count);
     RenameThreadPool(workerPool, "bls-work");
 }
🤖 Prompt for AI Agents
In @src/bls/bls_worker.h around lines 57 - 58, Add a defensive assertion in
Start(int8_t worker_count) before calling workerPool.resize() to ensure
worker_count is non-negative (e.g., assert(worker_count >= 0)); then cast to
size_t only after the check when resizing the workerPool. Locate the Start
function in bls_worker.cpp (the caller of workerPool.resize) and add the
assertion and the safe cast so negative int8_t values cannot silently convert to
a huge size_t.


bool GenerateContributions(int threshold, Span<CBLSId> ids, BLSVerificationVectorPtr& vvecRet, std::vector<CBLSSecretKey>& skSharesRet);
Expand Down
36 changes: 21 additions & 15 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2005,7 +2005,6 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
node.mnhf_manager,
node.llmq_ctx,
Assert(node.mempool.get()),
args.GetDataDirNet(),
fPruneMode,
args.GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX),
args.GetBoolArg("-spentindex", DEFAULT_SPENTINDEX),
Expand All @@ -2017,18 +2016,25 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
cache_sizes.coins,
/*block_tree_db_in_memory=*/false,
/*coins_db_in_memory=*/false,
/*dash_dbs_in_memory=*/false,
/*bls_threads=*/[&args]() -> int8_t {
int8_t threads = args.GetIntArg("-parbls", llmq::DEFAULT_BLSCHECK_THREADS);
if (threads <= 0) {
// -parbls=0 means autodetect (number of cores - 1 validator threads)
// -parbls=-n means "leave n cores free" (number of cores - n - 1 validator threads)
threads += GetNumCores();
}
// Subtract 1 because the main thread counts towards the par threads
return std::clamp<int8_t>(threads - 1, 0, llmq::MAX_BLSCHECK_THREADS);
}(),
args.GetIntArg("-maxrecsigsage", llmq::DEFAULT_MAX_RECOVERED_SIGS_AGE),
llmq::DashParams{
.bls_threads = [&args]() -> int8_t {
int8_t threads = args.GetIntArg("-parbls", llmq::DEFAULT_BLSCHECK_THREADS);
if (threads <= 0) {
// -parbls=0 means autodetect (number of cores - 1 validator threads)
// -parbls=-n means "leave n cores free" (number of cores - n - 1 validator threads)
threads += GetNumCores();
}
// Subtract 1 because the main thread counts towards the par threads
return std::clamp<int8_t>(threads - 1, 0, llmq::MAX_BLSCHECK_THREADS);
}(),
.worker_count = llmq::DEFAULT_WORKER_COUNT,
.max_recsigs_age = args.GetIntArg("-maxrecsigsage", llmq::DEFAULT_MAX_RECOVERED_SIGS_AGE),
.db_params = util::DbWrapperParams{
.path = args.GetDataDirNet(),
.memory = false,
.wipe = fReset || fReindexChainState,
},
},
Comment on lines +2019 to +2037
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Avoid int8_t narrowing before clamping when computing DashParams.bls_threads.

args.GetIntArg("-parbls", ...) is widened, but you immediately store into int8_t, so out-of-range user input can overflow before std::clamp<int8_t>(...) runs.

Proposed diff
                                               llmq::DashParams{
-                                                .bls_threads = [&args]() -> int8_t {
-                                                    int8_t threads = args.GetIntArg("-parbls", llmq::DEFAULT_BLSCHECK_THREADS);
+                                                .bls_threads = [&args]() -> int8_t {
+                                                    int threads = args.GetIntArg("-parbls", llmq::DEFAULT_BLSCHECK_THREADS);
                                                     if (threads <= 0) {
                                                         // -parbls=0 means autodetect (number of cores - 1 validator threads)
                                                         // -parbls=-n means "leave n cores free" (number of cores - n - 1 validator threads)
                                                         threads += GetNumCores();
                                                     }
                                                     // Subtract 1 because the main thread counts towards the par threads
-                                                    return std::clamp<int8_t>(threads - 1, 0, llmq::MAX_BLSCHECK_THREADS);
+                                                    threads = std::clamp<int>(threads - 1, 0, llmq::MAX_BLSCHECK_THREADS);
+                                                    return static_cast<int8_t>(threads);
                                                 }(),
                                                 .worker_count = llmq::DEFAULT_WORKER_COUNT,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
llmq::DashParams{
.bls_threads = [&args]() -> int8_t {
int8_t threads = args.GetIntArg("-parbls", llmq::DEFAULT_BLSCHECK_THREADS);
if (threads <= 0) {
// -parbls=0 means autodetect (number of cores - 1 validator threads)
// -parbls=-n means "leave n cores free" (number of cores - n - 1 validator threads)
threads += GetNumCores();
}
// Subtract 1 because the main thread counts towards the par threads
return std::clamp<int8_t>(threads - 1, 0, llmq::MAX_BLSCHECK_THREADS);
}(),
.worker_count = llmq::DEFAULT_WORKER_COUNT,
.max_recsigs_age = args.GetIntArg("-maxrecsigsage", llmq::DEFAULT_MAX_RECOVERED_SIGS_AGE),
.db_params = util::DbWrapperParams{
.path = args.GetDataDirNet(),
.memory = false,
.wipe = fReset || fReindexChainState,
},
},
llmq::DashParams{
.bls_threads = [&args]() -> int8_t {
int threads = args.GetIntArg("-parbls", llmq::DEFAULT_BLSCHECK_THREADS);
if (threads <= 0) {
// -parbls=0 means autodetect (number of cores - 1 validator threads)
// -parbls=-n means "leave n cores free" (number of cores - n - 1 validator threads)
threads += GetNumCores();
}
// Subtract 1 because the main thread counts towards the par threads
threads = std::clamp<int>(threads - 1, 0, llmq::MAX_BLSCHECK_THREADS);
return static_cast<int8_t>(threads);
}(),
.worker_count = llmq::DEFAULT_WORKER_COUNT,
.max_recsigs_age = args.GetIntArg("-maxrecsigsage", llmq::DEFAULT_MAX_RECOVERED_SIGS_AGE),
.db_params = util::DbWrapperParams{
.path = args.GetDataDirNet(),
.memory = false,
.wipe = fReset || fReindexChainState,
},
},
🤖 Prompt for AI Agents
In @src/init.cpp around lines 2019 - 2037, The bls_threads lambda narrows user
input into int8_t before clamping, which can overflow; change the intermediate
type to a wider signed integer (e.g., int or int32_t) when calling
args.GetIntArg and doing arithmetic/GetNumCores, apply std::clamp with that
wider type against 0 and llmq::MAX_BLSCHECK_THREADS, then static_cast the final
clamped value to int8_t for the llmq::DashParams::bls_threads return; update
references inside the lambda (GetIntArg, GetNumCores, std::clamp,
llmq::MAX_BLSCHECK_THREADS) accordingly.

/*shutdown_requested=*/ShutdownRequested,
/*coins_error_cb=*/[]() {
uiInterface.ThreadSafeMessageBox(
Expand Down Expand Up @@ -2328,15 +2334,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)

node.llmq_ctx->Start();
node.peerman->StartHandlers();
if (node.observer_ctx) node.observer_ctx->Start();
if (node.observer_ctx) node.observer_ctx->Start(llmq::DEFAULT_WORKER_COUNT);

node.scheduler->scheduleEvery(std::bind(&CNetFulfilledRequestManager::DoMaintenance, std::ref(*node.netfulfilledman)), std::chrono::minutes{1});
node.scheduler->scheduleEvery(std::bind(&CMasternodeUtils::DoMaintenance, std::ref(*node.connman), std::ref(*node.dmnman), std::ref(*node.mn_sync), node.cj_walletman.get()), std::chrono::minutes{1});
node.scheduler->scheduleEvery(std::bind(&CDeterministicMNManager::DoMaintenance, std::ref(*node.dmnman)), std::chrono::seconds{10});
node.peerman->ScheduleHandlers(*node.scheduler);

if (node.active_ctx) {
node.active_ctx->Start(*node.connman, *node.peerman);
node.active_ctx->Start(*node.connman, *node.peerman, llmq::DEFAULT_WORKER_COUNT);
node.scheduler->scheduleEvery(std::bind(&llmq::CDKGSessionManager::CleanupOldContributions, std::ref(*node.active_ctx->qdkgsman)), std::chrono::hours{1});
}

Expand Down
14 changes: 7 additions & 7 deletions src/llmq/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,27 @@
#include <chainlock/chainlock.h>
#include <instantsend/instantsend.h>
#include <llmq/blockprocessor.h>
#include <llmq/options.h>
#include <llmq/quorumsman.h>
#include <llmq/signing.h>
#include <llmq/snapshot.h>
#include <validation.h>

LLMQContext::LLMQContext(CDeterministicMNManager& dmnman, CEvoDB& evo_db, CSporkManager& sporkman, CTxMemPool& mempool,
const ChainstateManager& chainman, const CMasternodeSync& mn_sync,
const util::DbWrapperParams& db_params, int8_t bls_threads, int64_t max_recsigs_age) :
const ChainstateManager& chainman, const CMasternodeSync& mn_sync, const llmq::DashParams& params) :
bls_worker{std::make_shared<CBLSWorker>()},
qsnapman{std::make_unique<llmq::CQuorumSnapshotManager>(evo_db)},
quorum_block_processor{std::make_unique<llmq::CQuorumBlockProcessor>(chainman.ActiveChainstate(), dmnman, evo_db,
*qsnapman, bls_threads)},
*qsnapman, params.bls_threads)},
qman{std::make_unique<llmq::CQuorumManager>(*bls_worker, dmnman, evo_db, *quorum_block_processor, *qsnapman,
chainman, db_params)},
sigman{std::make_unique<llmq::CSigningManager>(*qman, db_params, max_recsigs_age)},
chainman, params.db_params)},
sigman{std::make_unique<llmq::CSigningManager>(*qman, params.db_params, params.max_recsigs_age)},
clhandler{std::make_unique<llmq::CChainLocksHandler>(chainman.ActiveChainstate(), *qman, sporkman, mempool, mn_sync)},
isman{std::make_unique<llmq::CInstantSendManager>(*clhandler, chainman.ActiveChainstate(), *sigman, sporkman,
mempool, mn_sync, db_params)}
mempool, mn_sync, params.db_params)}
{
// Have to start it early to let VerifyDB check ChainLock signatures in coinbase
bls_worker->Start();
bls_worker->Start(params.worker_count);
}

LLMQContext::~LLMQContext()
Expand Down
7 changes: 2 additions & 5 deletions src/llmq/context.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,16 @@ class CQuorumBlockProcessor;
class CQuorumManager;
class CQuorumSnapshotManager;
class CSigningManager;
struct DashParams;
} // namespace llmq
namespace util {
struct DbWrapperParams;
} // namespace util

struct LLMQContext {
public:
LLMQContext() = delete;
LLMQContext(const LLMQContext&) = delete;
LLMQContext& operator=(const LLMQContext&) = delete;
explicit LLMQContext(CDeterministicMNManager& dmnman, CEvoDB& evo_db, CSporkManager& sporkman, CTxMemPool& mempool,
const ChainstateManager& chainman, const CMasternodeSync& mn_sync,
const util::DbWrapperParams& db_params, int8_t bls_threads, int64_t max_recsigs_age);
const ChainstateManager& chainman, const CMasternodeSync& mn_sync, const llmq::DashParams& params);
~LLMQContext();

void Start();
Expand Down
4 changes: 2 additions & 2 deletions src/llmq/core_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ RPCResult CDKGDebugSessionStatus::GetJsonHelp(const std::string& key, bool optio
}};
}

// CDKGDebugStatus::ToJson() defined in llmq/debug.cpp
RPCResult CDKGDebugStatus::GetJsonHelp(const std::string& key, bool optional, bool inner_optional)
// CDKGDebugManager::ToJson() defined in llmq/debug.cpp
RPCResult CDKGDebugManager::GetJsonHelp(const std::string& key, bool optional, bool inner_optional)
{
return {RPCResult::Type::OBJ, key, optional, key.empty() ? "" : "The state of the node's DKG sessions",
{
Expand Down
33 changes: 19 additions & 14 deletions src/llmq/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,29 +107,40 @@ UniValue CDKGDebugSessionStatus::ToJson(CDeterministicMNManager& dmnman, CQuorum
return ret;
}

CDKGDebugManager::CDKGDebugManager() = default;
CDKGDebugManager::CDKGDebugManager(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman) :
m_dmnman{dmnman},
m_qsnapman{qsnapman},
m_chainman{chainman}
{
}

CDKGDebugManager::~CDKGDebugManager() = default;

UniValue CDKGDebugStatus::ToJson(CDeterministicMNManager& dmnman, CQuorumSnapshotManager& qsnapman,
const ChainstateManager& chainman, int detailLevel) const
size_t CDKGDebugManager::GetSessionCount() const
{
UniValue ret(UniValue::VOBJ);
return WITH_LOCK(cs_lockStatus, return localStatus.sessions.size());
}

UniValue CDKGDebugManager::ToJson(int detailLevel) const
{
LOCK(cs_lockStatus);

ret.pushKV("time", nTime);
ret.pushKV("timeStr", FormatISO8601DateTime(nTime));
UniValue ret(UniValue::VOBJ);
ret.pushKV("time", localStatus.nTime);
ret.pushKV("timeStr", FormatISO8601DateTime(localStatus.nTime));

// TODO Support array of sessions
UniValue sessionsArrJson(UniValue::VARR);
for (const auto& p : sessions) {
for (const auto& p : localStatus.sessions) {
const auto& llmq_params_opt = Params().GetLLMQ(p.first.first);
if (!llmq_params_opt.has_value()) {
continue;
}
UniValue s(UniValue::VOBJ);
s.pushKV("llmqType", std::string(llmq_params_opt->name));
s.pushKV("quorumIndex", p.first.second);
s.pushKV("status", p.second.ToJson(dmnman, qsnapman, chainman, p.first.second, detailLevel));
s.pushKV("status", p.second.ToJson(m_dmnman, m_qsnapman, m_chainman, p.first.second, detailLevel));

sessionsArrJson.push_back(s);
}
Expand All @@ -138,12 +149,6 @@ UniValue CDKGDebugStatus::ToJson(CDeterministicMNManager& dmnman, CQuorumSnapsho
return ret;
}

void CDKGDebugManager::GetLocalDebugStatus(llmq::CDKGDebugStatus& ret) const
{
LOCK(cs_lockStatus);
ret = localStatus;
}

void CDKGDebugManager::ResetLocalSessionStatus(Consensus::LLMQType llmqType, int quorumIndex)
{
LOCK(cs_lockStatus);
Expand Down
Loading
Loading