1414#include < llmq/signhash.h>
1515#include < llmq/signing.h>
1616#include < msg_result.h>
17- #include < net_processing.h>
1817#include < netmessagemaker.h>
1918#include < spork.h>
2019#include < util/irange.h>
@@ -181,12 +180,11 @@ void CSigSharesNodeState::RemoveSession(const uint256& signHash)
181180// ////////////////////
182181
183182CSigSharesManager::CSigSharesManager (CConnman& connman, const ChainstateManager& chainman, CSigningManager& _sigman,
184- PeerManager& peerman , const CActiveMasternodeManager& mn_activeman ,
185- const CQuorumManager& _qman, const CSporkManager& sporkman) :
183+ const CActiveMasternodeManager& mn_activeman , const CQuorumManager& _qman ,
184+ const CSporkManager& sporkman) :
186185 m_connman{connman},
187186 m_chainman{chainman},
188187 sigman{_sigman},
189- m_peerman{peerman},
190188 m_mn_activeman{mn_activeman},
191189 qman{_qman},
192190 m_sporkman{sporkman}
@@ -521,26 +519,30 @@ bool CSigSharesManager::CollectPendingSigSharesToVerify(
521519}
522520
523521// It's ensured that no duplicates are passed to this method
524- void CSigSharesManager::ProcessPendingSigShares (
522+ std::vector<std::shared_ptr<CRecoveredSig>> CSigSharesManager::ProcessPendingSigShares (
525523 const std::vector<CSigShare>& sigSharesToProcess,
526524 const std::unordered_map<std::pair<Consensus::LLMQType, uint256>, CQuorumCPtr, StaticSaltedHasher>& quorums)
527525{
528526 cxxtimer::Timer t (true );
527+ std::vector<std::shared_ptr<CRecoveredSig>> recovered_sigs;
529528 for (const auto & sigShare : sigSharesToProcess) {
530529 auto quorumKey = std::make_pair (sigShare.getLlmqType (), sigShare.getQuorumHash ());
531- ProcessSigShare (sigShare, quorums.at (quorumKey));
530+ auto rs = ProcessSigShare (sigShare, quorums.at (quorumKey));
531+ if (rs != nullptr ) {
532+ recovered_sigs.emplace_back (std::move (rs));
533+ }
532534 }
533535 t.stop ();
534536
535537 LogPrint (BCLog::LLMQ_SIGS , " CSigSharesManager::%s -- processed sigShare batch. shares=%d, time=%ds\n " , __func__,
536538 sigSharesToProcess.size (), t.count ());
539+ return recovered_sigs;
537540}
538541
539542// sig shares are already verified when entering this method
540- void CSigSharesManager::ProcessSigShare (const CSigShare& sigShare, const CQuorumCPtr& quorum)
543+ std::shared_ptr<CRecoveredSig> CSigSharesManager::ProcessSigShare (const CSigShare& sigShare, const CQuorumCPtr& quorum)
541544{
542545 auto llmqType = quorum->params .type ;
543- bool canTryRecovery = false ;
544546
545547 const bool isAllMembersConnectedEnabled = IsAllMembersConnectedEnabled (llmqType, m_sporkman);
546548
@@ -552,14 +554,15 @@ void CSigSharesManager::ProcessSigShare(const CSigShare& sigShare, const CQuorum
552554 }
553555
554556 if (sigman.HasRecoveredSigForId (llmqType, sigShare.getId ())) {
555- return ;
557+ return nullptr ;
556558 }
557559
560+ bool canTryRecovery = false ;
558561 {
559562 LOCK (cs);
560563
561564 if (!sigShares.Add (sigShare.GetKey (), sigShare)) {
562- return ;
565+ return nullptr ;
563566 }
564567 if (!isAllMembersConnectedEnabled) {
565568 sigSharesQueuedToAnnounce.Add (sigShare.GetKey (), true );
@@ -583,24 +586,9 @@ void CSigSharesManager::ProcessSigShare(const CSigShare& sigShare, const CQuorum
583586 canTryRecovery = true ;
584587 }
585588 }
589+ if (!canTryRecovery) return nullptr ;
586590
587- if (canTryRecovery) {
588- auto rs = TryRecoverSig (*quorum, sigShare.getId (), sigShare.getMsgHash ());
589- if (rs != nullptr ) {
590- if (sigman.ProcessRecoveredSig (rs)) {
591- // TODO: remove duplicated code with NetSigning
592- auto listeners = sigman.GetListeners ();
593- for (auto & l : listeners) {
594- m_peerman.PostProcessMessage (l->HandleNewRecoveredSig (*rs));
595- }
596-
597- bool proactive_relay = rs->getLlmqType () != Consensus::LLMQType::LLMQ_100_67 &&
598- rs->getLlmqType () != Consensus::LLMQType::LLMQ_400_60 &&
599- rs->getLlmqType () != Consensus::LLMQType::LLMQ_400_85 ;
600- GetMainSignals ().NotifyRecoveredSig (rs, rs->GetHash ().ToString (), proactive_relay);
601- }
602- }
603- }
591+ return TryRecoverSig (*quorum, sigShare.getId (), sigShare.getMsgHash ());
604592}
605593
606594std::shared_ptr<CRecoveredSig> CSigSharesManager::TryRecoverSig (const CQuorum& quorum, const uint256& id,
@@ -1427,13 +1415,13 @@ bool CSigSharesManager::IsAnyPendingProcessing() const
14271415 [](const auto & entry) { return !entry.second .pendingIncomingSigShares .Empty (); });
14281416}
14291417
1430- void CSigSharesManager::SignAndProcessSingleShare (PendingSignatureData work)
1418+ std::shared_ptr<CRecoveredSig> CSigSharesManager::SignAndProcessSingleShare (PendingSignatureData work)
14311419{
14321420 auto opt_sigShare = CreateSigShare (*work.quorum , work.id , work.msgHash );
14331421
14341422 if (opt_sigShare.has_value () && opt_sigShare->sigShare .Get ().IsValid ()) {
14351423 auto & sigShare = *opt_sigShare;
1436- ProcessSigShare (sigShare, work.quorum );
1424+ auto rs = ProcessSigShare (sigShare, work.quorum );
14371425
14381426 if (IsAllMembersConnectedEnabled (work.quorum ->params .type , m_sporkman)) {
14391427 LOCK (cs);
@@ -1443,7 +1431,9 @@ void CSigSharesManager::SignAndProcessSingleShare(PendingSignatureData work)
14431431 session.nextAttemptTime = 0 ;
14441432 session.attempt = 0 ;
14451433 }
1434+ return rs;
14461435 }
1436+ return nullptr ;
14471437}
14481438
14491439void CSigSharesManager::AsyncSign (CQuorumCPtr quorum, const uint256& id, const uint256& msgHash)
0 commit comments