Bitcoin Core  26.1.0
P2P Digital Currency
rbf.cpp
Go to the documentation of this file.
1 // Copyright (c) 2016-2022 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <policy/rbf.h>
6 
7 #include <consensus/amount.h>
8 #include <kernel/mempool_entry.h>
9 #include <policy/feerate.h>
10 #include <primitives/transaction.h>
11 #include <sync.h>
12 #include <tinyformat.h>
13 #include <txmempool.h>
14 #include <uint256.h>
15 #include <util/moneystr.h>
16 #include <util/rbf.h>
17 
18 #include <limits>
19 #include <vector>
20 
22 {
23  AssertLockHeld(pool.cs);
24 
25  // First check the transaction itself.
26  if (SignalsOptInRBF(tx)) {
28  }
29 
30  // If this transaction is not in our mempool, then we can't be sure
31  // we will know about all its inputs.
32  if (!pool.exists(GenTxid::Txid(tx.GetHash()))) {
34  }
35 
36  // If all the inputs have nSequence >= maxint-1, it still might be
37  // signaled for RBF if any unconfirmed parents have signaled.
38  const CTxMemPoolEntry entry{*pool.mapTx.find(tx.GetHash())};
39  auto ancestors{pool.AssumeCalculateMemPoolAncestors(__func__, entry, CTxMemPool::Limits::NoLimits(),
40  /*fSearchForParents=*/false)};
41 
42  for (CTxMemPool::txiter it : ancestors) {
43  if (SignalsOptInRBF(it->GetTx())) {
45  }
46  }
48 }
49 
51 {
52  // If we don't have a local mempool we can only check the transaction itself.
54 }
55 
56 std::optional<std::string> GetEntriesForConflicts(const CTransaction& tx,
57  CTxMemPool& pool,
58  const CTxMemPool::setEntries& iters_conflicting,
59  CTxMemPool::setEntries& all_conflicts)
60 {
61  AssertLockHeld(pool.cs);
62  const uint256 txid = tx.GetHash();
63  uint64_t nConflictingCount = 0;
64  for (const auto& mi : iters_conflicting) {
65  nConflictingCount += mi->GetCountWithDescendants();
66  // Rule #5: don't consider replacing more than MAX_REPLACEMENT_CANDIDATES
67  // entries from the mempool. This potentially overestimates the number of actual
68  // descendants (i.e. if multiple conflicts share a descendant, it will be counted multiple
69  // times), but we just want to be conservative to avoid doing too much work.
70  if (nConflictingCount > MAX_REPLACEMENT_CANDIDATES) {
71  return strprintf("rejecting replacement %s; too many potential replacements (%d > %d)\n",
72  txid.ToString(),
73  nConflictingCount,
75  }
76  }
77  // Calculate the set of all transactions that would have to be evicted.
78  for (CTxMemPool::txiter it : iters_conflicting) {
79  pool.CalculateDescendants(it, all_conflicts);
80  }
81  return std::nullopt;
82 }
83 
84 std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx,
85  const CTxMemPool& pool,
86  const CTxMemPool::setEntries& iters_conflicting)
87 {
88  AssertLockHeld(pool.cs);
89  std::set<uint256> parents_of_conflicts;
90  for (const auto& mi : iters_conflicting) {
91  for (const CTxIn& txin : mi->GetTx().vin) {
92  parents_of_conflicts.insert(txin.prevout.hash);
93  }
94  }
95 
96  for (unsigned int j = 0; j < tx.vin.size(); j++) {
97  // Rule #2: We don't want to accept replacements that require low feerate junk to be
98  // mined first. Ideally we'd keep track of the ancestor feerates and make the decision
99  // based on that, but for now requiring all new inputs to be confirmed works.
100  //
101  // Note that if you relax this to make RBF a little more useful, this may break the
102  // CalculateMempoolAncestors RBF relaxation which subtracts the conflict count/size from the
103  // descendant limit.
104  if (!parents_of_conflicts.count(tx.vin[j].prevout.hash)) {
105  // Rather than check the UTXO set - potentially expensive - it's cheaper to just check
106  // if the new input refers to a tx that's in the mempool.
107  if (pool.exists(GenTxid::Txid(tx.vin[j].prevout.hash))) {
108  return strprintf("replacement %s adds unconfirmed input, idx %d",
109  tx.GetHash().ToString(), j);
110  }
111  }
112  }
113  return std::nullopt;
114 }
115 
116 std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
117  const std::set<uint256>& direct_conflicts,
118  const uint256& txid)
119 {
120  for (CTxMemPool::txiter ancestorIt : ancestors) {
121  const uint256& hashAncestor = ancestorIt->GetTx().GetHash();
122  if (direct_conflicts.count(hashAncestor)) {
123  return strprintf("%s spends conflicting transaction %s",
124  txid.ToString(),
125  hashAncestor.ToString());
126  }
127  }
128  return std::nullopt;
129 }
130 
131 std::optional<std::string> PaysMoreThanConflicts(const CTxMemPool::setEntries& iters_conflicting,
132  CFeeRate replacement_feerate,
133  const uint256& txid)
134 {
135  for (const auto& mi : iters_conflicting) {
136  // Don't allow the replacement to reduce the feerate of the mempool.
137  //
138  // We usually don't want to accept replacements with lower feerates than what they replaced
139  // as that would lower the feerate of the next block. Requiring that the feerate always be
140  // increased is also an easy-to-reason about way to prevent DoS attacks via replacements.
141  //
142  // We only consider the feerates of transactions being directly replaced, not their indirect
143  // descendants. While that does mean high feerate children are ignored when deciding whether
144  // or not to replace, we do require the replacement to pay more overall fees too, mitigating
145  // most cases.
146  CFeeRate original_feerate(mi->GetModifiedFee(), mi->GetTxSize());
147  if (replacement_feerate <= original_feerate) {
148  return strprintf("rejecting replacement %s; new feerate %s <= old feerate %s",
149  txid.ToString(),
150  replacement_feerate.ToString(),
151  original_feerate.ToString());
152  }
153  }
154  return std::nullopt;
155 }
156 
157 std::optional<std::string> PaysForRBF(CAmount original_fees,
158  CAmount replacement_fees,
159  size_t replacement_vsize,
160  CFeeRate relay_fee,
161  const uint256& txid)
162 {
163  // Rule #3: The replacement fees must be greater than or equal to fees of the
164  // transactions it replaces, otherwise the bandwidth used by those conflicting transactions
165  // would not be paid for.
166  if (replacement_fees < original_fees) {
167  return strprintf("rejecting replacement %s, less fees than conflicting txs; %s < %s",
168  txid.ToString(), FormatMoney(replacement_fees), FormatMoney(original_fees));
169  }
170 
171  // Rule #4: The new transaction must pay for its own bandwidth. Otherwise, we have a DoS
172  // vector where attackers can cause a transaction to be replaced (and relayed) repeatedly by
173  // increasing the fee by tiny amounts.
174  CAmount additional_fees = replacement_fees - original_fees;
175  if (additional_fees < relay_fee.GetFee(replacement_vsize)) {
176  return strprintf("rejecting replacement %s, not enough additional fees to relay; %s < %s",
177  txid.ToString(),
178  FormatMoney(additional_fees),
179  FormatMoney(relay_fee.GetFee(replacement_vsize)));
180  }
181  return std::nullopt;
182 }
std::optional< std::string > PaysForRBF(CAmount original_fees, CAmount replacement_fees, size_t replacement_vsize, CFeeRate relay_fee, const uint256 &txid)
The replacement transaction must pay more fees than the original transactions.
Definition: rbf.cpp:157
AssertLockHeld(pool.cs)
std::optional< std::string > PaysMoreThanConflicts(const CTxMemPool::setEntries &iters_conflicting, CFeeRate replacement_feerate, const uint256 &txid)
Check that the feerate of the replacement transaction(s) is higher than the feerate of each of the tr...
Definition: rbf.cpp:131
indexed_transaction_set::nth_index< 0 >::type::const_iterator txiter
Definition: txmempool.h:394
RBFTransactionState IsRBFOptIn(const CTransaction &tx, const CTxMemPool &pool)
Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This inv...
Definition: rbf.cpp:21
static constexpr uint32_t MAX_REPLACEMENT_CANDIDATES
Maximum number of transactions that can be replaced by RBF (Rule #5).
Definition: rbf.h:24
std::optional< std::string > HasNoNewUnconfirmed(const CTransaction &tx, const CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting)
The replacement transaction may only include an unconfirmed input if that input was included in one o...
Definition: rbf.cpp:84
Either this tx or a mempool ancestor signals rbf.
bool exists(const GenTxid &gtxid) const
Definition: txmempool.h:678
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1162
Unconfirmed tx that does not signal rbf and is not in the mempool.
void CalculateDescendants(txiter it, setEntries &setDescendants) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Populate setDescendants with all in-mempool descendants of hash.
Definition: txmempool.cpp:544
std::optional< std::string > EntriesAndTxidsDisjoint(const CTxMemPool::setEntries &ancestors, const std::set< uint256 > &direct_conflicts, const uint256 &txid)
Check the intersection between two sets of transactions (a set of mempool entries and a set of txids)...
Definition: rbf.cpp:116
std::set< txiter, CompareIteratorByHash > setEntries
Definition: txmempool.h:397
bool SignalsOptInRBF(const CTransaction &tx)
Check whether the sequence numbers on this transaction are signaling opt-in to replace-by-fee, according to BIP 125.
Definition: rbf.cpp:9
setEntries AssumeCalculateMemPoolAncestors(std::string_view calling_fn_name, const CTxMemPoolEntry &entry, const Limits &limits, bool fSearchForParents=true) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Same as CalculateMemPoolAncestors, but always returns a (non-optional) setEntries.
Definition: txmempool.cpp:275
const std::vector< CTxIn > vin
Definition: transaction.h:305
RBFTransactionState
The rbf state of unconfirmed transactions.
Definition: rbf.h:27
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
Definition: mempool_entry.h:65
std::optional< std::string > GetEntriesForConflicts(const CTransaction &tx, CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting, CTxMemPool::setEntries &all_conflicts)
Get all descendants of iters_conflicting.
Definition: rbf.cpp:56
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
Definition: rbf.cpp:50
An input of a transaction.
Definition: transaction.h:74
const uint256 & GetHash() const
Definition: transaction.h:337
std::string ToString(const FeeEstimateMode &fee_estimate_mode=FeeEstimateMode::BTC_KVB) const
Definition: feerate.cpp:39
std::string ToString() const
Definition: uint256.cpp:55
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
Definition: moneystr.cpp:16
256-bit opaque blob.
Definition: uint256.h:106
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition: txmempool.h:301
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
Definition: feerate.h:32
CAmount GetFee(uint32_t num_bytes) const
Return the fee in satoshis for the given vsize in vbytes.
Definition: feerate.cpp:23
static constexpr MemPoolLimits NoLimits()
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:294
static GenTxid Txid(const uint256 &hash)
Definition: transaction.h:432
RecursiveMutex cs
This mutex needs to be locked when accessing mapTx or other members that are guarded by it...
Definition: txmempool.h:391
Neither this tx nor a mempool ancestor signals rbf.