PIVX Core  5.6.99
P2P Digital Currency
Classes | Public Member Functions | Private Attributes | List of all members
CBlockPolicyEstimator Class Reference

We want to be able to estimate feerates or priorities that are needed on tx's to be included in a certain number of blocks. More...

#include <fees.h>

Collaboration diagram for CBlockPolicyEstimator:
[legend]

Classes

struct  TxStatsInfo
 

Public Member Functions

 CBlockPolicyEstimator (const CFeeRate &minRelayFee)
 Create new BlockPolicyEstimator and initialize stats tracking classes with default values. More...
 
void processBlock (unsigned int nBlockHeight, std::vector< const CTxMemPoolEntry * > &entries)
 Process all the transactions that have been included in a block. More...
 
bool processBlockTx (unsigned int nBlockHeight, const CTxMemPoolEntry *entry)
 Process a transaction confirmed in a block. More...
 
void processTransaction (const CTxMemPoolEntry &entry, bool validFeeEstimate)
 Process a transaction accepted to the mempool. More...
 
bool removeTx (const uint256 &hash)
 Remove a transaction from the mempool tracking stats. More...
 
CFeeRate estimateFee (int confTarget)
 Return a feerate estimate. More...
 
CFeeRate estimateSmartFee (int confTarget, int *answerFoundAtTarget, const CTxMemPool &pool)
 Estimate feerate needed to get be included in a block within confTarget blocks. More...
 
void Write (CAutoFile &fileout)
 Write estimation data to a file. More...
 
void Read (CAutoFile &filein, int nFileVersion)
 Read estimation data from a file. More...
 

Private Attributes

CFeeRate minTrackedFee
 
unsigned int nBestSeenHeight
 Passed to constructor to avoid dependency on main. More...
 
std::map< uint256, TxStatsInfomapMemPoolTxs
 
TxConfirmStats feeStats
 Classes to track historical data on transaction confirmations. More...
 
unsigned int trackedTxs
 
unsigned int untrackedTxs
 

Detailed Description

We want to be able to estimate feerates or priorities that are needed on tx's to be included in a certain number of blocks.

The BlockPolicyEstimator is used for estimating the feerate needed for a transaction to be included in a block within a certain number of blocks.

Every time a block is added to the best chain, this class records stats on the transactions included in that block

At a high level the algorithm works by grouping transactions into buckets based on having similar feerates and then tracking how long it takes transactions in the various buckets to be mined. It operates under the assumption that in general transactions of higher feerate will be included in blocks before transactions of lower feerate. So for example if you wanted to know what feerate you should put on a transaction to be included in a block within the next 5 blocks, you would start by looking at the bucket with with the highest feerate transactions and verifying that a sufficiently high percentage of them were confirmed within 5 blocks and then you would look at the next highest feerate bucket, and so on, stopping at the last bucket to pass the test. The average feerate of transactions in this bucket will give you an indication of the lowest feerate you can put on a transaction and still have a sufficiently high chance of being confirmed within your desired 5 blocks.

Here is a brief description of the implementation: When a transaction enters the mempool, we track the height of the block chain at entry. Whenever a block comes in, we count the number of transactions in each bucket and the total amount of feerate paid in each bucket. Then we calculate how many blocks Y it took each transaction to be mined and we track an array of counters in each bucket for how long it to took transactions to get confirmed from 1 to a max of 25 and we increment all the counters from Y up to 25. This is because for any number Z>=Y the transaction was successfully mined within Z blocks. We want to save a history of this information, so at any time we have a counter of the total number of transactions that happened in a given feerate bucket and the total number that were confirmed in each number 1-25 blocks or less for any bucket. We save this history by keeping an exponentially decaying moving average of each one of these stats. Furthermore we also keep track of the number unmined (in mempool) transactions in each bucket and for how many blocks they have been outstanding and use that to increase the number of transactions we've seen in that feerate bucket when calculating an estimate for any number of confirmations below the number of blocks they've been outstanding.

Definition at line 200 of file fees.h.

Constructor & Destructor Documentation

◆ CBlockPolicyEstimator()

CBlockPolicyEstimator::CBlockPolicyEstimator ( const CFeeRate minRelayFee)
explicit

Create new BlockPolicyEstimator and initialize stats tracking classes with default values.

Definition at line 298 of file fees.cpp.

Member Function Documentation

◆ estimateFee()

CFeeRate CBlockPolicyEstimator::estimateFee ( int  confTarget)

Return a feerate estimate.

Definition at line 416 of file fees.cpp.

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

◆ estimateSmartFee()

CFeeRate CBlockPolicyEstimator::estimateSmartFee ( int  confTarget,
int *  answerFoundAtTarget,
const CTxMemPool pool 
)

Estimate feerate needed to get be included in a block within confTarget blocks.

If no answer can be given at confTarget, return an estimate at the lowest target where one can be given.

Definition at line 430 of file fees.cpp.

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

◆ processBlock()

void CBlockPolicyEstimator::processBlock ( unsigned int  nBlockHeight,
std::vector< const CTxMemPoolEntry * > &  entries 
)

Process all the transactions that have been included in a block.

Definition at line 379 of file fees.cpp.

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

◆ processBlockTx()

bool CBlockPolicyEstimator::processBlockTx ( unsigned int  nBlockHeight,
const CTxMemPoolEntry entry 
)

Process a transaction confirmed in a block.

Definition at line 349 of file fees.cpp.

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

◆ processTransaction()

void CBlockPolicyEstimator::processTransaction ( const CTxMemPoolEntry entry,
bool  validFeeEstimate 
)

Process a transaction accepted to the mempool.

Definition at line 311 of file fees.cpp.

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

◆ Read()

void CBlockPolicyEstimator::Read ( CAutoFile filein,
int  nFileVersion 
)

Read estimation data from a file.

Definition at line 463 of file fees.cpp.

Here is the call graph for this function:

◆ removeTx()

bool CBlockPolicyEstimator::removeTx ( const uint256 hash)

Remove a transaction from the mempool tracking stats.

Definition at line 287 of file fees.cpp.

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

◆ Write()

void CBlockPolicyEstimator::Write ( CAutoFile fileout)

Write estimation data to a file.

Definition at line 457 of file fees.cpp.

Here is the call graph for this function:

Member Data Documentation

◆ feeStats

TxConfirmStats CBlockPolicyEstimator::feeStats
private

Classes to track historical data on transaction confirmations.

Definition at line 248 of file fees.h.

◆ mapMemPoolTxs

std::map<uint256, TxStatsInfo> CBlockPolicyEstimator::mapMemPoolTxs
private

Definition at line 245 of file fees.h.

◆ minTrackedFee

CFeeRate CBlockPolicyEstimator::minTrackedFee
private

Definition at line 235 of file fees.h.

◆ nBestSeenHeight

unsigned int CBlockPolicyEstimator::nBestSeenHeight
private

Passed to constructor to avoid dependency on main.

Definition at line 236 of file fees.h.

◆ trackedTxs

unsigned int CBlockPolicyEstimator::trackedTxs
private

Definition at line 250 of file fees.h.

◆ untrackedTxs

unsigned int CBlockPolicyEstimator::untrackedTxs
private

Definition at line 251 of file fees.h.


The documentation for this class was generated from the following files: