From c97bffcc13b9a7a24ddfd74d5dcf16b13c1daee5 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 31 May 2023 01:16:05 +0300 Subject: [PATCH] feat: use m_protxHash instead of masternodeOutpoint for hashing dsq and dstx after v19 activation --- src/coinjoin/coinjoin.cpp | 25 ++++++++++++++----------- src/coinjoin/coinjoin.h | 8 ++++---- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/coinjoin/coinjoin.cpp b/src/coinjoin/coinjoin.cpp index 237dfaeb2459..b6a9f92323ec 100644 --- a/src/coinjoin/coinjoin.cpp +++ b/src/coinjoin/coinjoin.cpp @@ -41,22 +41,22 @@ bool CCoinJoinEntry::AddScriptSig(const CTxIn& txin) return false; } -uint256 CCoinJoinQueue::GetSignatureHash() const +uint256 CCoinJoinQueue::GetSignatureHash(bool legacy) const { - return SerializeHash(*this); + int version = legacy ? COINJOIN_PROTX_HASH_PROTO_VERSION - 1 : PROTOCOL_VERSION; + return SerializeHash(*this, SER_GETHASH, version); } bool CCoinJoinQueue::Sign() { if (!fMasternodeMode) return false; - - uint256 hash = GetSignatureHash(); + bool legacy_bls_scheme = !llmq::utils::IsV19Active(::ChainActive().Tip()); + uint256 hash = GetSignatureHash(legacy_bls_scheme); CBLSSignature sig = WITH_LOCK(activeMasternodeInfoCs, return activeMasternodeInfo.blsKeyOperator->Sign(hash)); if (!sig.IsValid()) { return false; } - bool legacy_bls_scheme = !llmq::utils::IsV19Active(::ChainActive().Tip()); vchSig = sig.ToByteVector(legacy_bls_scheme); return true; @@ -64,7 +64,8 @@ bool CCoinJoinQueue::Sign() bool CCoinJoinQueue::CheckSignature(const CBLSPublicKey& blsPubKey) const { - if (!CBLSSignature(vchSig).VerifyInsecure(blsPubKey, GetSignatureHash())) { + bool legacy_bls_scheme = !llmq::utils::IsV19Active(::ChainActive().Tip()); + if (!CBLSSignature(vchSig).VerifyInsecure(blsPubKey, GetSignatureHash(legacy_bls_scheme))) { LogPrint(BCLog::COINJOIN, "CCoinJoinQueue::CheckSignature -- VerifyInsecure() failed\n"); return false; } @@ -89,21 +90,22 @@ bool CCoinJoinQueue::IsTimeOutOfBounds(int64_t current_time) const nTime - current_time > COINJOIN_QUEUE_TIMEOUT; } -uint256 CCoinJoinBroadcastTx::GetSignatureHash() const +uint256 CCoinJoinBroadcastTx::GetSignatureHash(bool legacy) const { - return SerializeHash(*this); + int version = legacy ? COINJOIN_PROTX_HASH_PROTO_VERSION - 1 : PROTOCOL_VERSION; + return SerializeHash(*this, SER_GETHASH, version); } bool CCoinJoinBroadcastTx::Sign() { if (!fMasternodeMode) return false; - uint256 hash = GetSignatureHash(); + bool legacy_bls_scheme = !llmq::utils::IsV19Active(::ChainActive().Tip()); + uint256 hash = GetSignatureHash(legacy_bls_scheme); CBLSSignature sig = WITH_LOCK(activeMasternodeInfoCs, return activeMasternodeInfo.blsKeyOperator->Sign(hash)); if (!sig.IsValid()) { return false; } - bool legacy_bls_scheme = !llmq::utils::IsV19Active(::ChainActive().Tip()); vchSig = sig.ToByteVector(legacy_bls_scheme); return true; @@ -111,7 +113,8 @@ bool CCoinJoinBroadcastTx::Sign() bool CCoinJoinBroadcastTx::CheckSignature(const CBLSPublicKey& blsPubKey) const { - if (!CBLSSignature(vchSig).VerifyInsecure(blsPubKey, GetSignatureHash())) { + bool legacy_bls_scheme = !llmq::utils::IsV19Active(::ChainActive().Tip()); + if (!CBLSSignature(vchSig).VerifyInsecure(blsPubKey, GetSignatureHash(legacy_bls_scheme))) { LogPrint(BCLog::COINJOIN, "CCoinJoinBroadcastTx::CheckSignature -- VerifyInsecure() failed\n"); return false; } diff --git a/src/coinjoin/coinjoin.h b/src/coinjoin/coinjoin.h index 538e7011fab3..2131c32d30d9 100644 --- a/src/coinjoin/coinjoin.h +++ b/src/coinjoin/coinjoin.h @@ -219,7 +219,7 @@ class CCoinJoinQueue { READWRITE(obj.nDenom); - if (s.GetVersion() < COINJOIN_PROTX_HASH_PROTO_VERSION || (s.GetType() & SER_GETHASH)) { + if (s.GetVersion() < COINJOIN_PROTX_HASH_PROTO_VERSION) { READWRITE(obj.masternodeOutpoint); } else { READWRITE(obj.m_protxHash); @@ -230,7 +230,7 @@ class CCoinJoinQueue } } - [[nodiscard]] uint256 GetSignatureHash() const; + [[nodiscard]] uint256 GetSignatureHash(bool legacy) const; /** Sign this mixing transaction * return true if all conditions are met: * 1) we have an active Masternode, @@ -292,7 +292,7 @@ class CCoinJoinBroadcastTx { READWRITE(obj.tx); - if (s.GetVersion() < COINJOIN_PROTX_HASH_PROTO_VERSION || (s.GetType() & SER_GETHASH)) { + if (s.GetVersion() < COINJOIN_PROTX_HASH_PROTO_VERSION) { READWRITE(obj.masternodeOutpoint); } else { READWRITE(obj.m_protxHash); @@ -317,7 +317,7 @@ class CCoinJoinBroadcastTx return *this != CCoinJoinBroadcastTx(); } - [[nodiscard]] uint256 GetSignatureHash() const; + [[nodiscard]] uint256 GetSignatureHash(bool legacy) const; bool Sign(); [[nodiscard]] bool CheckSignature(const CBLSPublicKey& blsPubKey) const;