From 208406df71c1c3e00e8e07b84320795eefe32ca4 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Fri, 5 Apr 2019 06:55:30 +0300 Subject: [PATCH] Re-introduce nInstantSendKeepLock check for LLMQ-based IS when spork19 is OFF (#2829) --- src/dsnotificationinterface.cpp | 1 + src/llmq/quorums_instantsend.cpp | 17 +++++++++++++++++ src/llmq/quorums_instantsend.h | 1 + 3 files changed, 19 insertions(+) diff --git a/src/dsnotificationinterface.cpp b/src/dsnotificationinterface.cpp index b1aa110b3b051..3c1857df23486 100644 --- a/src/dsnotificationinterface.cpp +++ b/src/dsnotificationinterface.cpp @@ -60,6 +60,7 @@ void CDSNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindexNew, con if (fLiteMode) return; + llmq::quorumInstantSendManager->UpdatedBlockTip(pindexNew); llmq::chainLocksHandler->UpdatedBlockTip(pindexNew, pindexFork); CPrivateSend::UpdatedBlockTip(pindexNew); diff --git a/src/llmq/quorums_instantsend.cpp b/src/llmq/quorums_instantsend.cpp index 24ed8ffe59a76..b04dc44103323 100644 --- a/src/llmq/quorums_instantsend.cpp +++ b/src/llmq/quorums_instantsend.cpp @@ -798,6 +798,23 @@ void CInstantSendManager::NotifyChainLock(const CBlockIndex* pindexChainLock) RetryLockTxs(uint256()); } +void CInstantSendManager::UpdatedBlockTip(const CBlockIndex* pindexNew) +{ + if (sporkManager.IsSporkActive(SPORK_19_CHAINLOCKS_ENABLED)) { + // Nothing to do here. We should keep all islocks and let chainlocks handle them. + return; + } + + int nChainLockMinHeight = pindexNew->nHeight - Params().GetConsensus().nInstantSendKeepLock; + const CBlockIndex* pindex = pindexNew->GetAncestor(nChainLockMinHeight); + + if (pindex) { + // Pretend it was chainlocked at nChainLockMinHeight. + // This effectively drops all islocks below nChainLockMinHeight. + NotifyChainLock(pindex); + } +} + void CInstantSendManager::RemoveFinalISLock(const uint256& hash, const CInstantSendLockPtr& islock) { AssertLockHeld(cs); diff --git a/src/llmq/quorums_instantsend.h b/src/llmq/quorums_instantsend.h index 8b2ab2e074b4a..3254595fdf651 100644 --- a/src/llmq/quorums_instantsend.h +++ b/src/llmq/quorums_instantsend.h @@ -122,6 +122,7 @@ class CInstantSendManager : public CRecoveredSigsListener void SyncTransaction(const CTransaction &tx, const CBlockIndex *pindex, int posInBlock); void NotifyChainLock(const CBlockIndex* pindexChainLock); + void UpdatedBlockTip(const CBlockIndex* pindexNew); void RemoveFinalISLock(const uint256& hash, const CInstantSendLockPtr& islock); void RemoveMempoolConflictsForLock(const uint256& hash, const CInstantSendLock& islock);