Skip to content

Commit 5bbc122

Browse files
committed
Implement PushReconstructedRecoveredSig in CSigningManager
We can reconstruct recovered sigs from other P2P messages to avoid re-validation of those. We will do this later in InstantSend code.
1 parent 2bbac8f commit 5bbc122

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/llmq/quorums_signing.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -440,11 +440,25 @@ void CSigningManager::CollectPendingRecoveredSigsToVerify(
440440
}
441441
}
442442

443+
bool CSigningManager::ProcessPendingReconstructedRecoveredSigs()
444+
{
445+
decltype(pendingReconstructedRecoveredSigs) l;
446+
{
447+
LOCK(cs);
448+
l = std::move(pendingReconstructedRecoveredSigs);
449+
}
450+
for (auto& p : l) {
451+
ProcessRecoveredSig(-1, p.first, p.second, *g_connman);
452+
}
453+
}
454+
443455
bool CSigningManager::ProcessPendingRecoveredSigs(CConnman& connman)
444456
{
445457
std::unordered_map<NodeId, std::list<CRecoveredSig>> recSigsByNode;
446458
std::unordered_map<std::pair<Consensus::LLMQType, uint256>, CQuorumCPtr, StaticSaltedHasher> quorums;
447459

460+
ProcessPendingReconstructedRecoveredSigs();
461+
448462
CollectPendingRecoveredSigsToVerify(32, recSigsByNode, quorums);
449463
if (recSigsByNode.empty()) {
450464
return false;
@@ -550,6 +564,12 @@ void CSigningManager::ProcessRecoveredSig(NodeId nodeId, const CRecoveredSig& re
550564
}
551565
}
552566

567+
void CSigningManager::PushReconstructedRecoveredSig(const llmq::CRecoveredSig& recoveredSig, const llmq::CQuorumCPtr& quorum)
568+
{
569+
LOCK(cs);
570+
pendingReconstructedRecoveredSigs.emplace_back(recoveredSig, quorum);
571+
}
572+
553573
void CSigningManager::Cleanup()
554574
{
555575
int64_t now = GetTimeMillis();

src/llmq/quorums_signing.h

+6
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class CSigningManager
126126

127127
// Incoming and not verified yet
128128
std::unordered_map<NodeId, std::list<CRecoveredSig>> pendingRecoveredSigs;
129+
std::list<std::pair<CRecoveredSig, CQuorumCPtr>> pendingReconstructedRecoveredSigs;
129130

130131
// must be protected by cs
131132
FastRandomContext rnd;
@@ -142,13 +143,18 @@ class CSigningManager
142143

143144
void ProcessMessage(CNode* pnode, const std::string& strCommand, CDataStream& vRecv, CConnman& connman);
144145

146+
// This is called when a recovered signature was was reconstructed from another P2P message and is known to be valid
147+
// This is the case for example when a signature appears as part of InstantSend or ChainLocks
148+
void PushReconstructedRecoveredSig(const CRecoveredSig& recoveredSig, const CQuorumCPtr& quorum);
149+
145150
private:
146151
void ProcessMessageRecoveredSig(CNode* pfrom, const CRecoveredSig& recoveredSig, CConnman& connman);
147152
bool PreVerifyRecoveredSig(NodeId nodeId, const CRecoveredSig& recoveredSig, bool& retBan);
148153

149154
void CollectPendingRecoveredSigsToVerify(size_t maxUniqueSessions,
150155
std::unordered_map<NodeId, std::list<CRecoveredSig>>& retSigShares,
151156
std::unordered_map<std::pair<Consensus::LLMQType, uint256>, CQuorumCPtr, StaticSaltedHasher>& retQuorums);
157+
bool ProcessPendingReconstructedRecoveredSigs();
152158
bool ProcessPendingRecoveredSigs(CConnman& connman); // called from the worker thread of CSigSharesManager
153159
void ProcessRecoveredSig(NodeId nodeId, const CRecoveredSig& recoveredSig, const CQuorumCPtr& quorum, CConnman& connman);
154160
void Cleanup(); // called from the worker thread of CSigSharesManager

0 commit comments

Comments
 (0)