From fcf775b62eab74a428d76eab8710fbe1185645a9 Mon Sep 17 00:00:00 2001 From: Navid Rahimi Date: Sun, 23 Aug 2026 19:49:35 +0000 Subject: [PATCH] LLMQ: Handle empty contribution batches --- src/bls/bls_worker.cpp | 4 ++++ src/llmq/quorums_dkgsession.cpp | 5 +++++ src/test/bls_tests.cpp | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/bls/bls_worker.cpp b/src/bls/bls_worker.cpp index 4e82327ed6..5ed64fcc35 100644 --- a/src/bls/bls_worker.cpp +++ b/src/bls/bls_worker.cpp @@ -726,6 +726,10 @@ CBLSPublicKey CBLSWorker::BuildPubKeyShare(const BLSVerificationVectorPtr& vvec, void CBLSWorker::AsyncVerifyContributionShares(const CBLSId& forId, const std::vector& vvecs, const BLSSecretKeyVector& skShares, bool parallel, bool aggregated, std::function&)> doneCallback) { + if (vvecs.empty()) { + doneCallback(std::vector{}); + return; + } if (!forId.IsValid() || !VerifyVerificationVectors(vvecs)) { std::vector result; result.assign(vvecs.size(), false); diff --git a/src/llmq/quorums_dkgsession.cpp b/src/llmq/quorums_dkgsession.cpp index 0681d4a8e4..bfa8535902 100644 --- a/src/llmq/quorums_dkgsession.cpp +++ b/src/llmq/quorums_dkgsession.cpp @@ -386,6 +386,11 @@ void CDKGSession::VerifyPendingContributions() skContributions.emplace_back(receivedSkContributions[idx]); } + // All pending members may have been marked bad after they were enqueued. + if (memberIndexes.empty()) { + return; + } + auto result = blsWorker.VerifyContributionShares(myId, vvecs, skContributions); if (result.size() != memberIndexes.size()) { logger.Batch("VerifyContributionShares returned result of size %d but size %d was expected, something is wrong", result.size(), memberIndexes.size()); diff --git a/src/test/bls_tests.cpp b/src/test/bls_tests.cpp index 96c73fc80d..7b40487f13 100644 --- a/src/test/bls_tests.cpp +++ b/src/test/bls_tests.cpp @@ -4,6 +4,7 @@ #include "bls/bls.h" #include "bls/bls_batchverifier.h" +#include "bls/bls_worker.h" #include "test/test_bitcoin.h" #include @@ -154,4 +155,28 @@ BOOST_AUTO_TEST_CASE(batch_verifier_tests) Verify(msgs); } +BOOST_AUTO_TEST_CASE(bls_verify_contribution_shares_empty_vvecs_tests) +{ + CBLSWorker worker; + worker.Start(); + + const CBLSId id{uint256S("1")}; + BOOST_REQUIRE(id.IsValid()); + + const std::vector vvecs; + const BLSSecretKeyVector skShares; + + for (const bool aggregated : {true, false}) { + bool completed = false; + worker.AsyncVerifyContributionShares(id, vvecs, skShares, true, aggregated, + [&](const std::vector& result) { + BOOST_CHECK(result.empty()); + completed = true; + }); + BOOST_CHECK(completed); + } + + worker.Stop(); +} + BOOST_AUTO_TEST_SUITE_END()