From 465895d8f313e454e5e1572ec71e5c47dbcd9008 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Sun, 4 Aug 2024 02:40:09 +0700 Subject: [PATCH 1/4] chore: some extra logs for ehf signaling --- src/llmq/ehf_signals.cpp | 1 + src/llmq/signing.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/llmq/ehf_signals.cpp b/src/llmq/ehf_signals.cpp index 7dd42bf2a410..6eab46ea56bf 100644 --- a/src/llmq/ehf_signals.cpp +++ b/src/llmq/ehf_signals.cpp @@ -91,6 +91,7 @@ void CEHFSignalsHandler::trySignEHFSignal(int bit, const CBlockIndex* const pind LogPrint(BCLog::EHF, "CEHFSignalsHandler::trySignEHFSignal: bit=%d at height=%d id=%s\n", bit, pindex->nHeight, requestId.ToString()); mnhfPayload.signal.quorumHash = quorum->qc->quorumHash; const uint256 msgHash = mnhfPayload.PrepareTx().GetHash(); + LogPrint(BCLog::EHF, "CEHFSignalsHandler::trySignEHFSignal: msgHash=%s quorum=%s id=%s\n", msgHash.ToString(), quorum->qc->quorumHash.ToString(), requestId.ToString()); WITH_LOCK(cs, ids.insert(requestId)); sigman.AsyncSignIfMember(llmqType, shareman, requestId, msgHash); diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index e9cc76e3504c..6b86c0cee8eb 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -878,8 +878,11 @@ void CSigningManager::UnregisterRecoveredSigsListener(CRecoveredSigsListener* l) bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigSharesManager& shareman, const uint256& id, const uint256& msgHash, const uint256& quorumHash, bool allowReSign) { + LogPrintf("CSigningManager::AsyncSignIfMember id=%s\n", id.ToString()); if (m_mn_activeman == nullptr) return false; + LogPrintf("CSigningManager::AsyncSignIfMember id=%s that's mn_activeman\n", id.ToString()); if (m_mn_activeman->GetProTxHash().IsNull()) return false; + LogPrintf("CSigningManager::AsyncSignIfMember id=%s protx=%s\n", id.ToString(), m_mn_activeman->GetProTxHash().ToString()); const CQuorumCPtr quorum = [&]() { if (quorumHash.IsNull()) { @@ -902,6 +905,7 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares } if (!quorum->IsValidMember(m_mn_activeman->GetProTxHash())) { + LogPrintf("CSigningManager::AsyncSignIfMember id=%s not a member of quorum=%s\n", id.ToString(), quorum->qc->quorumHash.ToString()); return false; } @@ -925,11 +929,14 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares } if (db.HasRecoveredSigForId(llmqType, id)) { + LogPrintf("CSigningManager::AsyncSignIfMemeber hasRecoveredSig id=%s\n", id.ToString()); // no need to sign it if we already have a recovered sig return true; } if (!hasVoted) { db.WriteVoteForId(llmqType, id, msgHash); + } else { + LogPrintf("CSigningManager::AsyncSignIfMemeber has voted id=%s\n", id.ToString()); } } @@ -937,6 +944,7 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares // make us re-announce all known shares (other nodes might have run into a timeout) shareman.ForceReAnnouncement(quorum, llmqType, id, msgHash); } + LogPrintf("CSigningManager::AsyncSignIfMemeber call async sign for id=%s msgHash=%s\n", id.ToString(), msgHash.ToString()); shareman.AsyncSign(quorum, id, msgHash); return true; From bc64dd19f820ec66828867f975a53d121d47da6a Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Sun, 4 Aug 2024 14:05:43 +0700 Subject: [PATCH 2/4] chore: add extra logs with amount of already collected signed shares and for network requests --- src/llmq/signing.cpp | 2 ++ src/llmq/signing_shares.cpp | 2 ++ src/llmq/signing_shares.h | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index 6b86c0cee8eb..05be09db2014 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -884,6 +884,8 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares if (m_mn_activeman->GetProTxHash().IsNull()) return false; LogPrintf("CSigningManager::AsyncSignIfMember id=%s protx=%s\n", id.ToString(), m_mn_activeman->GetProTxHash().ToString()); + LogPrintf("CSigningManager::AsyncSignIfMember id=%s shares=%lld\n", id.ToString(), shareman.CountForSignHash(id)); + LogPrintf("CSigningManager::AsyncSignIfMember id=%s msgHash=%s shares=%lld\n", id.ToString(), msgHash.ToString(), shareman.CountForSignHash(msgHash)); const CQuorumCPtr quorum = [&]() { if (quorumHash.IsNull()) { // This might end up giving different results on different members diff --git a/src/llmq/signing_shares.cpp b/src/llmq/signing_shares.cpp index 3667e593bc3a..c1cfc56f5dbc 100644 --- a/src/llmq/signing_shares.cpp +++ b/src/llmq/signing_shares.cpp @@ -706,6 +706,7 @@ void CSigSharesManager::ProcessSigShare(const CSigShare& sigShare, const CConnma } if (sigman.HasRecoveredSigForId(llmqType, sigShare.getId())) { + LogPrintf("CSigSharesManager::ProcessSigShare has recovered sig for id=%s\n", sigShare.getId().ToString()); return; } @@ -735,6 +736,7 @@ void CSigSharesManager::ProcessSigShare(const CSigShare& sigShare, const CConnma } size_t sigShareCount = sigShares.CountForSignHash(sigShare.GetSignHash()); + LogPrintf("CSigSharesManager::ProcessSigShare sig_id=%s key=%s,%d shares=%lld/%lld\n", sigShare.getId().ToString(), sigShare.GetSignHash().ToString(), sigShare.GetKey().second, sigShareCount, quorum->params.threshold); if (sigShareCount >= size_t(quorum->params.threshold)) { canTryRecovery = true; } diff --git a/src/llmq/signing_shares.h b/src/llmq/signing_shares.h index 3725d295be80..5db739b822bd 100644 --- a/src/llmq/signing_shares.h +++ b/src/llmq/signing_shares.h @@ -428,6 +428,12 @@ class CSigSharesManager : public CRecoveredSigsListener void ProcessMessage(const CNode& pnode, const CSporkManager& sporkman, const std::string& msg_type, CDataStream& vRecv); + int CountForSignHash(const uint256& msgHash) { + LOCK(cs); + return sigShares.CountForSignHash(msgHash); + } + + void AsyncSign(const CQuorumCPtr& quorum, const uint256& id, const uint256& msgHash); std::optional CreateSigShare(const CQuorumCPtr& quorum, const uint256& id, const uint256& msgHash) const; void ForceReAnnouncement(const CQuorumCPtr& quorum, Consensus::LLMQType llmqType, const uint256& id, const uint256& msgHash); From ee5cec198102194282d0522bdf7a4ccedcf21856 Mon Sep 17 00:00:00 2001 From: pasta Date: Mon, 5 Aug 2024 05:05:30 +0800 Subject: [PATCH 3/4] use signhash instead of msgHash --- src/llmq/signing.cpp | 4 ++-- src/llmq/signing_shares.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index 05be09db2014..e3259b1ee85f 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -884,8 +884,8 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares if (m_mn_activeman->GetProTxHash().IsNull()) return false; LogPrintf("CSigningManager::AsyncSignIfMember id=%s protx=%s\n", id.ToString(), m_mn_activeman->GetProTxHash().ToString()); - LogPrintf("CSigningManager::AsyncSignIfMember id=%s shares=%lld\n", id.ToString(), shareman.CountForSignHash(id)); - LogPrintf("CSigningManager::AsyncSignIfMember id=%s msgHash=%s shares=%lld\n", id.ToString(), msgHash.ToString(), shareman.CountForSignHash(msgHash)); + LogPrintf("CSigningManager::AsyncSignIfMember id=%s shares=%lld\n", id.ToString(), shareman.CountForSignHash(BuildSignHash(llmqType, quorumHash, id, msgHash))); + LogPrintf("CSigningManager::AsyncSignIfMember id=%s msgHash=%s shares=%lld\n", id.ToString(), msgHash.ToString(), shareman.CountForSignHash(BuildSignHash(llmqType, quorumHash, id, msgHash))); const CQuorumCPtr quorum = [&]() { if (quorumHash.IsNull()) { // This might end up giving different results on different members diff --git a/src/llmq/signing_shares.h b/src/llmq/signing_shares.h index 5db739b822bd..816c155eeb67 100644 --- a/src/llmq/signing_shares.h +++ b/src/llmq/signing_shares.h @@ -428,9 +428,9 @@ class CSigSharesManager : public CRecoveredSigsListener void ProcessMessage(const CNode& pnode, const CSporkManager& sporkman, const std::string& msg_type, CDataStream& vRecv); - int CountForSignHash(const uint256& msgHash) { + int CountForSignHash(const uint256& signHash) { LOCK(cs); - return sigShares.CountForSignHash(msgHash); + return sigShares.CountForSignHash(signHash); } From 646613260f784aa330fbaf3a3e68d46793fe3382 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Sun, 4 Aug 2024 10:49:42 -0500 Subject: [PATCH 4/4] Add option to AsyncSignIfMember to allow signing same requestID on different msgHashes codereview suggestions continued --- src/llmq/ehf_signals.cpp | 2 +- src/llmq/signing.cpp | 16 ++++++++++++---- src/llmq/signing.h | 4 +++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/llmq/ehf_signals.cpp b/src/llmq/ehf_signals.cpp index 6eab46ea56bf..a84f79021a84 100644 --- a/src/llmq/ehf_signals.cpp +++ b/src/llmq/ehf_signals.cpp @@ -94,7 +94,7 @@ void CEHFSignalsHandler::trySignEHFSignal(int bit, const CBlockIndex* const pind LogPrint(BCLog::EHF, "CEHFSignalsHandler::trySignEHFSignal: msgHash=%s quorum=%s id=%s\n", msgHash.ToString(), quorum->qc->quorumHash.ToString(), requestId.ToString()); WITH_LOCK(cs, ids.insert(requestId)); - sigman.AsyncSignIfMember(llmqType, shareman, requestId, msgHash); + sigman.AsyncSignIfMember(llmqType, shareman, requestId, msgHash, quorum->qc->quorumHash, false, true); } void CEHFSignalsHandler::HandleNewRecoveredSig(const CRecoveredSig& recoveredSig) diff --git a/src/llmq/signing.cpp b/src/llmq/signing.cpp index e3259b1ee85f..332018fac2fc 100644 --- a/src/llmq/signing.cpp +++ b/src/llmq/signing.cpp @@ -876,7 +876,9 @@ void CSigningManager::UnregisterRecoveredSigsListener(CRecoveredSigsListener* l) recoveredSigsListeners.erase(itRem, recoveredSigsListeners.end()); } -bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigSharesManager& shareman, const uint256& id, const uint256& msgHash, const uint256& quorumHash, bool allowReSign) +bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigSharesManager& shareman, const uint256& id, + const uint256& msgHash, const uint256& quorumHash, bool allowReSign, + bool allowDiffMsgHashSigning) { LogPrintf("CSigningManager::AsyncSignIfMember id=%s\n", id.ToString()); if (m_mn_activeman == nullptr) return false; @@ -917,9 +919,15 @@ bool CSigningManager::AsyncSignIfMember(Consensus::LLMQType llmqType, CSigShares uint256 prevMsgHash; db.GetVoteForId(llmqType, id, prevMsgHash); if (msgHash != prevMsgHash) { - LogPrintf("CSigningManager::%s -- already voted for id=%s and msgHash=%s. Not voting on conflicting msgHash=%s\n", __func__, - id.ToString(), prevMsgHash.ToString(), msgHash.ToString()); - return false; + if (allowDiffMsgHashSigning) { + LogPrintf("CSigningManager::%s -- already voted for id=%s and msgHash=%s. Signing for different msgHash=%s\n", + __func__, id.ToString(), prevMsgHash.ToString(), msgHash.ToString()); + hasVoted = false; + } else { + LogPrintf("CSigningManager::%s -- already voted for id=%s and msgHash=%s. Not voting on conflicting msgHash=%s\n", + __func__, id.ToString(), prevMsgHash.ToString(), msgHash.ToString()); + return false; + } } else if (allowReSign) { LogPrint(BCLog::LLMQ, "CSigningManager::%s -- already voted for id=%s and msgHash=%s. Resigning!\n", __func__, id.ToString(), prevMsgHash.ToString()); diff --git a/src/llmq/signing.h b/src/llmq/signing.h index 16d24ef5c0dd..ae2fd48224d4 100644 --- a/src/llmq/signing.h +++ b/src/llmq/signing.h @@ -218,7 +218,9 @@ class CSigningManager void RegisterRecoveredSigsListener(CRecoveredSigsListener* l); void UnregisterRecoveredSigsListener(CRecoveredSigsListener* l); - bool AsyncSignIfMember(Consensus::LLMQType llmqType, CSigSharesManager& shareman, const uint256& id, const uint256& msgHash, const uint256& quorumHash = uint256(), bool allowReSign = false); + bool AsyncSignIfMember(Consensus::LLMQType llmqType, CSigSharesManager& shareman, const uint256& id, + const uint256& msgHash, const uint256& quorumHash = uint256(), bool allowReSign = false, + bool allowDiffMsgHashSigning = false); bool HasRecoveredSig(Consensus::LLMQType llmqType, const uint256& id, const uint256& msgHash) const; bool HasRecoveredSigForId(Consensus::LLMQType llmqType, const uint256& id) const; bool HasRecoveredSigForSession(const uint256& signHash) const;