From 955452b0ac536841c5108edf2cc6056530c2ecc3 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 25 Dec 2021 13:46:42 +0300 Subject: [PATCH 1/3] Drop all conflicting tx locks in ConnectBlock --- src/validation.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index fbb178b2eadb..8083450e4994 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2307,9 +2307,12 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl continue; } if (llmq::chainLocksHandler->HasChainLock(pindex->nHeight, pindex->GetBlockHash())) { - LogPrint(BCLog::ALL, "ConnectBlock(DASH): chain-locked transaction %s overrides islock %s\n", tx->GetHash().ToString(), ::SerializeHash(*conflictLock).ToString()); - llmq::quorumInstantSendManager->RemoveConflictingLock(::SerializeHash(*conflictLock), *conflictLock); - assert(llmq::quorumInstantSendManager->GetConflictingLock(*tx) == nullptr); + // There might be multiple conflicting locks, drop them all + do { + LogPrint(BCLog::ALL, "ConnectBlock(DASH): chain-locked transaction %s overrides islock %s\n", tx->GetHash().ToString(), ::SerializeHash(*conflictLock).ToString()); + llmq::quorumInstantSendManager->RemoveConflictingLock(::SerializeHash(*conflictLock), *conflictLock); + conflictLock = llmq::quorumInstantSendManager->GetConflictingLock(*tx); + } while (conflictLock); } else { // The node which relayed this should switch to correct chain. // TODO: relay instantsend data/proof. From 47ef2f50ff146f2045a4dc3ddd5bf66bc2ec5be4 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Tue, 4 Jan 2022 18:33:00 +0300 Subject: [PATCH 2/3] apply suggestions --- src/validation.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 8083450e4994..93260e5e076d 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2302,22 +2302,16 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl for (const auto& tx : block.vtx) { // skip txes that have no inputs if (tx->vin.empty()) continue; - llmq::CInstantSendLockPtr conflictLock = llmq::quorumInstantSendManager->GetConflictingLock(*tx); - if (!conflictLock) { - continue; - } - if (llmq::chainLocksHandler->HasChainLock(pindex->nHeight, pindex->GetBlockHash())) { - // There might be multiple conflicting locks, drop them all - do { - LogPrint(BCLog::ALL, "ConnectBlock(DASH): chain-locked transaction %s overrides islock %s\n", tx->GetHash().ToString(), ::SerializeHash(*conflictLock).ToString()); + while (llmq::CInstantSendLockPtr conflictLock = llmq::quorumInstantSendManager->GetConflictingLock(*tx)) { + if (llmq::chainLocksHandler->HasChainLock(pindex->nHeight, pindex->GetBlockHash())) { + LogPrint(BCLog::ALL, "ConnectBlock(DASH): chain-locked transaction %s overrides islock %s\n", + tx->GetHash().ToString(), ::SerializeHash(*conflictLock).ToString()); llmq::quorumInstantSendManager->RemoveConflictingLock(::SerializeHash(*conflictLock), *conflictLock); - conflictLock = llmq::quorumInstantSendManager->GetConflictingLock(*tx); - } while (conflictLock); - } else { - // The node which relayed this should switch to correct chain. - // TODO: relay instantsend data/proof. - return state.DoS(10, error("ConnectBlock(DASH): transaction %s conflicts with transaction lock %s", tx->GetHash().ToString(), conflictLock->txid.ToString()), - REJECT_INVALID, "conflict-tx-lock"); + } else { + // The node which relayed this should switch to correct chain. + // TODO: relay instantsend data/proof. + return state.DoS(10, error("ConnectBlock(DASH): transaction %s conflicts with transaction lock %s", + tx->GetHash().ToString(), conflictLock->txid.ToString()), REJECT_INVALID, "conflict-tx-lock"); } } } From 5c2e64980376422922d8ef1d4eb13c086baf43fa Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Tue, 4 Jan 2022 19:17:48 +0300 Subject: [PATCH 3/3] fix :see_no_evil: --- src/validation.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/validation.cpp b/src/validation.cpp index 93260e5e076d..1c20b724ca3e 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2312,6 +2312,7 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl // TODO: relay instantsend data/proof. return state.DoS(10, error("ConnectBlock(DASH): transaction %s conflicts with transaction lock %s", tx->GetHash().ToString(), conflictLock->txid.ToString()), REJECT_INVALID, "conflict-tx-lock"); + } } } }