mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-08 10:31:50 -05:00
[refactor] Add helper for retrieving mempool entry
In places where the iterator is only needed for accessing the actual entry, it should not be required to first retrieve the iterator.
This commit is contained in:
parent
453b4813eb
commit
1c6a73abbd
5 changed files with 26 additions and 18 deletions
|
@ -648,8 +648,9 @@ public:
|
|||
{
|
||||
if (!m_node.mempool) return false;
|
||||
LOCK(m_node.mempool->cs);
|
||||
auto it = m_node.mempool->GetIter(txid);
|
||||
return it && (*it)->GetCountWithDescendants() > 1;
|
||||
const auto entry{m_node.mempool->GetEntry(Txid::FromUint256(txid))};
|
||||
if (entry == nullptr) return false;
|
||||
return entry->GetCountWithDescendants() > 1;
|
||||
}
|
||||
bool broadcastTransaction(const CTransactionRef& tx,
|
||||
const CAmount& max_tx_fee,
|
||||
|
|
|
@ -94,7 +94,7 @@ BOOST_FIXTURE_TEST_CASE(miniminer_negative, TestChain100Setup)
|
|||
const CFeeRate feerate_zero(0);
|
||||
mini_miner_target0.BuildMockTemplate(feerate_zero);
|
||||
// Check the quit condition:
|
||||
BOOST_CHECK(negative_modified_fees < feerate_zero.GetFee(pool.GetIter(tx_mod_negative->GetHash()).value()->GetTxSize()));
|
||||
BOOST_CHECK(negative_modified_fees < feerate_zero.GetFee(Assert(pool.GetEntry(tx_mod_negative->GetHash()))->GetTxSize()));
|
||||
BOOST_CHECK(mini_miner_target0.GetMockTemplateTxids().empty());
|
||||
|
||||
// With no target feerate, the template includes all transactions, even negative feerate ones.
|
||||
|
@ -179,9 +179,9 @@ BOOST_FIXTURE_TEST_CASE(miniminer_1p1c, TestChain100Setup)
|
|||
};
|
||||
std::map<uint256, TxDimensions> tx_dims;
|
||||
for (const auto& tx : all_transactions) {
|
||||
const auto it = pool.GetIter(tx->GetHash()).value();
|
||||
tx_dims.emplace(tx->GetHash(), TxDimensions{it->GetTxSize(), it->GetModifiedFee(),
|
||||
CFeeRate(it->GetModifiedFee(), it->GetTxSize())});
|
||||
const auto& entry{*Assert(pool.GetEntry(tx->GetHash()))};
|
||||
tx_dims.emplace(tx->GetHash(), TxDimensions{entry.GetTxSize(), entry.GetModifiedFee(),
|
||||
CFeeRate(entry.GetModifiedFee(), entry.GetTxSize())});
|
||||
}
|
||||
|
||||
const std::vector<CFeeRate> various_normal_feerates({CFeeRate(0), CFeeRate(500), CFeeRate(999),
|
||||
|
@ -447,15 +447,15 @@ BOOST_FIXTURE_TEST_CASE(miniminer_overlap, TestChain100Setup)
|
|||
// tx3's feerate is lower than tx2's. same fee, different weight.
|
||||
BOOST_CHECK(tx2_feerate > tx3_feerate);
|
||||
const auto tx3_anc_feerate = CFeeRate(low_fee + med_fee + high_fee + high_fee, tx_vsizes[0] + tx_vsizes[1] + tx_vsizes[2] + tx_vsizes[3]);
|
||||
const auto tx3_iter = pool.GetIter(tx3->GetHash());
|
||||
BOOST_CHECK(tx3_anc_feerate == CFeeRate(tx3_iter.value()->GetModFeesWithAncestors(), tx3_iter.value()->GetSizeWithAncestors()));
|
||||
const auto& tx3_entry{*Assert(pool.GetEntry(tx3->GetHash()))};
|
||||
BOOST_CHECK(tx3_anc_feerate == CFeeRate(tx3_entry.GetModFeesWithAncestors(), tx3_entry.GetSizeWithAncestors()));
|
||||
const auto tx4_feerate = CFeeRate(high_fee, tx_vsizes[4]);
|
||||
const auto tx6_anc_feerate = CFeeRate(high_fee + low_fee + med_fee, tx_vsizes[4] + tx_vsizes[5] + tx_vsizes[6]);
|
||||
const auto tx6_iter = pool.GetIter(tx6->GetHash());
|
||||
BOOST_CHECK(tx6_anc_feerate == CFeeRate(tx6_iter.value()->GetModFeesWithAncestors(), tx6_iter.value()->GetSizeWithAncestors()));
|
||||
const auto& tx6_entry{*Assert(pool.GetEntry(tx6->GetHash()))};
|
||||
BOOST_CHECK(tx6_anc_feerate == CFeeRate(tx6_entry.GetModFeesWithAncestors(), tx6_entry.GetSizeWithAncestors()));
|
||||
const auto tx7_anc_feerate = CFeeRate(high_fee + low_fee + high_fee, tx_vsizes[4] + tx_vsizes[5] + tx_vsizes[7]);
|
||||
const auto tx7_iter = pool.GetIter(tx7->GetHash());
|
||||
BOOST_CHECK(tx7_anc_feerate == CFeeRate(tx7_iter.value()->GetModFeesWithAncestors(), tx7_iter.value()->GetSizeWithAncestors()));
|
||||
const auto& tx7_entry{*Assert(pool.GetEntry(tx7->GetHash()))};
|
||||
BOOST_CHECK(tx7_anc_feerate == CFeeRate(tx7_entry.GetModFeesWithAncestors(), tx7_entry.GetSizeWithAncestors()));
|
||||
BOOST_CHECK(tx4_feerate > tx6_anc_feerate);
|
||||
BOOST_CHECK(tx4_feerate > tx7_anc_feerate);
|
||||
|
||||
|
|
|
@ -862,6 +862,13 @@ std::vector<TxMempoolInfo> CTxMemPool::infoAll() const
|
|||
return ret;
|
||||
}
|
||||
|
||||
const CTxMemPoolEntry* CTxMemPool::GetEntry(const Txid& txid) const
|
||||
{
|
||||
AssertLockHeld(cs);
|
||||
const auto i = mapTx.find(txid);
|
||||
return i == mapTx.end() ? nullptr : &(*i);
|
||||
}
|
||||
|
||||
CTransactionRef CTxMemPool::get(const uint256& hash) const
|
||||
{
|
||||
LOCK(cs);
|
||||
|
|
|
@ -684,6 +684,8 @@ public:
|
|||
return (mapTx.count(gtxid.GetHash()) != 0);
|
||||
}
|
||||
|
||||
const CTxMemPoolEntry* GetEntry(const Txid& txid) const LIFETIMEBOUND EXCLUSIVE_LOCKS_REQUIRED(cs);
|
||||
|
||||
CTransactionRef get(const uint256& hash) const;
|
||||
txiter get_iter_from_wtxid(const uint256& wtxid) const EXCLUSIVE_LOCKS_REQUIRED(cs)
|
||||
{
|
||||
|
|
|
@ -1485,9 +1485,8 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptPackage(const Package& package,
|
|||
// transactions that are already in the mempool, and only call AcceptMultipleTransactions() with
|
||||
// the new transactions. This ensures we don't double-count transaction counts and sizes when
|
||||
// checking ancestor/descendant limits, or double-count transaction fees for fee-related policy.
|
||||
auto iter = m_pool.GetIter(txid);
|
||||
assert(iter != std::nullopt);
|
||||
results_final.emplace(wtxid, MempoolAcceptResult::MempoolTx(iter.value()->GetTxSize(), iter.value()->GetFee()));
|
||||
const auto& entry{*Assert(m_pool.GetEntry(txid))};
|
||||
results_final.emplace(wtxid, MempoolAcceptResult::MempoolTx(entry.GetTxSize(), entry.GetFee()));
|
||||
} else if (m_pool.exists(GenTxid::Txid(txid))) {
|
||||
// Transaction with the same non-witness data but different witness (same txid,
|
||||
// different wtxid) already exists in the mempool.
|
||||
|
@ -1496,10 +1495,9 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptPackage(const Package& package,
|
|||
// transaction for the mempool one. Note that we are ignoring the validity of the
|
||||
// package transaction passed in.
|
||||
// TODO: allow witness replacement in packages.
|
||||
auto iter = m_pool.GetIter(txid);
|
||||
assert(iter != std::nullopt);
|
||||
const auto& entry{*Assert(m_pool.GetEntry(txid))};
|
||||
// Provide the wtxid of the mempool tx so that the caller can look it up in the mempool.
|
||||
results_final.emplace(wtxid, MempoolAcceptResult::MempoolTxDifferentWitness(iter.value()->GetTx().GetWitnessHash()));
|
||||
results_final.emplace(wtxid, MempoolAcceptResult::MempoolTxDifferentWitness(entry.GetTx().GetWitnessHash()));
|
||||
} else {
|
||||
// Transaction does not already exist in the mempool.
|
||||
// Try submitting the transaction on its own.
|
||||
|
|
Loading…
Add table
Reference in a new issue