Add LockPoints
Obtain LockPoints to store in CTxMemPoolEntry and during a reorg, evaluate whether they are still valid and if not, recalculate them.
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include "boost/multi_index/ordered_index.hpp"
|
||||
|
||||
class CAutoFile;
|
||||
class CBlockIndex;
|
||||
|
||||
inline double AllowFreeThreshold()
|
||||
{
|
||||
@@ -35,6 +36,21 @@ inline bool AllowFree(double dPriority)
|
||||
/** Fake height value used in CCoins to signify they are only in the memory pool (since 0.8) */
|
||||
static const unsigned int MEMPOOL_HEIGHT = 0x7FFFFFFF;
|
||||
|
||||
struct LockPoints
|
||||
{
|
||||
// Will be set to the blockchain height and median time past
|
||||
// values that would be necessary to satisfy all relative locktime
|
||||
// constraints (BIP68) of this tx given our view of block chain history
|
||||
int height;
|
||||
int64_t time;
|
||||
// As long as the current chain descends from the highest height block
|
||||
// containing one of the inputs used in the calculation, then the cached
|
||||
// values are still valid even after a reorg.
|
||||
CBlockIndex* maxInputBlock;
|
||||
|
||||
LockPoints() : height(0), time(0), maxInputBlock(NULL) { }
|
||||
};
|
||||
|
||||
class CTxMemPool;
|
||||
|
||||
/** \class CTxMemPoolEntry
|
||||
@@ -70,6 +86,7 @@ private:
|
||||
bool spendsCoinbase; //! keep track of transactions that spend a coinbase
|
||||
unsigned int sigOpCount; //! Legacy sig ops plus P2SH sig op count
|
||||
int64_t feeDelta; //! Used for determining the priority of the transaction for mining in a block
|
||||
LockPoints lockPoints; //! Track the height and time at which tx was final
|
||||
|
||||
// Information about descendants of this transaction that are in the
|
||||
// mempool; if we remove this transaction we must remove all of these
|
||||
@@ -84,7 +101,7 @@ public:
|
||||
CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee,
|
||||
int64_t _nTime, double _entryPriority, unsigned int _entryHeight,
|
||||
bool poolHasNoInputsOf, CAmount _inChainInputValue, bool spendsCoinbase,
|
||||
unsigned int nSigOps);
|
||||
unsigned int nSigOps, LockPoints lp);
|
||||
CTxMemPoolEntry(const CTxMemPoolEntry& other);
|
||||
|
||||
const CTransaction& GetTx() const { return this->tx; }
|
||||
@@ -101,12 +118,15 @@ public:
|
||||
unsigned int GetSigOpCount() const { return sigOpCount; }
|
||||
int64_t GetModifiedFee() const { return nFee + feeDelta; }
|
||||
size_t DynamicMemoryUsage() const { return nUsageSize; }
|
||||
const LockPoints& GetLockPoints() const { return lockPoints; }
|
||||
|
||||
// Adjusts the descendant state, if this entry is not dirty.
|
||||
void UpdateState(int64_t modifySize, CAmount modifyFee, int64_t modifyCount);
|
||||
// Updates the fee delta used for mining priority score, and the
|
||||
// modified fees with descendants.
|
||||
void UpdateFeeDelta(int64_t feeDelta);
|
||||
// Update the LockPoints after a reorg
|
||||
void UpdateLockPoints(const LockPoints& lp);
|
||||
|
||||
/** We can set the entry to be dirty if doing the full calculation of in-
|
||||
* mempool descendants will be too expensive, which can potentially happen
|
||||
@@ -154,6 +174,16 @@ private:
|
||||
int64_t feeDelta;
|
||||
};
|
||||
|
||||
struct update_lock_points
|
||||
{
|
||||
update_lock_points(const LockPoints& _lp) : lp(_lp) { }
|
||||
|
||||
void operator() (CTxMemPoolEntry &e) { e.UpdateLockPoints(lp); }
|
||||
|
||||
private:
|
||||
const LockPoints& lp;
|
||||
};
|
||||
|
||||
// extracts a TxMemPoolEntry's transaction hash
|
||||
struct mempoolentry_txid
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user