Bitcoin Core  27.99.0
P2P Digital Currency
rbf.h
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 #ifndef BITCOIN_POLICY_RBF_H
6 #define BITCOIN_POLICY_RBF_H
7 
8 #include <consensus/amount.h>
10 #include <threadsafety.h>
11 #include <txmempool.h>
12 #include <util/feefrac.h>
13 
14 #include <compare>
15 #include <cstddef>
16 #include <cstdint>
17 #include <optional>
18 #include <set>
19 #include <string>
20 
21 class CFeeRate;
22 class uint256;
23 
26 static constexpr uint32_t MAX_REPLACEMENT_CANDIDATES{100};
27 
29 enum class RBFTransactionState {
31  UNKNOWN,
35  FINAL,
36 };
37 
38 enum class DiagramCheckError {
42  FAILURE,
43 };
44 
58 
69 std::optional<std::string> GetEntriesForConflicts(const CTransaction& tx, CTxMemPool& pool,
70  const CTxMemPool::setEntries& iters_conflicting,
71  CTxMemPool::setEntries& all_conflicts)
72  EXCLUSIVE_LOCKS_REQUIRED(pool.cs);
73 
78 std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx, const CTxMemPool& pool,
79  const CTxMemPool::setEntries& iters_conflicting)
80  EXCLUSIVE_LOCKS_REQUIRED(pool.cs);
81 
91 std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
92  const std::set<Txid>& direct_conflicts,
93  const uint256& txid);
94 
100 std::optional<std::string> PaysMoreThanConflicts(const CTxMemPool::setEntries& iters_conflicting,
101  CFeeRate replacement_feerate, const uint256& txid);
102 
112 std::optional<std::string> PaysForRBF(CAmount original_fees,
113  CAmount replacement_fees,
114  size_t replacement_vsize,
115  CFeeRate relay_fee,
116  const uint256& txid);
117 
128 std::optional<std::pair<DiagramCheckError, std::string>> ImprovesFeerateDiagram(CTxMemPool& pool,
129  const CTxMemPool::setEntries& direct_conflicts,
130  const CTxMemPool::setEntries& all_conflicts,
131  CAmount replacement_fees,
132  int64_t replacement_vsize)
133  EXCLUSIVE_LOCKS_REQUIRED(pool.cs);
134 
135 #endif // BITCOIN_POLICY_RBF_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
Definition: feerate.h:33
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:296
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition: txmempool.h:302
std::set< txiter, CompareIteratorByHash > setEntries
Definition: txmempool.h:396
256-bit opaque blob.
Definition: uint256.h:106
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) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
The replacement transaction must improve the feerate diagram of the mempool.
Definition: rbf.cpp:187
std::optional< std::string > HasNoNewUnconfirmed(const CTransaction &tx, const CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
The replacement transaction may only include an unconfirmed input if that input was included in one o...
Definition: rbf.cpp:87
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:134
RBFTransactionState IsRBFOptIn(const CTransaction &tx, const CTxMemPool &pool) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This inv...
Definition: rbf.cpp:24
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:160
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
Definition: rbf.cpp:53
RBFTransactionState
The rbf state of unconfirmed transactions.
Definition: rbf.h:29
@ UNKNOWN
Unconfirmed tx that does not signal rbf and is not in the mempool.
@ FINAL
Neither this tx nor a mempool ancestor signals rbf.
@ REPLACEABLE_BIP125
Either this tx or a mempool ancestor signals rbf.
static constexpr uint32_t MAX_REPLACEMENT_CANDIDATES
Maximum number of transactions that can be replaced by RBF (Rule #5).
Definition: rbf.h:26
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)...
Definition: rbf.cpp:119
DiagramCheckError
Definition: rbf.h:38
@ FAILURE
New diagram wasn't strictly superior
@ UNCALCULABLE
Unable to calculate due to topology or other reason.
std::optional< std::string > GetEntriesForConflicts(const CTransaction &tx, CTxMemPool &pool, const CTxMemPool::setEntries &iters_conflicting, CTxMemPool::setEntries &all_conflicts) EXCLUSIVE_LOCKS_REQUIRED(pool.cs)
Get all descendants of iters_conflicting.
Definition: rbf.cpp:59
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49