|
| 1 | +# Mempool Replacements |
| 2 | + |
| 3 | +## Current Replace-by-Fee Policy |
| 4 | + |
| 5 | +A transaction conflicts with an in-mempool transaction ("directly conflicting transaction") if they |
| 6 | +spend one or more of the same inputs. A transaction may conflict with multiple in-mempool |
| 7 | +transactions. |
| 8 | + |
| 9 | +A transaction ("replacement transaction") may replace its directly conflicting transactions and |
| 10 | +their in-mempool descendants (together, "original transactions") if, in addition to passing all |
| 11 | +other consensus and policy rules, each of the following conditions are met: |
| 12 | + |
| 13 | +1. The directly conflicting transactions all signal replaceability explicitly. A transaction is |
| 14 | + signaling replaceability if any of its inputs have an nSequence number less than (0xffffffff - 1). |
| 15 | + |
| 16 | + *Rationale*: See [BIP125 |
| 17 | + explanation](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki#motivation). |
| 18 | + |
| 19 | +2. The replacement transaction only include an unconfirmed input if that input was included in |
| 20 | + one of the directly conflicting transactions. An unconfirmed input spends an output from a |
| 21 | + currently-unconfirmed transaction. |
| 22 | + |
| 23 | + *Rationale*: When RBF was originally implemented, the mempool did not keep track of |
| 24 | + ancestor feerates yet. This rule was suggested as a temporary restriction. |
| 25 | + |
| 26 | +3. The replacement transaction pays an absolute fee of at least the sum paid by the original |
| 27 | + transactions. |
| 28 | + |
| 29 | + *Rationale*: Only requiring the replacement transaction to have a higher feerate could allow an |
| 30 | + attacker to bypass node minimum relay feerate requirements and cause the network to repeatedly |
| 31 | + relay slightly smaller replacement transactions without adding any more fees. Additionally, if |
| 32 | + any of the original transactions would be included in the next block assembled by an economically |
| 33 | + rational miner, a replacement policy allowing the replacement transaction to decrease the absolute |
| 34 | + fees in the next block would be incentive-incompatible. |
| 35 | + |
| 36 | +4. The additional fees (difference between absolute fee paid by the replacement transaction and the |
| 37 | + sum paid by the original transactions) pays for the replacement transaction's bandwidth at or |
| 38 | + above the rate set by the node's incremental relay feerate. For example, if the incremental relay |
| 39 | + feerate is 1 satoshi/vB and the replacement transaction is 500 virtual bytes total, then the |
| 40 | + replacement pays a fee at least 500 satoshis higher than the sum of the original transactions. |
| 41 | + |
| 42 | + *Rationale*: Try to prevent DoS attacks where an attacker causes the network to repeatedly relay |
| 43 | + transactions each paying a tiny additional amount in fees, e.g. just 1 satoshi. |
| 44 | + |
| 45 | +5. The number of original transactions does not exceed 100. More precisely, the sum of all |
| 46 | + directly conflicting transactions' descendant counts (number of transactions inclusive of itself |
| 47 | + and its descendants) must not exceed 100; it is possible that this overestimates the true number |
| 48 | + of original transactions. |
| 49 | + |
| 50 | + *Rationale*: Try to prevent DoS attacks where an attacker is able to easily occupy and flush out |
| 51 | + significant portions of the node's mempool using replacements with multiple directly conflicting |
| 52 | + transactions, each with large descendant sets. |
| 53 | + |
| 54 | +This set of rules is similar but distinct from BIP125. |
| 55 | + |
| 56 | +## History |
| 57 | + |
| 58 | +* Opt-in full replace-by-fee (without inherited signaling) honoured in mempool and mining as of |
| 59 | + **v0.12.0** ([PR 6871](https://github.com/bitcoin/bitcoin/pull/6871)). |
| 60 | + |
| 61 | +* [BIP125](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki) defined based on |
| 62 | + Bitcoin Core implementation. |
| 63 | + |
| 64 | +* The incremental relay feerate used to calculate the required additional fees is distinct from |
| 65 | + `minRelayTxFee` and configurable using `-incrementalrelayfee` |
| 66 | + ([PR #9380](https://github.com/bitcoin/bitcoin/pull/9380)). |
| 67 | + |
| 68 | +* RBF enabled by default in the wallet GUI as of **v0.18.1** ([PR |
| 69 | + #11605](https://github.com/bitcoin/bitcoin/pull/11605)). |
0 commit comments