Skip to content

Commit f4fd143

Browse files
knstPastaPastaPasta
authored andcommitted
refactor: llmq/quorums no more depends on net_processing
1 parent c6a21bb commit f4fd143

File tree

4 files changed

+36
-57
lines changed

4 files changed

+36
-57
lines changed

src/llmq/context.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ LLMQContext::LLMQContext(CChainState& chainstate, CConnman& connman, CEvoDB& evo
3232
qdkgsman{std::make_unique<llmq::CDKGSessionManager>(*bls_worker, chainstate, connman, *dkg_debugman, *quorum_block_processor, sporkman, peerman, unit_tests, wipe)},
3333
qman{[&]() -> llmq::CQuorumManager* const {
3434
assert(llmq::quorumManager == nullptr);
35-
llmq::quorumManager = std::make_unique<llmq::CQuorumManager>(*bls_worker, chainstate, connman, *qdkgsman, evo_db, *quorum_block_processor, ::masternodeSync, peerman);
35+
llmq::quorumManager = std::make_unique<llmq::CQuorumManager>(*bls_worker, chainstate, connman, *qdkgsman, evo_db, *quorum_block_processor, ::masternodeSync);
3636
return llmq::quorumManager.get();
3737
}()},
3838
sigman{std::make_unique<llmq::CSigningManager>(connman, *llmq::quorumManager, peerman, unit_tests, wipe)},

src/llmq/quorums.cpp

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
#include <masternode/node.h>
1717
#include <masternode/sync.h>
1818
#include <net.h>
19-
#include <net_processing.h>
2019
#include <netmessagemaker.h>
2120
#include <univalue.h>
2221
#include <util/irange.h>
@@ -189,16 +188,14 @@ bool CQuorum::ReadContributions(CEvoDB& evoDb)
189188
}
190189

191190
CQuorumManager::CQuorumManager(CBLSWorker& _blsWorker, CChainState& chainstate, CConnman& _connman, CDKGSessionManager& _dkgManager,
192-
CEvoDB& _evoDb, CQuorumBlockProcessor& _quorumBlockProcessor, const std::unique_ptr<CMasternodeSync>& mn_sync,
193-
const std::unique_ptr<PeerManager>& peerman) :
191+
CEvoDB& _evoDb, CQuorumBlockProcessor& _quorumBlockProcessor, const std::unique_ptr<CMasternodeSync>& mn_sync) :
194192
blsWorker(_blsWorker),
195193
m_chainstate(chainstate),
196194
connman(_connman),
197195
dkgManager(_dkgManager),
198196
m_evoDb(_evoDb),
199197
quorumBlockProcessor(_quorumBlockProcessor),
200-
m_mn_sync(mn_sync),
201-
m_peerman(peerman)
198+
m_mn_sync(mn_sync)
202199
{
203200
utils::InitQuorumsCache(mapQuorumsCache, false);
204201
quorumThreadInterrupt.reset();
@@ -644,37 +641,38 @@ size_t CQuorumManager::GetQuorumRecoveryStartOffset(const CQuorumCPtr pQuorum, c
644641
return nIndex % pQuorum->qc->validMembers.size();
645642
}
646643

647-
void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv)
644+
PeerMsgRet CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv)
648645
{
649646
auto strFunc = __func__;
650-
auto errorHandler = [&](const std::string& strError, int nScore = 10) {
647+
auto errorHandler = [&](const std::string& strError, int nScore = 10) -> PeerMsgRet {
651648
LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- %s: %s, from peer=%d\n", strFunc, msg_type, strError, pfrom.GetId());
652649
if (nScore > 0) {
653-
m_peerman->Misbehaving(pfrom.GetId(), nScore);
650+
return tl::unexpected{nScore};
654651
}
652+
return {};
655653
};
656654

657655
if (msg_type == NetMsgType::QGETDATA) {
658656

659657
if (!fMasternodeMode || (pfrom.GetVerifiedProRegTxHash().IsNull() && !pfrom.qwatch)) {
660-
errorHandler("Not a verified masternode or a qwatch connection");
661-
return;
658+
return errorHandler("Not a verified masternode or a qwatch connection");
662659
}
663660

664661
CQuorumDataRequest request;
665662
vRecv >> request;
666663

667664
auto sendQDATA = [&](CQuorumDataRequest::Errors nError,
668665
bool request_limit_exceeded,
669-
const CDataStream& body = CDataStream(SER_NETWORK, PROTOCOL_VERSION)) {
666+
const CDataStream& body = CDataStream(SER_NETWORK, PROTOCOL_VERSION)) -> PeerMsgRet {
667+
PeerMsgRet ret{};
670668
switch (nError) {
671669
case (CQuorumDataRequest::Errors::NONE):
672670
case (CQuorumDataRequest::Errors::QUORUM_TYPE_INVALID):
673671
case (CQuorumDataRequest::Errors::QUORUM_BLOCK_NOT_FOUND):
674672
case (CQuorumDataRequest::Errors::QUORUM_NOT_FOUND):
675673
case (CQuorumDataRequest::Errors::MASTERNODE_IS_NO_MEMBER):
676674
case (CQuorumDataRequest::Errors::UNDEFINED):
677-
if (request_limit_exceeded) errorHandler("Request limit exceeded", 25);
675+
if (request_limit_exceeded) ret = errorHandler("Request limit exceeded", 25);
678676
break;
679677
case (CQuorumDataRequest::Errors::QUORUM_VERIFICATION_VECTOR_MISSING):
680678
case (CQuorumDataRequest::Errors::ENCRYPTED_CONTRIBUTIONS_MISSING):
@@ -684,6 +682,7 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C
684682
request.SetError(nError);
685683
CDataStream ssResponse(SER_NETWORK, pfrom.GetSendVersion(), request, body);
686684
connman.PushMessage(&pfrom, CNetMsgMaker(pfrom.GetSendVersion()).Make(NetMsgType::QDATA, ssResponse));
685+
return ret;
687686
};
688687

689688
bool request_limit_exceeded(false);
@@ -701,29 +700,25 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C
701700
}
702701

703702
if (!GetLLMQParams(request.GetLLMQType()).has_value()) {
704-
sendQDATA(CQuorumDataRequest::Errors::QUORUM_TYPE_INVALID, request_limit_exceeded);
705-
return;
703+
return sendQDATA(CQuorumDataRequest::Errors::QUORUM_TYPE_INVALID, request_limit_exceeded);
706704
}
707705

708706
const CBlockIndex* pQuorumBaseBlockIndex = WITH_LOCK(cs_main, return m_chainstate.m_blockman.LookupBlockIndex(request.GetQuorumHash()));
709707
if (pQuorumBaseBlockIndex == nullptr) {
710-
sendQDATA(CQuorumDataRequest::Errors::QUORUM_BLOCK_NOT_FOUND, request_limit_exceeded);
711-
return;
708+
return sendQDATA(CQuorumDataRequest::Errors::QUORUM_BLOCK_NOT_FOUND, request_limit_exceeded);
712709
}
713710

714711
const CQuorumCPtr pQuorum = GetQuorum(request.GetLLMQType(), pQuorumBaseBlockIndex);
715712
if (pQuorum == nullptr) {
716-
sendQDATA(CQuorumDataRequest::Errors::QUORUM_NOT_FOUND, request_limit_exceeded);
717-
return;
713+
return sendQDATA(CQuorumDataRequest::Errors::QUORUM_NOT_FOUND, request_limit_exceeded);
718714
}
719715

720716
CDataStream ssResponseData(SER_NETWORK, pfrom.GetSendVersion());
721717

722718
// Check if request wants QUORUM_VERIFICATION_VECTOR data
723719
if (request.GetDataMask() & CQuorumDataRequest::QUORUM_VERIFICATION_VECTOR) {
724720
if (!pQuorum->HasVerificationVector()) {
725-
sendQDATA(CQuorumDataRequest::Errors::QUORUM_VERIFICATION_VECTOR_MISSING, request_limit_exceeded);
726-
return;
721+
return sendQDATA(CQuorumDataRequest::Errors::QUORUM_VERIFICATION_VECTOR_MISSING, request_limit_exceeded);
727722
}
728723

729724
WITH_LOCK(pQuorum->cs, ssResponseData << *pQuorum->quorumVvec);
@@ -734,27 +729,23 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C
734729

735730
int memberIdx = pQuorum->GetMemberIndex(request.GetProTxHash());
736731
if (memberIdx == -1) {
737-
sendQDATA(CQuorumDataRequest::Errors::MASTERNODE_IS_NO_MEMBER, request_limit_exceeded);
738-
return;
732+
return sendQDATA(CQuorumDataRequest::Errors::MASTERNODE_IS_NO_MEMBER, request_limit_exceeded);
739733
}
740734

741735
std::vector<CBLSIESEncryptedObject<CBLSSecretKey>> vecEncrypted;
742736
if (!dkgManager.GetEncryptedContributions(request.GetLLMQType(), pQuorumBaseBlockIndex, pQuorum->qc->validMembers, request.GetProTxHash(), vecEncrypted)) {
743-
sendQDATA(CQuorumDataRequest::Errors::ENCRYPTED_CONTRIBUTIONS_MISSING, request_limit_exceeded);
744-
return;
737+
return sendQDATA(CQuorumDataRequest::Errors::ENCRYPTED_CONTRIBUTIONS_MISSING, request_limit_exceeded);
745738
}
746739

747740
ssResponseData << vecEncrypted;
748741
}
749742

750-
sendQDATA(CQuorumDataRequest::Errors::NONE, request_limit_exceeded, ssResponseData);
751-
return;
743+
return sendQDATA(CQuorumDataRequest::Errors::NONE, request_limit_exceeded, ssResponseData);
752744
}
753745

754746
if (msg_type == NetMsgType::QDATA) {
755747
if ((!fMasternodeMode && !utils::IsWatchQuorumsEnabled()) || pfrom.GetVerifiedProRegTxHash().IsNull()) {
756-
errorHandler("Not a verified masternode and -watchquorums is not enabled");
757-
return;
748+
return errorHandler("Not a verified masternode and -watchquorums is not enabled");
758749
}
759750

760751
CQuorumDataRequest request;
@@ -765,30 +756,25 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C
765756
const CQuorumDataRequestKey key(pfrom.GetVerifiedProRegTxHash(), true, request.GetQuorumHash(), request.GetLLMQType());
766757
auto it = mapQuorumDataRequests.find(key);
767758
if (it == mapQuorumDataRequests.end()) {
768-
errorHandler("Not requested");
769-
return;
759+
return errorHandler("Not requested");
770760
}
771761
if (it->second.IsProcessed()) {
772-
errorHandler("Already received");
773-
return;
762+
return errorHandler("Already received");
774763
}
775764
if (request != it->second) {
776-
errorHandler("Not like requested");
777-
return;
765+
return errorHandler("Not like requested");
778766
}
779767
it->second.SetProcessed();
780768
}
781769

782770
if (request.GetError() != CQuorumDataRequest::Errors::NONE) {
783-
errorHandler(strprintf("Error %d (%s)", request.GetError(), request.GetErrorString()), 0);
784-
return;
771+
return errorHandler(strprintf("Error %d (%s)", request.GetError(), request.GetErrorString()), 0);
785772
}
786773

787774
CQuorumPtr pQuorum;
788775
{
789776
if (LOCK(cs_map_quorums); !mapQuorumsCache[request.GetLLMQType()].get(request.GetQuorumHash(), pQuorum)) {
790-
errorHandler("Quorum not found", 0); // Don't bump score because we asked for it
791-
return;
777+
return errorHandler("Quorum not found", 0); // Don't bump score because we asked for it
792778
}
793779
}
794780

@@ -801,23 +787,20 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C
801787
if (pQuorum->SetVerificationVector(verificationVector)) {
802788
StartCachePopulatorThread(pQuorum);
803789
} else {
804-
errorHandler("Invalid quorum verification vector");
805-
return;
790+
return errorHandler("Invalid quorum verification vector");
806791
}
807792
}
808793

809794
// Check if request has ENCRYPTED_CONTRIBUTIONS data
810795
if (request.GetDataMask() & CQuorumDataRequest::ENCRYPTED_CONTRIBUTIONS) {
811796

812797
if (WITH_LOCK(pQuorum->cs, return pQuorum->quorumVvec->size() != size_t(pQuorum->params.threshold))) {
813-
errorHandler("No valid quorum verification vector available", 0); // Don't bump score because we asked for it
814-
return;
798+
return errorHandler("No valid quorum verification vector available", 0); // Don't bump score because we asked for it
815799
}
816800

817801
int memberIdx = pQuorum->GetMemberIndex(request.GetProTxHash());
818802
if (memberIdx == -1) {
819-
errorHandler("Not a member of the quorum", 0); // Don't bump score because we asked for it
820-
return;
803+
return errorHandler("Not a member of the quorum", 0); // Don't bump score because we asked for it
821804
}
822805

823806
std::vector<CBLSIESEncryptedObject<CBLSSecretKey>> vecEncrypted;
@@ -828,20 +811,19 @@ void CQuorumManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, C
828811
auto secret = WITH_LOCK(activeMasternodeInfoCs, return *activeMasternodeInfo.blsKeyOperator);
829812
for (const auto i : irange::range(vecEncrypted.size())) {
830813
if (!vecEncrypted[i].Decrypt(memberIdx, secret, vecSecretKeys[i], PROTOCOL_VERSION)) {
831-
errorHandler("Failed to decrypt");
832-
return;
814+
return errorHandler("Failed to decrypt");
833815
}
834816
}
835817

836818
CBLSSecretKey secretKeyShare = blsWorker.AggregateSecretKeys(vecSecretKeys);
837819
if (!pQuorum->SetSecretKeyShare(secretKeyShare)) {
838-
errorHandler("Invalid secret key share received");
839-
return;
820+
return errorHandler("Invalid secret key share received");
840821
}
841822
}
842823
pQuorum->WriteContributions(m_evoDb);
843-
return;
824+
return {};
844825
}
826+
return {};
845827
}
846828

847829
void CQuorumManager::StartCachePopulatorThread(const CQuorumCPtr pQuorum) const

src/llmq/quorums.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include <bls/bls_worker.h>
1616

1717
#include <evo/evodb.h>
18-
18+
#include <net_types.h>
1919
#include <gsl/pointers.h>
2020

2121
#include <atomic>
@@ -27,7 +27,6 @@ class CConnman;
2727
class CDeterministicMN;
2828
class CMasternodeSync;
2929
class CNode;
30-
class PeerManager;
3130

3231
using CDeterministicMNCPtr = std::shared_ptr<const CDeterministicMN>;
3332

@@ -225,7 +224,6 @@ class CQuorumManager
225224
CEvoDB& m_evoDb;
226225
CQuorumBlockProcessor& quorumBlockProcessor;
227226
const std::unique_ptr<CMasternodeSync>& m_mn_sync;
228-
const std::unique_ptr<PeerManager>& m_peerman;
229227

230228
mutable RecursiveMutex cs_map_quorums;
231229
mutable std::map<Consensus::LLMQType, unordered_lru_cache<uint256, CQuorumPtr, StaticSaltedHasher>> mapQuorumsCache GUARDED_BY(cs_map_quorums);
@@ -239,8 +237,7 @@ class CQuorumManager
239237

240238
public:
241239
CQuorumManager(CBLSWorker& _blsWorker, CChainState& chainstate, CConnman& _connman, CDKGSessionManager& _dkgManager,
242-
CEvoDB& _evoDb, CQuorumBlockProcessor& _quorumBlockProcessor, const std::unique_ptr<CMasternodeSync>& mn_sync,
243-
const std::unique_ptr<PeerManager>& peerman);
240+
CEvoDB& _evoDb, CQuorumBlockProcessor& _quorumBlockProcessor, const std::unique_ptr<CMasternodeSync>& mn_sync);
244241
~CQuorumManager() { Stop(); };
245242

246243
void Start();
@@ -250,7 +247,7 @@ class CQuorumManager
250247

251248
void UpdatedBlockTip(const CBlockIndex *pindexNew, bool fInitialDownload) const;
252249

253-
void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv);
250+
PeerMsgRet ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv);
254251

255252
static bool HasQuorum(Consensus::LLMQType llmqType, const CQuorumBlockProcessor& quorum_block_processor, const uint256& quorumHash);
256253

src/net_processing.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4354,7 +4354,7 @@ void PeerManagerImpl::ProcessMessage(
43544354
ProcessPeerMsgRet(CMNAuth::ProcessMessage(pfrom, m_connman, msg_type, vRecv), pfrom);
43554355
ProcessPeerMsgRet(m_llmq_ctx->quorum_block_processor->ProcessMessage(pfrom, msg_type, vRecv), pfrom);
43564356
m_llmq_ctx->qdkgsman->ProcessMessage(pfrom, *m_llmq_ctx->qman, msg_type, vRecv);
4357-
m_llmq_ctx->qman->ProcessMessage(pfrom, msg_type, vRecv);
4357+
ProcessPeerMsgRet(m_llmq_ctx->qman->ProcessMessage(pfrom, msg_type, vRecv), pfrom);
43584358
m_llmq_ctx->shareman->ProcessMessage(pfrom, *sporkManager, msg_type, vRecv);
43594359
m_llmq_ctx->sigman->ProcessMessage(pfrom, msg_type, vRecv);
43604360
ProcessPeerMsgRet(m_llmq_ctx->clhandler->ProcessMessage(pfrom, msg_type, vRecv), pfrom);

0 commit comments

Comments
 (0)