0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-10 10:52:31 -05:00

Remove MemPoolAccept::m_limits, only have local copies for carveouts

This commit is contained in:
Greg Sanders 2023-09-13 14:20:14 -04:00
parent f1a9fd627b
commit 275579d8c1
3 changed files with 17 additions and 18 deletions

View file

@ -197,7 +197,6 @@ util::Result<CTxMemPool::setEntries> CTxMemPool::CalculateAncestorsAndCheckLimit
} }
bool CTxMemPool::CheckPackageLimits(const Package& package, bool CTxMemPool::CheckPackageLimits(const Package& package,
const Limits& limits,
std::string &errString) const std::string &errString) const
{ {
CTxMemPoolEntry::Parents staged_ancestors; CTxMemPoolEntry::Parents staged_ancestors;
@ -208,8 +207,8 @@ bool CTxMemPool::CheckPackageLimits(const Package& package,
std::optional<txiter> piter = GetIter(input.prevout.hash); std::optional<txiter> piter = GetIter(input.prevout.hash);
if (piter) { if (piter) {
staged_ancestors.insert(**piter); staged_ancestors.insert(**piter);
if (staged_ancestors.size() + package.size() > static_cast<uint64_t>(limits.ancestor_count)) { if (staged_ancestors.size() + package.size() > static_cast<uint64_t>(m_limits.ancestor_count)) {
errString = strprintf("too many unconfirmed parents [limit: %u]", limits.ancestor_count); errString = strprintf("too many unconfirmed parents [limit: %u]", m_limits.ancestor_count);
return false; return false;
} }
} }
@ -219,7 +218,7 @@ bool CTxMemPool::CheckPackageLimits(const Package& package,
// considered together must be within limits even if they are not interdependent. This may be // considered together must be within limits even if they are not interdependent. This may be
// stricter than the limits for each individual transaction. // stricter than the limits for each individual transaction.
const auto ancestors{CalculateAncestorsAndCheckLimits(total_size, package.size(), const auto ancestors{CalculateAncestorsAndCheckLimits(total_size, package.size(),
staged_ancestors, limits)}; staged_ancestors, m_limits)};
// It's possible to overestimate the ancestor/descendant totals. // It's possible to overestimate the ancestor/descendant totals.
if (!ancestors.has_value()) errString = "possibly " + util::ErrorString(ancestors).original; if (!ancestors.has_value()) errString = "possibly " + util::ErrorString(ancestors).original;
return ancestors.has_value(); return ancestors.has_value();

View file

@ -606,11 +606,9 @@ public:
* @param[in] package Transaction package being evaluated for acceptance * @param[in] package Transaction package being evaluated for acceptance
* to mempool. The transactions need not be direct * to mempool. The transactions need not be direct
* ancestors/descendants of each other. * ancestors/descendants of each other.
* @param[in] limits Maximum number and size of ancestors and descendants
* @param[out] errString Populated with error reason if a limit is hit. * @param[out] errString Populated with error reason if a limit is hit.
*/ */
bool CheckPackageLimits(const Package& package, bool CheckPackageLimits(const Package& package,
const Limits& limits,
std::string &errString) const EXCLUSIVE_LOCKS_REQUIRED(cs); std::string &errString) const EXCLUSIVE_LOCKS_REQUIRED(cs);
/** Populate setDescendants with all in-mempool descendants of hash. /** Populate setDescendants with all in-mempool descendants of hash.

View file

@ -432,8 +432,7 @@ public:
m_pool(mempool), m_pool(mempool),
m_view(&m_dummy), m_view(&m_dummy),
m_viewmempool(&active_chainstate.CoinsTip(), m_pool), m_viewmempool(&active_chainstate.CoinsTip(), m_pool),
m_active_chainstate(active_chainstate), m_active_chainstate(active_chainstate)
m_limits{m_pool.m_limits}
{ {
} }
@ -683,8 +682,6 @@ private:
Chainstate& m_active_chainstate; Chainstate& m_active_chainstate;
CTxMemPool::Limits m_limits;
/** Whether the transaction(s) would replace any mempool transactions. If so, RBF rules apply. */ /** Whether the transaction(s) would replace any mempool transactions. If so, RBF rules apply. */
bool m_rbf{false}; bool m_rbf{false};
}; };
@ -873,6 +870,11 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
if (!bypass_limits && !args.m_package_feerates && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state)) return false; if (!bypass_limits && !args.m_package_feerates && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state)) return false;
ws.m_iters_conflicting = m_pool.GetIterSet(ws.m_conflicts); ws.m_iters_conflicting = m_pool.GetIterSet(ws.m_conflicts);
// Note that these modifications are only applicable to single transaction scenarios;
// carve-outs and package RBF are disabled for multi-transaction evaluations.
CTxMemPool::Limits maybe_rbf_limits = m_pool.m_limits;
// Calculate in-mempool ancestors, up to a limit. // Calculate in-mempool ancestors, up to a limit.
if (ws.m_conflicts.size() == 1) { if (ws.m_conflicts.size() == 1) {
// In general, when we receive an RBF transaction with mempool conflicts, we want to know whether we // In general, when we receive an RBF transaction with mempool conflicts, we want to know whether we
@ -905,11 +907,11 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
assert(ws.m_iters_conflicting.size() == 1); assert(ws.m_iters_conflicting.size() == 1);
CTxMemPool::txiter conflict = *ws.m_iters_conflicting.begin(); CTxMemPool::txiter conflict = *ws.m_iters_conflicting.begin();
m_limits.descendant_count += 1; maybe_rbf_limits.descendant_count += 1;
m_limits.descendant_size_vbytes += conflict->GetSizeWithDescendants(); maybe_rbf_limits.descendant_size_vbytes += conflict->GetSizeWithDescendants();
} }
auto ancestors{m_pool.CalculateMemPoolAncestors(*entry, m_limits)}; auto ancestors{m_pool.CalculateMemPoolAncestors(*entry, maybe_rbf_limits)};
if (!ancestors) { if (!ancestors) {
// If CalculateMemPoolAncestors fails second time, we want the original error string. // If CalculateMemPoolAncestors fails second time, we want the original error string.
// Contracting/payment channels CPFP carve-out: // Contracting/payment channels CPFP carve-out:
@ -925,9 +927,9 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// this, see https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-November/016518.html // this, see https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-November/016518.html
CTxMemPool::Limits cpfp_carve_out_limits{ CTxMemPool::Limits cpfp_carve_out_limits{
.ancestor_count = 2, .ancestor_count = 2,
.ancestor_size_vbytes = m_limits.ancestor_size_vbytes, .ancestor_size_vbytes = maybe_rbf_limits.ancestor_size_vbytes,
.descendant_count = m_limits.descendant_count + 1, .descendant_count = maybe_rbf_limits.descendant_count + 1,
.descendant_size_vbytes = m_limits.descendant_size_vbytes + EXTRA_DESCENDANT_TX_SIZE_LIMIT, .descendant_size_vbytes = maybe_rbf_limits.descendant_size_vbytes + EXTRA_DESCENDANT_TX_SIZE_LIMIT,
}; };
const auto error_message{util::ErrorString(ancestors).original}; const auto error_message{util::ErrorString(ancestors).original};
if (ws.m_vsize > EXTRA_DESCENDANT_TX_SIZE_LIMIT) { if (ws.m_vsize > EXTRA_DESCENDANT_TX_SIZE_LIMIT) {
@ -1010,7 +1012,7 @@ bool MemPoolAccept::PackageMempoolChecks(const std::vector<CTransactionRef>& txn
{ return !m_pool.exists(GenTxid::Txid(tx->GetHash()));})); { return !m_pool.exists(GenTxid::Txid(tx->GetHash()));}));
std::string err_string; std::string err_string;
if (!m_pool.CheckPackageLimits(txns, m_limits, err_string)) { if (!m_pool.CheckPackageLimits(txns, err_string)) {
// This is a package-wide error, separate from an individual transaction error. // This is a package-wide error, separate from an individual transaction error.
return package_state.Invalid(PackageValidationResult::PCKG_POLICY, "package-mempool-limits", err_string); return package_state.Invalid(PackageValidationResult::PCKG_POLICY, "package-mempool-limits", err_string);
} }
@ -1165,7 +1167,7 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
// Re-calculate mempool ancestors to call addUnchecked(). They may have changed since the // Re-calculate mempool ancestors to call addUnchecked(). They may have changed since the
// last calculation done in PreChecks, since package ancestors have already been submitted. // last calculation done in PreChecks, since package ancestors have already been submitted.
{ {
auto ancestors{m_pool.CalculateMemPoolAncestors(*ws.m_entry, m_limits)}; auto ancestors{m_pool.CalculateMemPoolAncestors(*ws.m_entry, m_pool.m_limits)};
if(!ancestors) { if(!ancestors) {
results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state)); results.emplace(ws.m_ptx->GetWitnessHash(), MempoolAcceptResult::Failure(ws.m_state));
// Since PreChecks() and PackageMempoolChecks() both enforce limits, this should never fail. // Since PreChecks() and PackageMempoolChecks() both enforce limits, this should never fail.