Skip to content

Commit 099909a

Browse files
committed
More quorumVvec protection
1 parent d876781 commit 099909a

File tree

3 files changed

+21
-11
lines changed

3 files changed

+21
-11
lines changed

src/llmq/quorums.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ CBLSPublicKey CQuorum::GetPubKeyShare(size_t memberIdx) const
110110
return blsCache.BuildPubKeyShare(m->proTxHash, quorumVvec, CBLSId(m->proTxHash));
111111
}
112112

113+
bool CQuorum::HasVerificationVector() const
114+
{
115+
LOCK(quorumVvecCs);
116+
return quorumVvec != nullptr;
117+
}
118+
113119
const CBLSSecretKey& CQuorum::GetSkShare() const
114120
{
115121
return skShare;
@@ -225,7 +231,7 @@ void CQuorumManager::TriggerQuorumDataRecoveryThreads(const CBlockIndex* pIndex)
225231
const QvvecSyncMode syncMode = fSyncForTypeEnabled ? mapQuorumVvecSync.at(pQuorum->qc->llmqType) : QvvecSyncMode::Invalid;
226232
const bool fSyncCurrent = syncMode == QvvecSyncMode::Always || (syncMode == QvvecSyncMode::OnlyIfTypeMember && fWeAreQuorumTypeMember);
227233

228-
if ((fWeAreQuorumMember || (fSyncForTypeEnabled && fSyncCurrent)) && WITH_LOCK(pQuorum->quorumVvecCs, return pQuorum->quorumVvec == nullptr)) {
234+
if ((fWeAreQuorumMember || (fSyncForTypeEnabled && fSyncCurrent)) && !pQuorum->HasVerificationVector()) {
229235
nDataMask |= llmq::CQuorumDataRequest::QUORUM_VERIFICATION_VECTOR;
230236
}
231237

@@ -347,6 +353,7 @@ bool CQuorumManager::BuildQuorumContributions(const CFinalCommitmentPtr& fqc, co
347353
}
348354

349355
cxxtimer::Timer t2(true);
356+
LOCK(quorum->quorumVvecCs);
350357
quorum->quorumVvec = blsWorker.BuildQuorumVerificationVector(vvecs);
351358
if (quorum->quorumVvec == nullptr) {
352359
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- failed to build quorumVvec\n", __func__);
@@ -604,6 +611,7 @@ void CQuorumManager::ProcessMessage(CNode* pFrom, const std::string& strCommand,
604611
// Check if request wants QUORUM_VERIFICATION_VECTOR data
605612
if (request.GetDataMask() & CQuorumDataRequest::QUORUM_VERIFICATION_VECTOR) {
606613

614+
LOCK(pQuorum->quorumVvecCs);
607615
if (!pQuorum->quorumVvec) {
608616
sendQDATA(CQuorumDataRequest::Errors::QUORUM_VERIFICATION_VECTOR_MISSING);
609617
return;
@@ -693,7 +701,7 @@ void CQuorumManager::ProcessMessage(CNode* pFrom, const std::string& strCommand,
693701
// Check if request has ENCRYPTED_CONTRIBUTIONS data
694702
if (request.GetDataMask() & CQuorumDataRequest::ENCRYPTED_CONTRIBUTIONS) {
695703

696-
if (pQuorum->quorumVvec->size() != pQuorum->params.threshold) {
704+
if (WITH_LOCK(pQuorum->quorumVvecCs, return pQuorum->quorumVvec->size() != pQuorum->params.threshold)) {
697705
errorHandler("No valid quorum verification vector available", 0); // Don't bump score because we asked for it
698706
return;
699707
}
@@ -730,7 +738,7 @@ void CQuorumManager::ProcessMessage(CNode* pFrom, const std::string& strCommand,
730738

731739
void CQuorumManager::StartCachePopulatorThread(const CQuorumCPtr pQuorum) const
732740
{
733-
if (pQuorum->quorumVvec == nullptr) {
741+
if (!pQuorum->HasVerificationVector()) {
734742
return;
735743
}
736744

@@ -793,8 +801,7 @@ void CQuorumManager::StartQuorumDataRecoveryThread(const CQuorumCPtr pQuorum, co
793801

794802
while (nDataMask > 0 && !quorumThreadInterrupt) {
795803

796-
if (nDataMask & llmq::CQuorumDataRequest::QUORUM_VERIFICATION_VECTOR &&
797-
WITH_LOCK(pQuorum->quorumVvecCs, return pQuorum->quorumVvec != nullptr)) {
804+
if (nDataMask & llmq::CQuorumDataRequest::QUORUM_VERIFICATION_VECTOR && pQuorum->HasVerificationVector()) {
798805
nDataMask &= ~llmq::CQuorumDataRequest::QUORUM_VERIFICATION_VECTOR;
799806
printLog("Received quorumVvec");
800807
}

src/llmq/quorums.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,7 @@ class CQuorum
157157
uint256 minedBlockHash;
158158
std::vector<CDeterministicMNCPtr> members;
159159

160-
// These are only valid when we either participated in the DKG or fully watched it
161-
mutable CCriticalSection quorumVvecCs;
162-
BLSVerificationVectorPtr quorumVvec GUARDED_BY(quorumVvecCs);
160+
// Only valid when we either participated in the DKG or fully watched it
163161
CBLSSecretKey skShare;
164162

165163
private:
@@ -168,6 +166,10 @@ class CQuorum
168166
mutable CBLSWorkerCache blsCache;
169167
mutable std::atomic<bool> fQuorumDataRecoveryThreadRunning{false};
170168

169+
mutable CCriticalSection quorumVvecCs;
170+
// Only valid when we either participated in the DKG or fully watched it
171+
BLSVerificationVectorPtr quorumVvec GUARDED_BY(quorumVvecCs);
172+
171173
public:
172174
CQuorum(const Consensus::LLMQParams& _params, CBLSWorker& _blsWorker);
173175
~CQuorum();
@@ -176,6 +178,7 @@ class CQuorum
176178
bool SetVerificationVector(const BLSVerificationVector& quorumVecIn);
177179
bool SetSecretKeyShare(const CBLSSecretKey& secretKeyShare);
178180

181+
bool HasVerificationVector() const;
179182
bool IsMember(const uint256& proTxHash) const;
180183
bool IsValidMember(const uint256& proTxHash) const;
181184
int GetMemberIndex(const uint256& proTxHash) const;

src/llmq/quorums_signing_shares.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ bool CSigSharesManager::ProcessMessageSigSharesInv(CNode* pfrom, const CSigShare
377377
LogPrint(BCLog::LLMQ_SIGS, "CSigSharesManager::%s -- signHash=%s, inv={%s}, node=%d\n", __func__,
378378
sessionInfo.signHash.ToString(), inv.ToString(), pfrom->GetId());
379379

380-
if (sessionInfo.quorum->quorumVvec == nullptr) {
380+
if (!sessionInfo.quorum->HasVerificationVector()) {
381381
// TODO we should allow to ask other nodes for the quorum vvec if we missed it in the DKG
382382
LogPrint(BCLog::LLMQ_SIGS, "CSigSharesManager::%s -- we don't have the quorum vvec for %s, not requesting sig shares. node=%d\n", __func__,
383383
sessionInfo.quorumHash.ToString(), pfrom->GetId());
@@ -494,7 +494,7 @@ void CSigSharesManager::ProcessMessageSigShare(NodeId fromId, const CSigShare& s
494494
// we're not a member so we can't verify it (we actually shouldn't have received it)
495495
return;
496496
}
497-
if (quorum->quorumVvec == nullptr) {
497+
if (!quorum->HasVerificationVector()) {
498498
// TODO we should allow to ask other nodes for the quorum vvec if we missed it in the DKG
499499
LogPrint(BCLog::LLMQ_SIGS, "CSigSharesManager::%s -- we don't have the quorum vvec for %s, no verification possible. node=%d\n", __func__,
500500
quorum->qc->quorumHash.ToString(), fromId);
@@ -543,7 +543,7 @@ bool CSigSharesManager::PreVerifyBatchedSigShares(const CSigSharesNodeState::Ses
543543
// we're not a member so we can't verify it (we actually shouldn't have received it)
544544
return false;
545545
}
546-
if (session.quorum->quorumVvec == nullptr) {
546+
if (!session.quorum->HasVerificationVector()) {
547547
// TODO we should allow to ask other nodes for the quorum vvec if we missed it in the DKG
548548
LogPrint(BCLog::LLMQ_SIGS, "CSigSharesManager::%s -- we don't have the quorum vvec for %s, no verification possible.\n", __func__,
549549
session.quorumHash.ToString());

0 commit comments

Comments
 (0)