Skip to content

Commit dff5ad3

Browse files
committed
CValidationInterface: modify the parameter of TransactionAddedToMempool
Create a new struct `NewMempoolTransactionInfo` that will be used as the new parameter of `TransactionAddedToMempool` callback.
1 parent 91532bd commit dff5ad3

File tree

9 files changed

+64
-19
lines changed

9 files changed

+64
-19
lines changed

src/kernel/mempool_entry.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,4 +208,33 @@ struct RemovedMempoolTransactionInfo {
208208
: info{entry.GetSharedTx(), entry.GetFee(), entry.GetTxSize(), entry.GetHeight()} {}
209209
};
210210

211+
struct NewMempoolTransactionInfo {
212+
TransactionInfo info;
213+
/*
214+
* This boolean indicates whether the transaction was added
215+
* without enforcing mempool fee limits.
216+
*/
217+
const bool m_from_disconnected_block;
218+
/* This boolean indicates whether the transaction is part of a package. */
219+
const bool m_submitted_in_package;
220+
/*
221+
* This boolean indicates whether the blockchain is up to date when the
222+
* transaction is added to the mempool.
223+
*/
224+
const bool m_chainstate_is_current;
225+
/* Indicates whether the transaction has unconfirmed parents. */
226+
const bool m_has_no_mempool_parents;
227+
228+
explicit NewMempoolTransactionInfo(const CTransactionRef& tx, const CAmount& fee,
229+
const int64_t vsize, const unsigned int height,
230+
const bool from_disconnected_block, const bool submitted_in_package,
231+
const bool chainstate_is_current,
232+
const bool has_no_mempool_parents)
233+
: info{tx, fee, vsize, height},
234+
m_from_disconnected_block{from_disconnected_block},
235+
m_submitted_in_package{submitted_in_package},
236+
m_chainstate_is_current{chainstate_is_current},
237+
m_has_no_mempool_parents{has_no_mempool_parents} {}
238+
};
239+
211240
#endif // BITCOIN_KERNEL_MEMPOOL_ENTRY_H

src/node/interfaces.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,9 @@ class NotificationsProxy : public CValidationInterface
428428
explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
429429
: m_notifications(std::move(notifications)) {}
430430
virtual ~NotificationsProxy() = default;
431-
void TransactionAddedToMempool(const CTransactionRef& tx, uint64_t mempool_sequence) override
431+
void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence) override
432432
{
433-
m_notifications->transactionAddedToMempool(tx);
433+
m_notifications->transactionAddedToMempool(tx.info.m_tx);
434434
}
435435
void TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) override
436436
{

src/test/fuzz/package_eval.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ struct OutpointsUpdater final : public CValidationInterface {
5555
explicit OutpointsUpdater(std::set<COutPoint>& r)
5656
: m_mempool_outpoints{r} {}
5757

58-
void TransactionAddedToMempool(const CTransactionRef& tx, uint64_t /* mempool_sequence */) override
58+
void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t /* mempool_sequence */) override
5959
{
6060
// for coins spent we always want to be able to rbf so they're not removed
6161

6262
// outputs from this tx can now be spent
63-
for (uint32_t index{0}; index < tx->vout.size(); ++index) {
64-
m_mempool_outpoints.insert(COutPoint{tx->GetHash(), index});
63+
for (uint32_t index{0}; index < tx.info.m_tx->vout.size(); ++index) {
64+
m_mempool_outpoints.insert(COutPoint{tx.info.m_tx->GetHash(), index});
6565
}
6666
}
6767

@@ -85,10 +85,10 @@ struct TransactionsDelta final : public CValidationInterface {
8585
explicit TransactionsDelta(std::set<CTransactionRef>& a)
8686
: m_added{a} {}
8787

88-
void TransactionAddedToMempool(const CTransactionRef& tx, uint64_t /* mempool_sequence */) override
88+
void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t /* mempool_sequence */) override
8989
{
9090
// Transactions may be entered and booted any number of times
91-
m_added.insert(tx);
91+
m_added.insert(tx.info.m_tx);
9292
}
9393

9494
void TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t /* mempool_sequence */) override

src/test/fuzz/tx_pool.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ struct TransactionsDelta final : public CValidationInterface {
5959
explicit TransactionsDelta(std::set<CTransactionRef>& r, std::set<CTransactionRef>& a)
6060
: m_removed{r}, m_added{a} {}
6161

62-
void TransactionAddedToMempool(const CTransactionRef& tx, uint64_t /* mempool_sequence */) override
62+
void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t /* mempool_sequence */) override
6363
{
64-
Assert(m_added.insert(tx).second);
64+
Assert(m_added.insert(tx.info.m_tx).second);
6565
}
6666

6767
void TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t /* mempool_sequence */) override

src/validation.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,7 +1222,13 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
12221222
results.emplace(ws.m_ptx->GetWitnessHash(),
12231223
MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize,
12241224
ws.m_base_fees, effective_feerate, effective_feerate_wtxids));
1225-
GetMainSignals().TransactionAddedToMempool(ws.m_ptx, m_pool.GetAndIncrementSequence());
1225+
const CTransaction& tx = *ws.m_ptx;
1226+
const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
1227+
ws.m_vsize, ws.m_entry->GetHeight(),
1228+
args.m_bypass_limits, args.m_package_submission,
1229+
IsCurrentForFeeEstimation(m_active_chainstate),
1230+
m_pool.HasNoInputsOf(tx));
1231+
GetMainSignals().TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
12261232
}
12271233
return all_submitted;
12281234
}
@@ -1265,7 +1271,13 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
12651271
return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), {ws.m_ptx->GetWitnessHash()});
12661272
}
12671273

1268-
GetMainSignals().TransactionAddedToMempool(ptx, m_pool.GetAndIncrementSequence());
1274+
const CTransaction& tx = *ws.m_ptx;
1275+
const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
1276+
ws.m_vsize, ws.m_entry->GetHeight(),
1277+
args.m_bypass_limits, args.m_package_submission,
1278+
IsCurrentForFeeEstimation(m_active_chainstate),
1279+
m_pool.HasNoInputsOf(tx));
1280+
GetMainSignals().TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
12691281

12701282
return MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize, ws.m_base_fees,
12711283
effective_feerate, single_wtxid);

src/validationinterface.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,14 @@ void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockInd
206206
fInitialDownload);
207207
}
208208

209-
void CMainSignals::TransactionAddedToMempool(const CTransactionRef& tx, uint64_t mempool_sequence) {
209+
void CMainSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
210+
{
210211
auto event = [tx, mempool_sequence, this] {
211212
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionAddedToMempool(tx, mempool_sequence); });
212213
};
213214
ENQUEUE_AND_LOG_EVENT(event, "%s: txid=%s wtxid=%s", __func__,
214-
tx->GetHash().ToString(),
215-
tx->GetWitnessHash().ToString());
215+
tx.info.m_tx->GetHash().ToString(),
216+
tx.info.m_tx->GetWitnessHash().ToString());
216217
}
217218

218219
void CMainSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) {

src/validationinterface.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class CValidationInterface;
2222
class CScheduler;
2323
enum class MemPoolRemovalReason;
2424
struct RemovedMempoolTransactionInfo;
25+
struct NewMempoolTransactionInfo;
2526

2627
/** Register subscriber */
2728
void RegisterValidationInterface(CValidationInterface* callbacks);
@@ -97,7 +98,7 @@ class CValidationInterface {
9798
*
9899
* Called on a background thread.
99100
*/
100-
virtual void TransactionAddedToMempool(const CTransactionRef& tx, uint64_t mempool_sequence) {}
101+
virtual void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence) {}
101102

102103
/**
103104
* Notifies listeners of a transaction leaving mempool.
@@ -210,7 +211,7 @@ class CMainSignals {
210211

211212

212213
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
213-
void TransactionAddedToMempool(const CTransactionRef&, uint64_t mempool_sequence);
214+
void TransactionAddedToMempool(const NewMempoolTransactionInfo&, uint64_t mempool_sequence);
214215
void TransactionRemovedFromMempool(const CTransactionRef&, MemPoolRemovalReason, uint64_t mempool_sequence);
215216
void MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>&, unsigned int nBlockHeight);
216217
void BlockConnected(ChainstateRole, const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex);

src/zmq/zmqnotificationinterface.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <common/args.h>
88
#include <kernel/chain.h>
9+
#include <kernel/mempool_entry.h>
910
#include <logging.h>
1011
#include <primitives/block.h>
1112
#include <primitives/transaction.h>
@@ -152,9 +153,9 @@ void CZMQNotificationInterface::UpdatedBlockTip(const CBlockIndex *pindexNew, co
152153
});
153154
}
154155

155-
void CZMQNotificationInterface::TransactionAddedToMempool(const CTransactionRef& ptx, uint64_t mempool_sequence)
156+
void CZMQNotificationInterface::TransactionAddedToMempool(const NewMempoolTransactionInfo& ptx, uint64_t mempool_sequence)
156157
{
157-
const CTransaction& tx = *ptx;
158+
const CTransaction& tx = *(ptx.info.m_tx);
158159

159160
TryForEachAndRemoveFailed(notifiers, [&tx, mempool_sequence](CZMQAbstractNotifier* notifier) {
160161
return notifier->NotifyTransaction(tx) && notifier->NotifyTransactionAcceptance(tx, mempool_sequence);

src/zmq/zmqnotificationinterface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
class CBlock;
1717
class CBlockIndex;
1818
class CZMQAbstractNotifier;
19+
struct NewMempoolTransactionInfo;
1920

2021
class CZMQNotificationInterface final : public CValidationInterface
2122
{
@@ -31,7 +32,7 @@ class CZMQNotificationInterface final : public CValidationInterface
3132
void Shutdown();
3233

3334
// CValidationInterface
34-
void TransactionAddedToMempool(const CTransactionRef& tx, uint64_t mempool_sequence) override;
35+
void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence) override;
3536
void TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) override;
3637
void BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override;
3738
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;

0 commit comments

Comments
 (0)