Bitcoin Core  25.99.0
P2P Digital Currency
fees.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2022 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 #ifndef BITCOIN_POLICY_FEES_H
6 #define BITCOIN_POLICY_FEES_H
7 
8 #include <consensus/amount.h>
9 #include <policy/feerate.h>
10 #include <random.h>
11 #include <sync.h>
12 #include <threadsafety.h>
13 #include <uint256.h>
14 #include <util/fs.h>
15 
16 #include <array>
17 #include <map>
18 #include <memory>
19 #include <set>
20 #include <string>
21 #include <vector>
22 
23 class AutoFile;
24 class CTxMemPoolEntry;
25 class TxConfirmStats;
26 
27 /* Identifier for each of the 3 different TxConfirmStats which will track
28  * history over different time horizons. */
29 enum class FeeEstimateHorizon {
33 };
34 
35 static constexpr auto ALL_FEE_ESTIMATE_HORIZONS = std::array{
39 };
40 
42 
43 /* Enumeration of reason for returned fee estimate */
44 enum class FeeReason {
45  NONE,
51  PAYTXFEE,
52  FALLBACK,
53  REQUIRED,
54 };
55 
56 /* Used to return detailed information about a feerate bucket */
58 {
59  double start = -1;
60  double end = -1;
61  double withinTarget = 0;
62  double totalConfirmed = 0;
63  double inMempool = 0;
64  double leftMempool = 0;
65 };
66 
67 /* Used to return detailed information about a fee estimate calculation */
69 {
72  double decay = 0;
73  unsigned int scale = 0;
74 };
75 
77 {
80  int desiredTarget = 0;
81  int returnedTarget = 0;
82 };
83 
133 {
134 private:
136  static constexpr unsigned int SHORT_BLOCK_PERIODS = 12;
137  static constexpr unsigned int SHORT_SCALE = 1;
139  static constexpr unsigned int MED_BLOCK_PERIODS = 24;
140  static constexpr unsigned int MED_SCALE = 2;
142  static constexpr unsigned int LONG_BLOCK_PERIODS = 42;
143  static constexpr unsigned int LONG_SCALE = 24;
145  static const unsigned int OLDEST_ESTIMATE_HISTORY = 6 * 1008;
146 
148  static constexpr double SHORT_DECAY = .962;
150  static constexpr double MED_DECAY = .9952;
152  static constexpr double LONG_DECAY = .99931;
153 
155  static constexpr double HALF_SUCCESS_PCT = .6;
157  static constexpr double SUCCESS_PCT = .85;
159  static constexpr double DOUBLE_SUCCESS_PCT = .95;
160 
162  static constexpr double SUFFICIENT_FEETXS = 0.1;
164  static constexpr double SUFFICIENT_TXS_SHORT = 0.5;
165 
173  static constexpr double MIN_BUCKET_FEERATE = 1000;
174  static constexpr double MAX_BUCKET_FEERATE = 1e7;
175 
181  static constexpr double FEE_SPACING = 1.05;
182 
184 public:
186  CBlockPolicyEstimator(const fs::path& estimation_filepath);
188 
190  void processBlock(unsigned int nBlockHeight,
191  std::vector<const CTxMemPoolEntry*>& entries)
193 
195  void processTransaction(const CTxMemPoolEntry& entry, bool validFeeEstimate)
197 
199  bool removeTx(uint256 hash, bool inBlock)
201 
203  CFeeRate estimateFee(int confTarget) const
205 
211  CFeeRate estimateSmartFee(int confTarget, FeeCalculation *feeCalc, bool conservative) const
213 
218  CFeeRate estimateRawFee(int confTarget, double successThreshold, FeeEstimateHorizon horizon,
219  EstimationResult* result = nullptr) const
221 
223  bool Write(AutoFile& fileout) const
225 
227  bool Read(AutoFile& filein)
229 
231  void FlushUnconfirmed()
233 
235  unsigned int HighestTargetTracked(FeeEstimateHorizon horizon) const
237 
239  void Flush()
241 
242 private:
244 
245  unsigned int nBestSeenHeight GUARDED_BY(m_cs_fee_estimator){0};
246  unsigned int firstRecordedHeight GUARDED_BY(m_cs_fee_estimator){0};
247  unsigned int historicalFirst GUARDED_BY(m_cs_fee_estimator){0};
248  unsigned int historicalBest GUARDED_BY(m_cs_fee_estimator){0};
249 
250  struct TxStatsInfo
251  {
252  unsigned int blockHeight{0};
253  unsigned int bucketIndex{0};
255  };
256 
257  // map of txids to information about that transaction
258  std::map<uint256, TxStatsInfo> mapMemPoolTxs GUARDED_BY(m_cs_fee_estimator);
259 
261  std::unique_ptr<TxConfirmStats> feeStats PT_GUARDED_BY(m_cs_fee_estimator);
262  std::unique_ptr<TxConfirmStats> shortStats PT_GUARDED_BY(m_cs_fee_estimator);
263  std::unique_ptr<TxConfirmStats> longStats PT_GUARDED_BY(m_cs_fee_estimator);
264 
265  unsigned int trackedTxs GUARDED_BY(m_cs_fee_estimator){0};
266  unsigned int untrackedTxs GUARDED_BY(m_cs_fee_estimator){0};
267 
268  std::vector<double> buckets GUARDED_BY(m_cs_fee_estimator); // The upper-bound of the range for the bucket (inclusive)
269  std::map<double, unsigned int> bucketMap GUARDED_BY(m_cs_fee_estimator); // Map of bucket upper-bound to index into all vectors by bucket
270 
272  bool processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry* entry) EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
273 
275  double estimateCombinedFee(unsigned int confTarget, double successThreshold, bool checkShorterHorizon, EstimationResult *result) const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
277  double estimateConservativeFee(unsigned int doubleTarget, EstimationResult *result) const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator);
284 
286  bool _removeTx(const uint256& hash, bool inBlock)
288 };
289 
291 {
292 private:
293  static constexpr double MAX_FILTER_FEERATE = 1e7;
298  static constexpr double FEE_FILTER_SPACING = 1.1;
299 
300 public:
302  explicit FeeFilterRounder(const CFeeRate& min_incremental_fee);
303 
305  CAmount round(CAmount currentMinFee) EXCLUSIVE_LOCKS_REQUIRED(!m_insecure_rand_mutex);
306 
307 private:
308  const std::set<double> m_fee_set;
310  FastRandomContext insecure_rand GUARDED_BY(m_insecure_rand_mutex);
311 };
312 
313 #endif // BITCOIN_POLICY_FEES_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
Non-refcounted RAII wrapper for FILE*.
Definition: streams.h:480
The BlockPolicyEstimator is used for estimating the feerate needed for a transaction to be included i...
Definition: fees.h:133
static constexpr unsigned int LONG_SCALE
Definition: fees.h:143
void processTransaction(const CTxMemPoolEntry &entry, bool validFeeEstimate) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Process a transaction accepted to the mempool.
Definition: fees.cpp:557
unsigned int trackedTxs GUARDED_BY(m_cs_fee_estimator)
Definition: fees.h:265
static constexpr double SUCCESS_PCT
Require greater than 85% of X feerate transactions to be confirmed within Y blocks.
Definition: fees.h:157
static constexpr double MIN_BUCKET_FEERATE
Minimum and Maximum values for tracking feerates The MIN_BUCKET_FEERATE should just be set to the low...
Definition: fees.h:173
double estimateCombinedFee(unsigned int confTarget, double successThreshold, bool checkShorterHorizon, EstimationResult *result) const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
Helper for estimateSmartFee.
Definition: fees.cpp:763
std::unique_ptr< TxConfirmStats > longStats PT_GUARDED_BY(m_cs_fee_estimator)
void processBlock(unsigned int nBlockHeight, std::vector< const CTxMemPoolEntry * > &entries) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Process all the transactions that have been included in a block.
Definition: fees.cpp:624
static constexpr double FEE_SPACING
Spacing of FeeRate buckets We have to lump transactions into buckets based on feerate,...
Definition: fees.h:181
unsigned int nBestSeenHeight GUARDED_BY(m_cs_fee_estimator)
Definition: fees.h:245
static const unsigned int OLDEST_ESTIMATE_HISTORY
Historical estimates that are older than this aren't valid.
Definition: fees.h:145
void Flush() EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Drop still unconfirmed transactions and record current estimations, if the fee estimation file is pre...
Definition: fees.cpp:904
static constexpr double SUFFICIENT_FEETXS
Require an avg of 0.1 tx in the combined feerate bucket per block to have stat significance.
Definition: fees.h:162
static constexpr double MAX_BUCKET_FEERATE
Definition: fees.h:174
unsigned int historicalBest GUARDED_BY(m_cs_fee_estimator)
Definition: fees.h:248
CFeeRate estimateSmartFee(int confTarget, FeeCalculation *feeCalc, bool conservative) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Estimate feerate needed to get be included in a block within confTarget blocks.
Definition: fees.cpp:826
static constexpr unsigned int LONG_BLOCK_PERIODS
Track confirm delays up to 1008 blocks for long horizon.
Definition: fees.h:142
bool Write(AutoFile &fileout) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Write estimation data to a file.
Definition: fees.cpp:913
static constexpr double SHORT_DECAY
Decay of .962 is a half-life of 18 blocks or about 3 hours.
Definition: fees.h:148
Mutex m_cs_fee_estimator
Definition: fees.h:243
unsigned int HighestTargetTracked(FeeEstimateHorizon horizon) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Calculation of highest target that estimates are tracked for.
Definition: fees.cpp:718
unsigned int firstRecordedHeight GUARDED_BY(m_cs_fee_estimator)
Definition: fees.h:246
bool _removeTx(const uint256 &hash, bool inBlock) EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
A non-thread-safe helper for the removeTx function.
Definition: fees.cpp:515
static constexpr double LONG_DECAY
Decay of .99931 is a half-life of 1008 blocks or about 1 week.
Definition: fees.h:152
std::map< double, unsigned int > bucketMap GUARDED_BY(m_cs_fee_estimator)
double estimateConservativeFee(unsigned int doubleTarget, EstimationResult *result) const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
Helper for estimateSmartFee.
Definition: fees.cpp:802
static constexpr double HALF_SUCCESS_PCT
Require greater than 60% of X feerate transactions to be confirmed within Y/2 blocks.
Definition: fees.h:155
static constexpr double MED_DECAY
Decay of .9952 is a half-life of 144 blocks or about 1 day.
Definition: fees.h:150
CBlockPolicyEstimator(const fs::path &estimation_filepath)
Create new BlockPolicyEstimator and initialize stats tracking classes with default values.
Definition: fees.cpp:530
unsigned int historicalFirst GUARDED_BY(m_cs_fee_estimator)
Definition: fees.h:247
CFeeRate estimateFee(int confTarget) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
DEPRECATED.
Definition: fees.cpp:673
unsigned int MaxUsableEstimate() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
Calculation of highest target that reasonable estimate can be provided for.
Definition: fees.cpp:753
static constexpr unsigned int SHORT_SCALE
Definition: fees.h:137
unsigned int BlockSpan() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
Number of blocks of data recorded while fee estimates have been running.
Definition: fees.cpp:735
bool removeTx(uint256 hash, bool inBlock) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Remove a transaction from the mempool tracking stats.
Definition: fees.cpp:509
bool Read(AutoFile &filein) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Read estimation data from a file.
Definition: fees.cpp:938
static constexpr unsigned int SHORT_BLOCK_PERIODS
Track confirm delays up to 12 blocks for short horizon.
Definition: fees.h:136
static constexpr double DOUBLE_SUCCESS_PCT
Require greater than 95% of X feerate transactions to be confirmed within 2 * Y blocks.
Definition: fees.h:159
unsigned int HistoricalBlockSpan() const EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
Number of blocks of recorded fee estimate data represented in saved data file.
Definition: fees.cpp:743
void FlushUnconfirmed() EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Empty mempool transactions on shutdown to record failure to confirm for txs still in mempool.
Definition: fees.cpp:1000
CFeeRate estimateRawFee(int confTarget, double successThreshold, FeeEstimateHorizon horizon, EstimationResult *result=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(!m_cs_fee_estimator)
Return a specific fee estimate calculation with a given success threshold and time horizon,...
Definition: fees.cpp:682
unsigned int untrackedTxs GUARDED_BY(m_cs_fee_estimator)
Definition: fees.h:266
bool processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry *entry) EXCLUSIVE_LOCKS_REQUIRED(m_cs_fee_estimator)
Process a transaction confirmed in a block.
Definition: fees.cpp:596
std::unique_ptr< TxConfirmStats > shortStats PT_GUARDED_BY(m_cs_fee_estimator)
static constexpr double SUFFICIENT_TXS_SHORT
Require an avg of 0.5 tx when using short decay since there are fewer blocks considered.
Definition: fees.h:164
static constexpr unsigned int MED_SCALE
Definition: fees.h:140
static constexpr unsigned int MED_BLOCK_PERIODS
Track confirm delays up to 48 blocks for medium horizon.
Definition: fees.h:139
std::unique_ptr< TxConfirmStats > feeStats PT_GUARDED_BY(m_cs_fee_estimator)
Classes to track historical data on transaction confirmations.
const fs::path m_estimation_filepath
Definition: fees.h:183
std::map< uint256, TxStatsInfo > mapMemPoolTxs GUARDED_BY(m_cs_fee_estimator)
std::vector< double > buckets GUARDED_BY(m_cs_fee_estimator)
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
Definition: feerate.h:33
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
Definition: mempool_entry.h:66
Fast randomness source.
Definition: random.h:144
const std::set< double > m_fee_set
Definition: fees.h:308
FastRandomContext insecure_rand GUARDED_BY(m_insecure_rand_mutex)
Mutex m_insecure_rand_mutex
Definition: fees.h:309
We will instantiate an instance of this class to track transactions that were included in a block.
Definition: fees.cpp:74
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:31
256-bit opaque blob.
Definition: uint256.h:105
@ CONSERVATIVE
Force estimateSmartFee to use conservative estimates.
static constexpr auto ALL_FEE_ESTIMATE_HORIZONS
Definition: fees.h:35
FeeEstimateHorizon
Definition: fees.h:29
std::string StringForFeeEstimateHorizon(FeeEstimateHorizon horizon)
Definition: fees.cpp:36
FeeReason
Definition: fees.h:44
EstimatorBucket fail
Definition: fees.h:71
EstimatorBucket pass
Definition: fees.h:70
double decay
Definition: fees.h:72
unsigned int scale
Definition: fees.h:73
double totalConfirmed
Definition: fees.h:62
double end
Definition: fees.h:60
double leftMempool
Definition: fees.h:64
double start
Definition: fees.h:59
double withinTarget
Definition: fees.h:61
double inMempool
Definition: fees.h:63
int returnedTarget
Definition: fees.h:81
int desiredTarget
Definition: fees.h:80
FeeReason reason
Definition: fees.h:79
EstimationResult est
Definition: fees.h:78
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49