mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-03 09:56:38 -05:00
Merge #17477: Remove the mempool's NotifyEntryAdded and NotifyEntryRemoved signals
e57980b473
[mempool] Remove NotifyEntryAdded and NotifyEntryRemoved callbacks (John Newbery)2dd561f361
[validation] Remove pool member from ConnectTrace (John Newbery)969b65f3f5
[validation] Remove NotifyEntryRemoved callback from ConnectTrace (John Newbery)5613f9842b
[validation] Remove conflictedTxs from PerBlockConnectTrace (John Newbery)cdb893443c
[validation interface] Remove vtxConflicted from BlockConnected (John Newbery)1168394d75
[wallet] Notify conflicted transactions in TransactionRemovedFromMempool (John Newbery) Pull request description: These boost signals were added in #9371, before we had a `TransactionRemovedFromMempool` method in the validation interface. The `NotifyEntryAdded` callback was used by validation to build a vector of conflicted transactions when connecting a block, which the wallet was notified of in the `BlockConnected` CValidationInterface callback. Now that we have a `TransactionRemovedFromMempool` callback, we can fire that signal directly from the mempool for conflicted transactions. Note that #9371 was implemented to ensure `-walletnotify` events were fired for these conflicted transaction. We inadvertently stopped sending these notifications in #16624 (Sep 2019 commit7e89994
). We should probably fix that, but in a different PR. ACKs for top commit: jonatack: Re-ACKe57980b
ryanofsky: Code review ACKe57980b473
, no code changes since previous review, but helpful new code comments have been added and the PR description is now more clear about where the old code came from Tree-SHA512: 3bdbaf1ef2731e788462d4756e69c42a1efdcf168691ce1bbfdaa4b7b55ac3c5b1fd4ab7b90bcdec653703600501b4224d252cfc086aef28f9ce0da3b0563a69
This commit is contained in:
commit
312d27b11c
18 changed files with 58 additions and 65 deletions
|
@ -188,8 +188,7 @@ bool BaseIndex::Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_ti
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseIndex::BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex,
|
void BaseIndex::BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex)
|
||||||
const std::vector<CTransactionRef>& txn_conflicted)
|
|
||||||
{
|
{
|
||||||
if (!m_synced) {
|
if (!m_synced) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -64,8 +64,7 @@ private:
|
||||||
bool Commit();
|
bool Commit();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex,
|
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex) override;
|
||||||
const std::vector<CTransactionRef>& txn_conflicted) override;
|
|
||||||
|
|
||||||
void ChainStateFlushed(const CBlockLocator& locator) override;
|
void ChainStateFlushed(const CBlockLocator& locator) override;
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
#include <boost/algorithm/string/classification.hpp>
|
#include <boost/algorithm/string/classification.hpp>
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
#include <boost/algorithm/string/split.hpp>
|
#include <boost/algorithm/string/split.hpp>
|
||||||
|
#include <boost/signals2/signal.hpp>
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
|
|
||||||
#if ENABLE_ZMQ
|
#if ENABLE_ZMQ
|
||||||
|
|
|
@ -172,11 +172,9 @@ public:
|
||||||
{
|
{
|
||||||
m_notifications->TransactionRemovedFromMempool(tx);
|
m_notifications->TransactionRemovedFromMempool(tx);
|
||||||
}
|
}
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& block,
|
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
||||||
const CBlockIndex* index,
|
|
||||||
const std::vector<CTransactionRef>& tx_conflicted) override
|
|
||||||
{
|
{
|
||||||
m_notifications->BlockConnected(*block, tx_conflicted, index->nHeight);
|
m_notifications->BlockConnected(*block, index->nHeight);
|
||||||
}
|
}
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
void BlockDisconnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
|
||||||
{
|
{
|
||||||
|
|
|
@ -219,7 +219,7 @@ public:
|
||||||
virtual ~Notifications() {}
|
virtual ~Notifications() {}
|
||||||
virtual void TransactionAddedToMempool(const CTransactionRef& tx) {}
|
virtual void TransactionAddedToMempool(const CTransactionRef& tx) {}
|
||||||
virtual void TransactionRemovedFromMempool(const CTransactionRef& ptx) {}
|
virtual void TransactionRemovedFromMempool(const CTransactionRef& ptx) {}
|
||||||
virtual void BlockConnected(const CBlock& block, const std::vector<CTransactionRef>& tx_conflicted, int height) {}
|
virtual void BlockConnected(const CBlock& block, int height) {}
|
||||||
virtual void BlockDisconnected(const CBlock& block, int height) {}
|
virtual void BlockDisconnected(const CBlock& block, int height) {}
|
||||||
virtual void UpdatedBlockTip() {}
|
virtual void UpdatedBlockTip() {}
|
||||||
virtual void ChainStateFlushed(const CBlockLocator& locator) {}
|
virtual void ChainStateFlushed(const CBlockLocator& locator) {}
|
||||||
|
|
|
@ -37,6 +37,8 @@
|
||||||
|
|
||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
|
|
||||||
|
#include <boost/signals2/signal.hpp>
|
||||||
|
|
||||||
class CWallet;
|
class CWallet;
|
||||||
fs::path GetWalletDir();
|
fs::path GetWalletDir();
|
||||||
std::vector<fs::path> ListWalletDir();
|
std::vector<fs::path> ListWalletDir();
|
||||||
|
|
|
@ -1134,7 +1134,7 @@ PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, BanMan* banman, CS
|
||||||
* Evict orphan txn pool entries (EraseOrphanTx) based on a newly connected
|
* Evict orphan txn pool entries (EraseOrphanTx) based on a newly connected
|
||||||
* block. Also save the time of the last tip update.
|
* block. Also save the time of the last tip update.
|
||||||
*/
|
*/
|
||||||
void PeerLogicValidation::BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex, const std::vector<CTransactionRef>& vtxConflicted)
|
void PeerLogicValidation::BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
LOCK(g_cs_orphans);
|
LOCK(g_cs_orphans);
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Overridden from CValidationInterface.
|
* Overridden from CValidationInterface.
|
||||||
*/
|
*/
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected, const std::vector<CTransactionRef>& vtxConflicted) override;
|
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override;
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex* pindex) override;
|
void BlockDisconnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex* pindex) override;
|
||||||
/**
|
/**
|
||||||
* Overridden from CValidationInterface.
|
* Overridden from CValidationInterface.
|
||||||
|
|
|
@ -42,7 +42,7 @@ struct TestSubscriber : public CValidationInterface {
|
||||||
BOOST_CHECK_EQUAL(m_expected_tip, pindexNew->GetBlockHash());
|
BOOST_CHECK_EQUAL(m_expected_tip, pindexNew->GetBlockHash());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex, const std::vector<CTransactionRef>& txnConflicted) override
|
void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex) override
|
||||||
{
|
{
|
||||||
BOOST_CHECK_EQUAL(m_expected_tip, block->hashPrevBlock);
|
BOOST_CHECK_EQUAL(m_expected_tip, block->hashPrevBlock);
|
||||||
BOOST_CHECK_EQUAL(m_expected_tip, pindex->pprev->GetBlockHash());
|
BOOST_CHECK_EQUAL(m_expected_tip, pindex->pprev->GetBlockHash());
|
||||||
|
|
|
@ -355,7 +355,6 @@ void CTxMemPool::AddTransactionsUpdated(unsigned int n)
|
||||||
|
|
||||||
void CTxMemPool::addUnchecked(const CTxMemPoolEntry &entry, setEntries &setAncestors, bool validFeeEstimate)
|
void CTxMemPool::addUnchecked(const CTxMemPoolEntry &entry, setEntries &setAncestors, bool validFeeEstimate)
|
||||||
{
|
{
|
||||||
NotifyEntryAdded(entry.GetSharedTx());
|
|
||||||
// Add to memory pool without checking anything.
|
// Add to memory pool without checking anything.
|
||||||
// Used by AcceptToMemoryPool(), which DOES do
|
// Used by AcceptToMemoryPool(), which DOES do
|
||||||
// all the appropriate checks.
|
// all the appropriate checks.
|
||||||
|
@ -406,10 +405,12 @@ void CTxMemPool::addUnchecked(const CTxMemPoolEntry &entry, setEntries &setAnces
|
||||||
|
|
||||||
void CTxMemPool::removeUnchecked(txiter it, MemPoolRemovalReason reason)
|
void CTxMemPool::removeUnchecked(txiter it, MemPoolRemovalReason reason)
|
||||||
{
|
{
|
||||||
CTransactionRef ptx = it->GetSharedTx();
|
if (reason != MemPoolRemovalReason::BLOCK) {
|
||||||
NotifyEntryRemoved(ptx, reason);
|
// Notify clients that a transaction has been removed from the mempool
|
||||||
if (reason != MemPoolRemovalReason::BLOCK && reason != MemPoolRemovalReason::CONFLICT) {
|
// for any reason except being included in a block. Clients interested
|
||||||
GetMainSignals().TransactionRemovedFromMempool(ptx);
|
// in transactions included in blocks can subscribe to the BlockConnected
|
||||||
|
// notification.
|
||||||
|
GetMainSignals().TransactionRemovedFromMempool(it->GetSharedTx());
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint256 hash = it->GetTx().GetHash();
|
const uint256 hash = it->GetTx().GetHash();
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include <boost/multi_index/hashed_index.hpp>
|
#include <boost/multi_index/hashed_index.hpp>
|
||||||
#include <boost/multi_index/ordered_index.hpp>
|
#include <boost/multi_index/ordered_index.hpp>
|
||||||
#include <boost/multi_index/sequenced_index.hpp>
|
#include <boost/multi_index/sequenced_index.hpp>
|
||||||
#include <boost/signals2/signal.hpp>
|
|
||||||
|
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
extern RecursiveMutex cs_main;
|
extern RecursiveMutex cs_main;
|
||||||
|
@ -699,9 +698,6 @@ public:
|
||||||
|
|
||||||
size_t DynamicMemoryUsage() const;
|
size_t DynamicMemoryUsage() const;
|
||||||
|
|
||||||
boost::signals2::signal<void (CTransactionRef)> NotifyEntryAdded;
|
|
||||||
boost::signals2::signal<void (CTransactionRef, MemPoolRemovalReason)> NotifyEntryRemoved;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** UpdateForDescendants is used by UpdateTransactionsFromBlock to update
|
/** UpdateForDescendants is used by UpdateTransactionsFromBlock to update
|
||||||
* the descendants for a single transaction that has been added to the
|
* the descendants for a single transaction that has been added to the
|
||||||
|
|
|
@ -2504,35 +2504,21 @@ static int64_t nTimePostConnect = 0;
|
||||||
struct PerBlockConnectTrace {
|
struct PerBlockConnectTrace {
|
||||||
CBlockIndex* pindex = nullptr;
|
CBlockIndex* pindex = nullptr;
|
||||||
std::shared_ptr<const CBlock> pblock;
|
std::shared_ptr<const CBlock> pblock;
|
||||||
std::shared_ptr<std::vector<CTransactionRef>> conflictedTxs;
|
PerBlockConnectTrace() {}
|
||||||
PerBlockConnectTrace() : conflictedTxs(std::make_shared<std::vector<CTransactionRef>>()) {}
|
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* Used to track blocks whose transactions were applied to the UTXO state as a
|
* Used to track blocks whose transactions were applied to the UTXO state as a
|
||||||
* part of a single ActivateBestChainStep call.
|
* part of a single ActivateBestChainStep call.
|
||||||
*
|
*
|
||||||
* This class also tracks transactions that are removed from the mempool as
|
|
||||||
* conflicts (per block) and can be used to pass all those transactions
|
|
||||||
* through SyncTransaction.
|
|
||||||
*
|
|
||||||
* This class assumes (and asserts) that the conflicted transactions for a given
|
|
||||||
* block are added via mempool callbacks prior to the BlockConnected() associated
|
|
||||||
* with those transactions. If any transactions are marked conflicted, it is
|
|
||||||
* assumed that an associated block will always be added.
|
|
||||||
*
|
|
||||||
* This class is single-use, once you call GetBlocksConnected() you have to throw
|
* This class is single-use, once you call GetBlocksConnected() you have to throw
|
||||||
* it away and make a new one.
|
* it away and make a new one.
|
||||||
*/
|
*/
|
||||||
class ConnectTrace {
|
class ConnectTrace {
|
||||||
private:
|
private:
|
||||||
std::vector<PerBlockConnectTrace> blocksConnected;
|
std::vector<PerBlockConnectTrace> blocksConnected;
|
||||||
CTxMemPool &pool;
|
|
||||||
boost::signals2::scoped_connection m_connNotifyEntryRemoved;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ConnectTrace(CTxMemPool &_pool) : blocksConnected(1), pool(_pool) {
|
explicit ConnectTrace() : blocksConnected(1) {}
|
||||||
m_connNotifyEntryRemoved = pool.NotifyEntryRemoved.connect(std::bind(&ConnectTrace::NotifyEntryRemoved, this, std::placeholders::_1, std::placeholders::_2));
|
|
||||||
}
|
|
||||||
|
|
||||||
void BlockConnected(CBlockIndex* pindex, std::shared_ptr<const CBlock> pblock) {
|
void BlockConnected(CBlockIndex* pindex, std::shared_ptr<const CBlock> pblock) {
|
||||||
assert(!blocksConnected.back().pindex);
|
assert(!blocksConnected.back().pindex);
|
||||||
|
@ -2550,17 +2536,9 @@ public:
|
||||||
// one waiting for the transactions from the next block. We pop
|
// one waiting for the transactions from the next block. We pop
|
||||||
// the last entry here to make sure the list we return is sane.
|
// the last entry here to make sure the list we return is sane.
|
||||||
assert(!blocksConnected.back().pindex);
|
assert(!blocksConnected.back().pindex);
|
||||||
assert(blocksConnected.back().conflictedTxs->empty());
|
|
||||||
blocksConnected.pop_back();
|
blocksConnected.pop_back();
|
||||||
return blocksConnected;
|
return blocksConnected;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotifyEntryRemoved(CTransactionRef txRemoved, MemPoolRemovalReason reason) {
|
|
||||||
assert(!blocksConnected.back().pindex);
|
|
||||||
if (reason == MemPoolRemovalReason::CONFLICT) {
|
|
||||||
blocksConnected.back().conflictedTxs->emplace_back(std::move(txRemoved));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2854,7 +2832,7 @@ bool CChainState::ActivateBestChain(BlockValidationState &state, const CChainPar
|
||||||
do {
|
do {
|
||||||
// We absolutely may not unlock cs_main until we've made forward progress
|
// We absolutely may not unlock cs_main until we've made forward progress
|
||||||
// (with the exception of shutdown due to hardware issues, low disk space, etc).
|
// (with the exception of shutdown due to hardware issues, low disk space, etc).
|
||||||
ConnectTrace connectTrace(mempool); // Destructed before cs_main is unlocked
|
ConnectTrace connectTrace; // Destructed before cs_main is unlocked
|
||||||
|
|
||||||
if (pindexMostWork == nullptr) {
|
if (pindexMostWork == nullptr) {
|
||||||
pindexMostWork = FindMostWorkChain();
|
pindexMostWork = FindMostWorkChain();
|
||||||
|
@ -2881,7 +2859,7 @@ bool CChainState::ActivateBestChain(BlockValidationState &state, const CChainPar
|
||||||
|
|
||||||
for (const PerBlockConnectTrace& trace : connectTrace.GetBlocksConnected()) {
|
for (const PerBlockConnectTrace& trace : connectTrace.GetBlocksConnected()) {
|
||||||
assert(trace.pblock && trace.pindex);
|
assert(trace.pblock && trace.pindex);
|
||||||
GetMainSignals().BlockConnected(trace.pblock, trace.pindex, trace.conflictedTxs);
|
GetMainSignals().BlockConnected(trace.pblock, trace.pindex);
|
||||||
}
|
}
|
||||||
} while (!m_chain.Tip() || (starting_tip && CBlockIndexWorkComparator()(m_chain.Tip(), starting_tip)));
|
} while (!m_chain.Tip() || (starting_tip && CBlockIndexWorkComparator()(m_chain.Tip(), starting_tip)));
|
||||||
if (!blocks_connected) return true;
|
if (!blocks_connected) return true;
|
||||||
|
|
|
@ -32,7 +32,7 @@ struct ValidationInterfaceConnections {
|
||||||
struct MainSignalsInstance {
|
struct MainSignalsInstance {
|
||||||
boost::signals2::signal<void (const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)> UpdatedBlockTip;
|
boost::signals2::signal<void (const CBlockIndex *, const CBlockIndex *, bool fInitialDownload)> UpdatedBlockTip;
|
||||||
boost::signals2::signal<void (const CTransactionRef &)> TransactionAddedToMempool;
|
boost::signals2::signal<void (const CTransactionRef &)> TransactionAddedToMempool;
|
||||||
boost::signals2::signal<void (const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef>&)> BlockConnected;
|
boost::signals2::signal<void (const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex)> BlockConnected;
|
||||||
boost::signals2::signal<void (const std::shared_ptr<const CBlock>&, const CBlockIndex* pindex)> BlockDisconnected;
|
boost::signals2::signal<void (const std::shared_ptr<const CBlock>&, const CBlockIndex* pindex)> BlockDisconnected;
|
||||||
boost::signals2::signal<void (const CTransactionRef &)> TransactionRemovedFromMempool;
|
boost::signals2::signal<void (const CTransactionRef &)> TransactionRemovedFromMempool;
|
||||||
boost::signals2::signal<void (const CBlockLocator &)> ChainStateFlushed;
|
boost::signals2::signal<void (const CBlockLocator &)> ChainStateFlushed;
|
||||||
|
@ -79,7 +79,7 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) {
|
||||||
ValidationInterfaceConnections& conns = g_signals.m_internals->m_connMainSignals[pwalletIn];
|
ValidationInterfaceConnections& conns = g_signals.m_internals->m_connMainSignals[pwalletIn];
|
||||||
conns.UpdatedBlockTip = g_signals.m_internals->UpdatedBlockTip.connect(std::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
conns.UpdatedBlockTip = g_signals.m_internals->UpdatedBlockTip.connect(std::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||||
conns.TransactionAddedToMempool = g_signals.m_internals->TransactionAddedToMempool.connect(std::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, std::placeholders::_1));
|
conns.TransactionAddedToMempool = g_signals.m_internals->TransactionAddedToMempool.connect(std::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, std::placeholders::_1));
|
||||||
conns.BlockConnected = g_signals.m_internals->BlockConnected.connect(std::bind(&CValidationInterface::BlockConnected, pwalletIn, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
conns.BlockConnected = g_signals.m_internals->BlockConnected.connect(std::bind(&CValidationInterface::BlockConnected, pwalletIn, std::placeholders::_1, std::placeholders::_2));
|
||||||
conns.BlockDisconnected = g_signals.m_internals->BlockDisconnected.connect(std::bind(&CValidationInterface::BlockDisconnected, pwalletIn, std::placeholders::_1, std::placeholders::_2));
|
conns.BlockDisconnected = g_signals.m_internals->BlockDisconnected.connect(std::bind(&CValidationInterface::BlockDisconnected, pwalletIn, std::placeholders::_1, std::placeholders::_2));
|
||||||
conns.TransactionRemovedFromMempool = g_signals.m_internals->TransactionRemovedFromMempool.connect(std::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, std::placeholders::_1));
|
conns.TransactionRemovedFromMempool = g_signals.m_internals->TransactionRemovedFromMempool.connect(std::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, std::placeholders::_1));
|
||||||
conns.ChainStateFlushed = g_signals.m_internals->ChainStateFlushed.connect(std::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, std::placeholders::_1));
|
conns.ChainStateFlushed = g_signals.m_internals->ChainStateFlushed.connect(std::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, std::placeholders::_1));
|
||||||
|
@ -163,9 +163,9 @@ void CMainSignals::TransactionRemovedFromMempool(const CTransactionRef &ptx) {
|
||||||
ptx->GetWitnessHash().ToString());
|
ptx->GetWitnessHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::BlockConnected(const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, const std::shared_ptr<const std::vector<CTransactionRef>>& pvtxConflicted) {
|
void CMainSignals::BlockConnected(const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex) {
|
||||||
auto event = [pblock, pindex, pvtxConflicted, this] {
|
auto event = [pblock, pindex, this] {
|
||||||
m_internals->BlockConnected(pblock, pindex, *pvtxConflicted);
|
m_internals->BlockConnected(pblock, pindex);
|
||||||
};
|
};
|
||||||
ENQUEUE_AND_LOG_EVENT(event, "%s: block hash=%s block height=%d", __func__,
|
ENQUEUE_AND_LOG_EVENT(event, "%s: block hash=%s block height=%d", __func__,
|
||||||
pblock->GetHash().ToString(),
|
pblock->GetHash().ToString(),
|
||||||
|
|
|
@ -92,10 +92,32 @@ protected:
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of a transaction leaving mempool.
|
* Notifies listeners of a transaction leaving mempool.
|
||||||
*
|
*
|
||||||
* This only fires for transactions which leave mempool because of expiry,
|
* This notification fires for transactions that are removed from the
|
||||||
* size limiting, reorg (changes in lock times/coinbase maturity), or
|
* mempool for the following reasons:
|
||||||
* replacement. This does not include any transactions which are included
|
*
|
||||||
* in BlockConnectedDisconnected either in block->vtx or in txnConflicted.
|
* - EXPIRY (expired from mempool after -mempoolexpiry hours)
|
||||||
|
* - SIZELIMIT (removed in size limiting if the mempool exceeds -maxmempool megabytes)
|
||||||
|
* - REORG (removed during a reorg)
|
||||||
|
* - CONFLICT (removed because it conflicts with in-block transaction)
|
||||||
|
* - REPLACED (removed due to RBF replacement)
|
||||||
|
*
|
||||||
|
* This does not fire for transactions that are removed from the mempool
|
||||||
|
* because they have been included in a block. Any client that is interested
|
||||||
|
* in transactions removed from the mempool for inclusion in a block can learn
|
||||||
|
* about those transactions from the BlockConnected notification.
|
||||||
|
*
|
||||||
|
* Transactions that are removed from the mempool because they conflict
|
||||||
|
* with a transaction in the new block will have
|
||||||
|
* TransactionRemovedFromMempool events fired *before* the BlockConnected
|
||||||
|
* event is fired. If multiple blocks are connected in one step, then the
|
||||||
|
* ordering could be:
|
||||||
|
*
|
||||||
|
* - TransactionRemovedFromMempool(tx1 from block A)
|
||||||
|
* - TransactionRemovedFromMempool(tx2 from block A)
|
||||||
|
* - TransactionRemovedFromMempool(tx1 from block B)
|
||||||
|
* - TransactionRemovedFromMempool(tx2 from block B)
|
||||||
|
* - BlockConnected(A)
|
||||||
|
* - BlockConnected(B)
|
||||||
*
|
*
|
||||||
* Called on a background thread.
|
* Called on a background thread.
|
||||||
*/
|
*/
|
||||||
|
@ -106,7 +128,7 @@ protected:
|
||||||
*
|
*
|
||||||
* Called on a background thread.
|
* Called on a background thread.
|
||||||
*/
|
*/
|
||||||
virtual void BlockConnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex, const std::vector<CTransactionRef> &txnConflicted) {}
|
virtual void BlockConnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of a block being disconnected
|
* Notifies listeners of a block being disconnected
|
||||||
*
|
*
|
||||||
|
@ -170,7 +192,7 @@ public:
|
||||||
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
||||||
void TransactionAddedToMempool(const CTransactionRef &);
|
void TransactionAddedToMempool(const CTransactionRef &);
|
||||||
void TransactionRemovedFromMempool(const CTransactionRef &);
|
void TransactionRemovedFromMempool(const CTransactionRef &);
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::shared_ptr<const std::vector<CTransactionRef>> &);
|
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex);
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock> &, const CBlockIndex* pindex);
|
void BlockDisconnected(const std::shared_ptr<const CBlock> &, const CBlockIndex* pindex);
|
||||||
void ChainStateFlushed(const CBlockLocator &);
|
void ChainStateFlushed(const CBlockLocator &);
|
||||||
void BlockChecked(const CBlock&, const BlockValidationState&);
|
void BlockChecked(const CBlock&, const BlockValidationState&);
|
||||||
|
|
|
@ -1109,7 +1109,7 @@ void CWallet::TransactionRemovedFromMempool(const CTransactionRef &ptx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::BlockConnected(const CBlock& block, const std::vector<CTransactionRef>& vtxConflicted, int height)
|
void CWallet::BlockConnected(const CBlock& block, int height)
|
||||||
{
|
{
|
||||||
const uint256& block_hash = block.GetHash();
|
const uint256& block_hash = block.GetHash();
|
||||||
auto locked_chain = chain().lock();
|
auto locked_chain = chain().lock();
|
||||||
|
@ -1122,9 +1122,6 @@ void CWallet::BlockConnected(const CBlock& block, const std::vector<CTransaction
|
||||||
SyncTransaction(block.vtx[index], confirm);
|
SyncTransaction(block.vtx[index], confirm);
|
||||||
TransactionRemovedFromMempool(block.vtx[index]);
|
TransactionRemovedFromMempool(block.vtx[index]);
|
||||||
}
|
}
|
||||||
for (const CTransactionRef& ptx : vtxConflicted) {
|
|
||||||
TransactionRemovedFromMempool(ptx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWallet::BlockDisconnected(const CBlock& block, int height)
|
void CWallet::BlockDisconnected(const CBlock& block, int height)
|
||||||
|
|
|
@ -876,7 +876,7 @@ public:
|
||||||
bool AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose=true);
|
bool AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose=true);
|
||||||
void LoadToWallet(CWalletTx& wtxIn) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
void LoadToWallet(CWalletTx& wtxIn) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
|
||||||
void TransactionAddedToMempool(const CTransactionRef& tx) override;
|
void TransactionAddedToMempool(const CTransactionRef& tx) override;
|
||||||
void BlockConnected(const CBlock& block, const std::vector<CTransactionRef>& vtxConflicted, int height) override;
|
void BlockConnected(const CBlock& block, int height) override;
|
||||||
void BlockDisconnected(const CBlock& block, int height) override;
|
void BlockDisconnected(const CBlock& block, int height) override;
|
||||||
void UpdatedBlockTip() override;
|
void UpdatedBlockTip() override;
|
||||||
int64_t RescanFromTime(int64_t startTime, const WalletRescanReserver& reserver, bool update);
|
int64_t RescanFromTime(int64_t startTime, const WalletRescanReserver& reserver, bool update);
|
||||||
|
|
|
@ -177,7 +177,7 @@ void CZMQNotificationInterface::TransactionAddedToMempool(const CTransactionRef&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CZMQNotificationInterface::BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected, const std::vector<CTransactionRef>& vtxConflicted)
|
void CZMQNotificationInterface::BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected)
|
||||||
{
|
{
|
||||||
for (const CTransactionRef& ptx : pblock->vtx) {
|
for (const CTransactionRef& ptx : pblock->vtx) {
|
||||||
// Do a normal notify for each transaction added in the block
|
// Do a normal notify for each transaction added in the block
|
||||||
|
|
|
@ -26,7 +26,7 @@ protected:
|
||||||
|
|
||||||
// CValidationInterface
|
// CValidationInterface
|
||||||
void TransactionAddedToMempool(const CTransactionRef& tx) override;
|
void TransactionAddedToMempool(const CTransactionRef& tx) override;
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected, const std::vector<CTransactionRef>& vtxConflicted) override;
|
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override;
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
|
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
|
||||||
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override;
|
void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue