Bitcoin Core  27.99.0
P2P Digital Currency
Functions
rbf.cpp File Reference
#include <policy/rbf.h>
#include <consensus/amount.h>
#include <kernel/mempool_entry.h>
#include <policy/feerate.h>
#include <primitives/transaction.h>
#include <sync.h>
#include <tinyformat.h>
#include <txmempool.h>
#include <uint256.h>
#include <util/check.h>
#include <util/moneystr.h>
#include <util/rbf.h>
#include <limits>
#include <vector>
#include <compare>
Include dependency graph for rbf.cpp:

Go to the source code of this file.

Functions

RBFTransactionState IsRBFOptIn (const CTransaction &tx, const CTxMemPool &pool)
 Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This involves checking sequence numbers of the transaction, as well as the sequence numbers of all in-mempool ancestors. More...
 
RBFTransactionState IsRBFOptInEmptyMempool (const CTransaction &tx)
 
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. More...
 
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 of the original transactions. More...
 
std::optional< std::string > EntriesAndTxidsDisjoint (const CTxMemPool::setEntries &ancestors, const std::set< Txid > &direct_conflicts, const uint256 &txid)
 Check the intersection between two sets of transactions (a set of mempool entries and a set of txids) to make sure they are disjoint. More...
 
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 transactions in iters_conflicting. More...
 
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. More...
 
std::optional< std::pair< DiagramCheckError, std::string > > ImprovesFeerateDiagram (CTxMemPool &pool, const CTxMemPool::setEntries &direct_conflicts, const CTxMemPool::setEntries &all_conflicts, CAmount replacement_fees, int64_t replacement_vsize)
 The replacement transaction must improve the feerate diagram of the mempool. More...
 

Function Documentation

◆ EntriesAndTxidsDisjoint()

std::optional<std::string> EntriesAndTxidsDisjoint ( const CTxMemPool::setEntries ancestors,
const std::set< Txid > &  direct_conflicts,
const uint256 txid 
)

Check the intersection between two sets of transactions (a set of mempool entries and a set of txids) to make sure they are disjoint.

Parameters
[in]ancestorsSet of mempool entries corresponding to ancestors of the replacement transactions.
[in]direct_conflictsSet of txids corresponding to the mempool conflicts (candidates to be replaced).
[in]txidTransaction ID, included in the error message if violation occurs.
Returns
error message if the sets intersect, std::nullopt if they are disjoint.

Definition at line 119 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetEntriesForConflicts()

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.

Checks that there are no more than MAX_REPLACEMENT_CANDIDATES potential entries. May overestimate if the entries in iters_conflicting have overlapping descendants.

Parameters
[in]iters_conflictingThe set of iterators to mempool entries.
[out]all_conflictsPopulated with all the mempool entries that would be replaced, which includes iters_conflicting and all entries' descendants. Not cleared at the start; any existing mempool entries will remain in the set.
Returns
an error message if MAX_REPLACEMENT_CANDIDATES may be exceeded, otherwise a std::nullopt.

Definition at line 59 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ HasNoNewUnconfirmed()

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 of the original transactions.

Returns
error message if tx spends unconfirmed inputs not also spent by iters_conflicting, otherwise std::nullopt.

Definition at line 87 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ImprovesFeerateDiagram()

std::optional<std::pair<DiagramCheckError, std::string> > ImprovesFeerateDiagram ( CTxMemPool pool,
const CTxMemPool::setEntries direct_conflicts,
const CTxMemPool::setEntries all_conflicts,
CAmount  replacement_fees,
int64_t  replacement_vsize 
)

The replacement transaction must improve the feerate diagram of the mempool.

Parameters
[in]poolThe mempool.
[in]direct_conflictsSet of in-mempool txids corresponding to the direct conflicts i.e. input double-spends with the proposed transaction
[in]all_conflictsSet of mempool entries corresponding to all transactions to be evicted
[in]replacement_feesFees of proposed replacement package
[in]replacement_vsizeSize of proposed replacement package
Returns
error type and string if mempool diagram doesn't improve, otherwise std::nullopt.

Definition at line 187 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsRBFOptIn()

RBFTransactionState IsRBFOptIn ( const CTransaction tx,
const CTxMemPool pool 
)

Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This involves checking sequence numbers of the transaction, as well as the sequence numbers of all in-mempool ancestors.

Parameters
txThe unconfirmed transaction
poolThe mempool, which may contain the tx
Returns
The rbf state

Definition at line 24 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsRBFOptInEmptyMempool()

RBFTransactionState IsRBFOptInEmptyMempool ( const CTransaction tx)

Definition at line 53 of file rbf.cpp.

Here is the call graph for this function:

◆ PaysForRBF()

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.

The additional fees must pay for the replacement's bandwidth at or above the incremental relay feerate.

Parameters
[in]original_feesTotal modified fees of original transaction(s).
[in]replacement_feesTotal modified fees of replacement transaction(s).
[in]replacement_vsizeTotal virtual size of replacement transaction(s).
[in]relay_feeThe node's minimum feerate for transaction relay.
[in]txidTransaction ID, included in the error message if violation occurs.
Returns
error string if fees are insufficient, otherwise std::nullopt.

Definition at line 160 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PaysMoreThanConflicts()

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 transactions in iters_conflicting.

Parameters
[in]iters_conflictingThe set of mempool entries.
Returns
error message if fees insufficient, otherwise std::nullopt.

Definition at line 134 of file rbf.cpp.

Here is the call graph for this function:
Here is the caller graph for this function: