diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -235,8 +235,9 @@ } virtual void BlockConnected(const CBlock &block, - const std::vector &tx_conflicted) {} - virtual void BlockDisconnected(const CBlock &block) {} + const std::vector &tx_conflicted, + int height) {} + virtual void BlockDisconnected(const CBlock &block, int height) {} virtual void UpdatedBlockTip() {} virtual void ChainStateFlushed(const CBlockLocator &locator) {} }; diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -165,11 +165,12 @@ const std::shared_ptr &block, const CBlockIndex *index, const std::vector &tx_conflicted) override { - m_notifications->BlockConnected(*block, tx_conflicted); + m_notifications->BlockConnected(*block, tx_conflicted, + index->nHeight); } - void - BlockDisconnected(const std::shared_ptr &block) override { - m_notifications->BlockDisconnected(*block); + void BlockDisconnected(const std::shared_ptr &block, + const CBlockIndex *index) override { + m_notifications->BlockDisconnected(*block, index->nHeight); } void UpdatedBlockTip(const CBlockIndex *index, const CBlockIndex *fork_index, diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp --- a/src/test/validation_block_tests.cpp +++ b/src/test/validation_block_tests.cpp @@ -42,9 +42,10 @@ m_expected_tip = block->GetHash(); } - void - BlockDisconnected(const std::shared_ptr &block) override { + void BlockDisconnected(const std::shared_ptr &block, + const CBlockIndex *pindex) override { BOOST_CHECK_EQUAL(m_expected_tip, block->GetHash()); + BOOST_CHECK_EQUAL(m_expected_tip, pindex->GetBlockHash()); m_expected_tip = block->hashPrevBlock; } diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2165,7 +2165,7 @@ UpdateTip(params, pindexDelete->pprev); // Let wallets know transactions went from 1-confirmed to // 0-confirmed or conflicted: - GetMainSignals().BlockDisconnected(pblock); + GetMainSignals().BlockDisconnected(pblock, pindexDelete); return true; } diff --git a/src/validationinterface.h b/src/validationinterface.h --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -128,8 +128,8 @@ * * Called on a background thread. */ - virtual void BlockDisconnected(const std::shared_ptr &block) { - } + virtual void BlockDisconnected(const std::shared_ptr &block, + const CBlockIndex *pindex) {} /** * Notifies listeners of the new active block chain on-disk. * @@ -200,7 +200,8 @@ BlockConnected(const std::shared_ptr &, const CBlockIndex *pindex, const std::shared_ptr> &); - void BlockDisconnected(const std::shared_ptr &); + void BlockDisconnected(const std::shared_ptr &, + const CBlockIndex *pindex); void ChainStateFlushed(const CBlockLocator &); void BlockChecked(const CBlock &, const BlockValidationState &); void NewPoWValidBlock(const CBlockIndex *, diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -235,12 +235,10 @@ } void CMainSignals::BlockDisconnected( - const std::shared_ptr &pblock) { - // TODO: This function was refactored as part of an out-of-order backport - // of https://github.com/bitcoin/bitcoin/pull/16688 - auto event = [pblock, this] { + const std::shared_ptr &pblock, const CBlockIndex *pindex) { + auto event = [pblock, pindex, this] { m_internals->Iterate([&](CValidationInterface &callbacks) { - callbacks.BlockDisconnected(pblock); + callbacks.BlockDisconnected(pblock, pindex); }); }; ENQUEUE_AND_LOG_EVENT(event, "%s: block hash=%s", __func__, diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -984,10 +984,10 @@ bool AddToWallet(const CWalletTx &wtxIn, bool fFlushOnClose = true); void LoadToWallet(CWalletTx &wtxIn) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); void TransactionAddedToMempool(const CTransactionRef &tx) override; - void - BlockConnected(const CBlock &block, - const std::vector &vtxConflicted) override; - void BlockDisconnected(const CBlock &block) override; + void BlockConnected(const CBlock &block, + const std::vector &vtxConflicted, + int height) override; + void BlockDisconnected(const CBlock &block, int height) override; void UpdatedBlockTip() override; int64_t RescanFromTime(int64_t startTime, const WalletRescanReserver &reserver, bool update); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1135,8 +1135,9 @@ } } -void CWallet::BlockConnected( - const CBlock &block, const std::vector &vtxConflicted) { +void CWallet::BlockConnected(const CBlock &block, + const std::vector &vtxConflicted, + int height) { const BlockHash &block_hash = block.GetHash(); auto locked_chain = chain().lock(); LOCK(cs_wallet); @@ -1153,7 +1154,7 @@ m_last_block_processed = block_hash; } -void CWallet::BlockDisconnected(const CBlock &block) { +void CWallet::BlockDisconnected(const CBlock &block, int height) { auto locked_chain = chain().lock(); LOCK(cs_wallet); diff --git a/src/zmq/zmqnotificationinterface.h b/src/zmq/zmqnotificationinterface.h --- a/src/zmq/zmqnotificationinterface.h +++ b/src/zmq/zmqnotificationinterface.h @@ -30,8 +30,8 @@ BlockConnected(const std::shared_ptr &pblock, const CBlockIndex *pindexConnected, const std::vector &vtxConflicted) override; - void - BlockDisconnected(const std::shared_ptr &pblock) override; + void BlockDisconnected(const std::shared_ptr &pblock, + const CBlockIndex *pindexDisconnected) override; void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override; diff --git a/src/zmq/zmqnotificationinterface.cpp b/src/zmq/zmqnotificationinterface.cpp --- a/src/zmq/zmqnotificationinterface.cpp +++ b/src/zmq/zmqnotificationinterface.cpp @@ -177,7 +177,8 @@ } void CZMQNotificationInterface::BlockDisconnected( - const std::shared_ptr &pblock) { + const std::shared_ptr &pblock, + const CBlockIndex *pindexDisconnected) { for (const CTransactionRef &ptx : pblock->vtx) { // Do a normal notify for each transaction removed in block // disconnection