diff options
author | glozow <gloriajzhao@gmail.com> | 2024-05-17 11:04:18 +0100 |
---|---|---|
committer | glozow <gloriajzhao@gmail.com> | 2024-05-21 15:06:02 +0100 |
commit | d578e2e3540e085942001350ff3aeb047bdac973 (patch) | |
tree | 4a74bcd02afc0196b4d68e0dea862d874e200732 /src/validation.cpp | |
parent | 3abee5eceb4158ccf455aff9d1d76461dfff5af0 (diff) |
[policy] explicitly require non-v3 for CPFP carve out
This carve out is intended to allow a second child under restricted
circumstances, but this topology is not allowed for v3 transactions.
As CPFP carve out does not explicitly require a second child to actually
exist, it has the effect of granting a free +10KvB descendant size limit
when a single child is enough to bust the descendant limit.
Diffstat (limited to 'src/validation.cpp')
-rw-r--r-- | src/validation.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/validation.cpp b/src/validation.cpp index 048c97529a..3ea25db36c 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -953,7 +953,8 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws) // If the new transaction is relatively small (up to 40k weight) // and has at most one ancestor (ie ancestor limit of 2, including // the new transaction), allow it if its parent has exactly the - // descendant limit descendants. + // descendant limit descendants. The transaction also cannot be v3, + // as its topology restrictions do not allow a second child. // // This allows protocols which rely on distrusting counterparties // being able to broadcast descendants of an unconfirmed transaction @@ -967,7 +968,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws) .descendant_size_vbytes = maybe_rbf_limits.descendant_size_vbytes + EXTRA_DESCENDANT_TX_SIZE_LIMIT, }; 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 || ws.m_ptx->nVersion == 3) { return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "too-long-mempool-chain", error_message); } ancestors = m_pool.CalculateMemPoolAncestors(*entry, cpfp_carve_out_limits); |