diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index efdcd13cd747..b19ebb8bd3a7 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -366,14 +366,11 @@ bool CSigningManager::GetRecoveredSigForGetData(const uint256& hash, CRecoveredS void CSigningManager::VerifyAndProcessRecoveredSig(NodeId from, std::shared_ptr recoveredSig) { auto llmq_type = recoveredSig->getLlmqType(); - auto quorum = qman.GetQuorum(llmq_type, recoveredSig->getQuorumHash()); + const uint256& quorum_hash = recoveredSig->getQuorumHash(); - if (!quorum) { - LogPrint(BCLog::LLMQ, "CSigningManager::%s -- quorum %s not found\n", __func__, - recoveredSig->getQuorumHash().ToString()); - return; - } - if (!IsQuorumActive(llmq_type, qman, quorum->qc->quorumHash)) { + // Cheap gate first: GetQuorum can rebuild an arbitrary historical quorum on a cache miss, + // so don't let an unsolicited QSIGREC force that work for an inactive hash. + if (!IsQuorumActive(llmq_type, qman, quorum_hash)) { return; } @@ -383,6 +380,14 @@ void CSigningManager::VerifyAndProcessRecoveredSig(NodeId from, std::shared_ptr< return; } + auto quorum = qman.GetQuorum(llmq_type, quorum_hash); + if (!quorum) { + // Active per ScanQuorums but no longer materializable (e.g. reorg); not peer-controlled, so no score. + LogPrint(BCLog::LLMQ, "CSigningManager::%s -- quorum %s not found\n", __func__, + quorum_hash.ToString()); + return; + } + LogPrint(BCLog::LLMQ, "CSigningManager::%s -- signHash=%s, id=%s, msgHash=%s, node=%d\n", __func__, recoveredSig->buildSignHash().ToString(), recoveredSig->getId().ToString(), recoveredSig->getMsgHash().ToString(), from);