From b5ae437ca7967fe68b9c44aa1b7ac689218abb2e Mon Sep 17 00:00:00 2001 From: Odysseas Gabrielides Date: Tue, 26 Jul 2022 23:31:03 +0300 Subject: [PATCH 1/2] fix!: Fix on QuorumDataRequests and refactoring (#4937) * qdata typo fixes and refactoring * code style fix * Add LOCK2 back Co-authored-by: UdjinM6 --- src/llmq/quorums.cpp | 44 ++++++++++++++++++++++++++------------------ src/llmq/quorums.h | 31 +++++++++++++++++++++++++++++++ src/saltedhasher.h | 14 -------------- 3 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/llmq/quorums.cpp b/src/llmq/quorums.cpp index c8f9dc19aeaf5..9fdd25930bb13 100644 --- a/src/llmq/quorums.cpp +++ b/src/llmq/quorums.cpp @@ -32,10 +32,7 @@ static const std::string DB_QUORUM_QUORUM_VVEC = "q_Qqvvec"; CQuorumManager* quorumManager; CCriticalSection cs_data_requests; -//key = -//TODO: Document purpose of bool -using key_t = std::tuple; -static std::unordered_map mapQuorumDataRequests GUARDED_BY(cs_data_requests); +static std::unordered_map mapQuorumDataRequests GUARDED_BY(cs_data_requests); static uint256 MakeQuorumKey(const CQuorum& q) { @@ -436,8 +433,11 @@ bool CQuorumManager::RequestQuorumData(CNode* pFrom, Consensus::LLMQType llmqTyp } LOCK(cs_data_requests); - auto quorumHash = pQuorumBaseBlockIndex->GetBlockHash(); - auto key = std::make_tuple(pFrom->GetVerifiedProRegTxHash(), true, quorumHash, (uint8_t)llmqType); + CQuorumDataRequestKey key; + key.proRegTx = pFrom->GetVerifiedProRegTxHash(); + key.flag = true; + key.quorumHash = pQuorumBaseBlockIndex->GetBlockHash(); + key.llmqType = llmqType; auto it = mapQuorumDataRequests.emplace(key, CQuorumDataRequest(llmqType, pQuorumBaseBlockIndex->GetBlockHash(), nDataMask, proTxHash)); if (!it.second && !it.first->second.IsExpired()) { LogPrint(BCLog::LLMQ, "CQuorumManager::%s -- Already requested\n", __func__); @@ -588,9 +588,11 @@ void CQuorumManager::ProcessMessage(CNode* pFrom, const std::string& msg_type, C { LOCK2(cs_main, cs_data_requests); - auto quorumHash = request.GetQuorumHash(); - auto llmqType = (uint8_t) request.GetLLMQType(); - auto key = std::make_tuple(pFrom->GetVerifiedProRegTxHash(), false, quorumHash, llmqType); + CQuorumDataRequestKey key; + key.proRegTx = pFrom->GetVerifiedProRegTxHash(); + key.flag = false; + key.quorumHash = request.GetQuorumHash(); + key.llmqType = request.GetLLMQType(); auto it = mapQuorumDataRequests.find(key); if (it == mapQuorumDataRequests.end()) { it = mapQuorumDataRequests.emplace(key, request).first; @@ -663,9 +665,11 @@ void CQuorumManager::ProcessMessage(CNode* pFrom, const std::string& msg_type, C { LOCK2(cs_main, cs_data_requests); - auto quorumHash = request.GetQuorumHash(); - auto llmqType = (uint8_t) request.GetLLMQType(); - auto key = std::make_tuple(pFrom->GetVerifiedProRegTxHash(), true, quorumHash, llmqType); + CQuorumDataRequestKey key; + key.proRegTx = pFrom->GetVerifiedProRegTxHash(); + key.flag = true; + key.quorumHash = request.GetQuorumHash(); + key.llmqType = request.GetLLMQType(); auto it = mapQuorumDataRequests.find(key); if (it == mapQuorumDataRequests.end()) { errorHandler("Not requested"); @@ -838,9 +842,11 @@ void CQuorumManager::StartQuorumDataRecoveryThread(const CQuorumCPtr pQuorum, co pCurrentMemberHash = &vecMemberHashes[(nMyStartOffset + nTries++) % vecMemberHashes.size()]; { LOCK(cs_data_requests); - auto quorumHash = pQuorum->qc->quorumHash; - auto llmqType = (uint8_t)pQuorum->qc->quorumIndex; - auto key = std::make_tuple(*pCurrentMemberHash, true, quorumHash, (uint8_t)llmqType); + CQuorumDataRequestKey key; + key.proRegTx = *pCurrentMemberHash; + key.flag = true; + key.quorumHash = pQuorum->qc->quorumHash; + key.llmqType = pQuorum->qc->llmqType; auto it = mapQuorumDataRequests.find(key); if (it != mapQuorumDataRequests.end() && !it->second.IsExpired()) { printLog("Already asked"); @@ -866,9 +872,11 @@ void CQuorumManager::StartQuorumDataRecoveryThread(const CQuorumCPtr pQuorum, co printLog("Requested"); } else { LOCK(cs_data_requests); - auto quorumHash = pQuorum->qc->quorumHash; - auto llmqType = (uint8_t)pQuorum->qc->quorumIndex; - auto key = std::make_tuple(*pCurrentMemberHash, true, quorumHash, (uint8_t)llmqType); + CQuorumDataRequestKey key; + key.proRegTx = *pCurrentMemberHash; + key.flag = true; + key.quorumHash = pQuorum->qc->quorumHash; + key.llmqType = pQuorum->qc->llmqType; auto it = mapQuorumDataRequests.find(key); if (it == mapQuorumDataRequests.end()) { printLog("Failed"); diff --git a/src/llmq/quorums.h b/src/llmq/quorums.h index 47871ae0e7c1d..588070598f723 100644 --- a/src/llmq/quorums.h +++ b/src/llmq/quorums.h @@ -32,6 +32,22 @@ class CDKGSessionManager; // If true, we will connect to all new quorums and watch their communication static constexpr bool DEFAULT_WATCH_QUORUMS{false}; +/** + * Object used as a key to store CQuorumDataRequest + */ +struct CQuorumDataRequestKey +{ + uint256 proRegTx; + //TODO: Investigate purpose of this flag and rename accordingly + bool flag; + uint256 quorumHash; + Consensus::LLMQType llmqType; + + bool operator ==(const CQuorumDataRequestKey& obj) const + { + return (proRegTx == obj.proRegTx && flag == obj.flag && quorumHash == obj.quorumHash && llmqType == obj.llmqType); + } +}; /** * An object of this class represents a QGETDATA request or a QDATA response header @@ -243,6 +259,21 @@ extern CQuorumManager* quorumManager; } // namespace llmq +template struct SaltedHasherImpl; +template<> +struct SaltedHasherImpl +{ + static std::size_t CalcHash(const llmq::CQuorumDataRequestKey& v, uint64_t k0, uint64_t k1) + { + CSipHasher c(k0, k1); + c.Write((unsigned char*)&(v.proRegTx), sizeof(v.proRegTx)); + c.Write((unsigned char*)&(v.flag), sizeof(v.flag)); + c.Write((unsigned char*)&(v.quorumHash), sizeof(v.quorumHash)); + c.Write((unsigned char*)&(v.llmqType), sizeof(v.llmqType)); + return c.Finalize(); + } +}; + template<> struct is_serializable_enum : std::true_type {}; #endif // BITCOIN_LLMQ_QUORUMS_H diff --git a/src/saltedhasher.h b/src/saltedhasher.h index 6bac979e4188b..aeeb16195ed8d 100644 --- a/src/saltedhasher.h +++ b/src/saltedhasher.h @@ -13,20 +13,6 @@ template struct SaltedHasherImpl; -template -struct SaltedHasherImpl> -{ - static std::size_t CalcHash(const std::tuple& v, uint64_t k0, uint64_t k1) - { - CSipHasher c(k0, k1); - c.Write((unsigned char*)&std::get<0>(v), sizeof(M)); - c.Write((unsigned char*)&std::get<1>(v), sizeof(N)); - c.Write((unsigned char*)&std::get<2>(v), sizeof(K)); - c.Write((unsigned char*)&std::get<3>(v), sizeof(Q)); - return c.Finalize(); - } -}; - template struct SaltedHasherImpl> { From d238549dd0f15faddb05e7f70c5996c2e164d59a Mon Sep 17 00:00:00 2001 From: pasta Date: Tue, 26 Jul 2022 15:32:10 -0500 Subject: [PATCH 2/2] chore: bump rc to 11 --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 79cf1586db3dc..6d379ebb8b516 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 18) define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_BUILD, 0) -define(_CLIENT_VERSION_RC, 10) +define(_CLIENT_VERSION_RC, 11) define(_CLIENT_VERSION_IS_RELEASE, false) define(_COPYRIGHT_YEAR, 2022) define(_COPYRIGHT_HOLDERS,[The %s developers])