[cleanup] Remove coin age priority completely.
Remove GetPriority and ComputePriority. Remove internal machinery for tracking priority in CTxMemPoolEntry.
This commit is contained in:
parent
f9b9371c60
commit
359e8a03d1
11 changed files with 11 additions and 97 deletions
|
@ -12,14 +12,13 @@
|
||||||
static void AddTx(const CTransaction& tx, const CAmount& nFee, CTxMemPool& pool)
|
static void AddTx(const CTransaction& tx, const CAmount& nFee, CTxMemPool& pool)
|
||||||
{
|
{
|
||||||
int64_t nTime = 0;
|
int64_t nTime = 0;
|
||||||
double dPriority = 10.0;
|
|
||||||
unsigned int nHeight = 1;
|
unsigned int nHeight = 1;
|
||||||
bool spendsCoinbase = false;
|
bool spendsCoinbase = false;
|
||||||
unsigned int sigOpCost = 4;
|
unsigned int sigOpCost = 4;
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
pool.addUnchecked(tx.GetHash(), CTxMemPoolEntry(
|
pool.addUnchecked(tx.GetHash(), CTxMemPoolEntry(
|
||||||
MakeTransactionRef(tx), nFee, nTime, dPriority, nHeight,
|
MakeTransactionRef(tx), nFee, nTime, nHeight,
|
||||||
tx.GetValueOut(), spendsCoinbase, sigOpCost, lp));
|
spendsCoinbase, sigOpCost, lp));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right now this is only testing eviction performance in an extremely small
|
// Right now this is only testing eviction performance in an extremely small
|
||||||
|
|
|
@ -295,25 +295,6 @@ bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight, CAmount &inChainInputValue) const
|
|
||||||
{
|
|
||||||
inChainInputValue = 0;
|
|
||||||
if (tx.IsCoinBase())
|
|
||||||
return 0.0;
|
|
||||||
double dResult = 0.0;
|
|
||||||
BOOST_FOREACH(const CTxIn& txin, tx.vin)
|
|
||||||
{
|
|
||||||
const CCoins* coins = AccessCoins(txin.prevout.hash);
|
|
||||||
assert(coins);
|
|
||||||
if (!coins->IsAvailable(txin.prevout.n)) continue;
|
|
||||||
if (coins->nHeight <= nHeight) {
|
|
||||||
dResult += (double)(coins->vout[txin.prevout.n].nValue) * (nHeight-coins->nHeight);
|
|
||||||
inChainInputValue += coins->vout[txin.prevout.n].nValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tx.ComputePriority(dResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_, size_t usage) : cache(cache_), it(it_), cachedCoinUsage(usage) {
|
CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_, size_t usage) : cache(cache_), it(it_), cachedCoinUsage(usage) {
|
||||||
assert(!cache.hasModifier);
|
assert(!cache.hasModifier);
|
||||||
cache.hasModifier = true;
|
cache.hasModifier = true;
|
||||||
|
|
|
@ -460,13 +460,6 @@ public:
|
||||||
//! Check whether all prevouts of the transaction are present in the UTXO set represented by this view
|
//! Check whether all prevouts of the transaction are present in the UTXO set represented by this view
|
||||||
bool HaveInputs(const CTransaction& tx) const;
|
bool HaveInputs(const CTransaction& tx) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Return priority of tx at height nHeight. Also calculate the sum of the values of the inputs
|
|
||||||
* that are already in the chain. These are the inputs that will age and increase priority as
|
|
||||||
* new blocks are added to the chain.
|
|
||||||
*/
|
|
||||||
double GetPriority(const CTransaction &tx, int nHeight, CAmount &inChainInputValue) const;
|
|
||||||
|
|
||||||
const CTxOut &GetOutputFor(const CTxIn& input) const;
|
const CTxOut &GetOutputFor(const CTxIn& input) const;
|
||||||
|
|
||||||
friend class CCoinsModifier;
|
friend class CCoinsModifier;
|
||||||
|
|
|
@ -89,32 +89,6 @@ CAmount CTransaction::GetValueOut() const
|
||||||
return nValueOut;
|
return nValueOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
double CTransaction::ComputePriority(double dPriorityInputs, unsigned int nTxSize) const
|
|
||||||
{
|
|
||||||
nTxSize = CalculateModifiedSize(nTxSize);
|
|
||||||
if (nTxSize == 0) return 0.0;
|
|
||||||
|
|
||||||
return dPriorityInputs / nTxSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const
|
|
||||||
{
|
|
||||||
// In order to avoid disincentivizing cleaning up the UTXO set we don't count
|
|
||||||
// the constant overhead for each txin and up to 110 bytes of scriptSig (which
|
|
||||||
// is enough to cover a compressed pubkey p2sh redemption) for priority.
|
|
||||||
// Providing any more cleanup incentive than making additional inputs free would
|
|
||||||
// risk encouraging people to create junk outputs to redeem later.
|
|
||||||
if (nTxSize == 0)
|
|
||||||
nTxSize = (GetTransactionWeight(*this) + WITNESS_SCALE_FACTOR - 1) / WITNESS_SCALE_FACTOR;
|
|
||||||
for (std::vector<CTxIn>::const_iterator it(vin.begin()); it != vin.end(); ++it)
|
|
||||||
{
|
|
||||||
unsigned int offset = 41U + std::min(110U, (unsigned int)it->scriptSig.size());
|
|
||||||
if (nTxSize > offset)
|
|
||||||
nTxSize -= offset;
|
|
||||||
}
|
|
||||||
return nTxSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int CTransaction::GetTotalSize() const
|
unsigned int CTransaction::GetTotalSize() const
|
||||||
{
|
{
|
||||||
return ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION);
|
return ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
|
|
@ -361,12 +361,6 @@ public:
|
||||||
// GetValueIn() is a method on CCoinsViewCache, because
|
// GetValueIn() is a method on CCoinsViewCache, because
|
||||||
// inputs must be known to compute value in.
|
// inputs must be known to compute value in.
|
||||||
|
|
||||||
// Compute priority, given priority of inputs and (optionally) tx size
|
|
||||||
double ComputePriority(double dPriorityInputs, unsigned int nTxSize=0) const;
|
|
||||||
|
|
||||||
// Compute modified tx size for priority calculation (optionally given tx size)
|
|
||||||
unsigned int CalculateModifiedSize(unsigned int nTxSize=0) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the total transaction size in bytes, including witness data.
|
* Get the total transaction size in bytes, including witness data.
|
||||||
* "Total Size" defined in BIP141 and BIP144.
|
* "Total Size" defined in BIP141 and BIP144.
|
||||||
|
|
|
@ -407,7 +407,6 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
|
||||||
/* set the fee to just below tx2's feerate when including ancestor */
|
/* set the fee to just below tx2's feerate when including ancestor */
|
||||||
CAmount fee = (20000/tx2Size)*(tx7Size + tx6Size) - 1;
|
CAmount fee = (20000/tx2Size)*(tx7Size + tx6Size) - 1;
|
||||||
|
|
||||||
//CTxMemPoolEntry entry7(tx7, fee, 2, 10.0, 1, true);
|
|
||||||
pool.addUnchecked(tx7.GetHash(), entry.Fee(fee).FromTx(tx7));
|
pool.addUnchecked(tx7.GetHash(), entry.Fee(fee).FromTx(tx7));
|
||||||
BOOST_CHECK_EQUAL(pool.size(), 7);
|
BOOST_CHECK_EQUAL(pool.size(), 7);
|
||||||
sortedOrder.insert(sortedOrder.begin()+1, tx7.GetHash().ToString());
|
sortedOrder.insert(sortedOrder.begin()+1, tx7.GetHash().ToString());
|
||||||
|
|
|
@ -147,8 +147,8 @@ CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CMutableTransaction &tx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransaction &txn) {
|
CTxMemPoolEntry TestMemPoolEntryHelper::FromTx(const CTransaction &txn) {
|
||||||
return CTxMemPoolEntry(MakeTransactionRef(txn), nFee, nTime, 0.0, nHeight,
|
return CTxMemPoolEntry(MakeTransactionRef(txn), nFee, nTime, nHeight,
|
||||||
0, spendsCoinbase, sigOpCost, lp);
|
spendsCoinbase, sigOpCost, lp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown(void* parg)
|
void Shutdown(void* parg)
|
||||||
|
|
|
@ -19,22 +19,17 @@
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
CTxMemPoolEntry::CTxMemPoolEntry(const CTransactionRef& _tx, const CAmount& _nFee,
|
CTxMemPoolEntry::CTxMemPoolEntry(const CTransactionRef& _tx, const CAmount& _nFee,
|
||||||
int64_t _nTime, double _entryPriority, unsigned int _entryHeight,
|
int64_t _nTime, unsigned int _entryHeight,
|
||||||
CAmount _inChainInputValue,
|
|
||||||
bool _spendsCoinbase, int64_t _sigOpsCost, LockPoints lp):
|
bool _spendsCoinbase, int64_t _sigOpsCost, LockPoints lp):
|
||||||
tx(_tx), nFee(_nFee), nTime(_nTime), entryPriority(_entryPriority), entryHeight(_entryHeight),
|
tx(_tx), nFee(_nFee), nTime(_nTime), entryHeight(_entryHeight),
|
||||||
inChainInputValue(_inChainInputValue),
|
|
||||||
spendsCoinbase(_spendsCoinbase), sigOpCost(_sigOpsCost), lockPoints(lp)
|
spendsCoinbase(_spendsCoinbase), sigOpCost(_sigOpsCost), lockPoints(lp)
|
||||||
{
|
{
|
||||||
nTxWeight = GetTransactionWeight(*tx);
|
nTxWeight = GetTransactionWeight(*tx);
|
||||||
nModSize = tx->CalculateModifiedSize(GetTxSize());
|
|
||||||
nUsageSize = RecursiveDynamicUsage(*tx) + memusage::DynamicUsage(tx);
|
nUsageSize = RecursiveDynamicUsage(*tx) + memusage::DynamicUsage(tx);
|
||||||
|
|
||||||
nCountWithDescendants = 1;
|
nCountWithDescendants = 1;
|
||||||
nSizeWithDescendants = GetTxSize();
|
nSizeWithDescendants = GetTxSize();
|
||||||
nModFeesWithDescendants = nFee;
|
nModFeesWithDescendants = nFee;
|
||||||
CAmount nValueIn = tx->GetValueOut()+nFee;
|
|
||||||
assert(inChainInputValue <= nValueIn);
|
|
||||||
|
|
||||||
feeDelta = 0;
|
feeDelta = 0;
|
||||||
|
|
||||||
|
@ -49,16 +44,6 @@ CTxMemPoolEntry::CTxMemPoolEntry(const CTxMemPoolEntry& other)
|
||||||
*this = other;
|
*this = other;
|
||||||
}
|
}
|
||||||
|
|
||||||
double
|
|
||||||
CTxMemPoolEntry::GetPriority(unsigned int currentHeight) const
|
|
||||||
{
|
|
||||||
double deltaPriority = ((double)(currentHeight-entryHeight)*inChainInputValue)/nModSize;
|
|
||||||
double dResult = entryPriority + deltaPriority;
|
|
||||||
if (dResult < 0) // This should only happen if it was called with a height below entry height
|
|
||||||
dResult = 0;
|
|
||||||
return dResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CTxMemPoolEntry::UpdateFeeDelta(int64_t newFeeDelta)
|
void CTxMemPoolEntry::UpdateFeeDelta(int64_t newFeeDelta)
|
||||||
{
|
{
|
||||||
nModFeesWithDescendants += newFeeDelta - feeDelta;
|
nModFeesWithDescendants += newFeeDelta - feeDelta;
|
||||||
|
|
|
@ -73,12 +73,9 @@ private:
|
||||||
CTransactionRef tx;
|
CTransactionRef tx;
|
||||||
CAmount nFee; //!< Cached to avoid expensive parent-transaction lookups
|
CAmount nFee; //!< Cached to avoid expensive parent-transaction lookups
|
||||||
size_t nTxWeight; //!< ... and avoid recomputing tx weight (also used for GetTxSize())
|
size_t nTxWeight; //!< ... and avoid recomputing tx weight (also used for GetTxSize())
|
||||||
size_t nModSize; //!< ... and modified size for priority
|
|
||||||
size_t nUsageSize; //!< ... and total memory usage
|
size_t nUsageSize; //!< ... and total memory usage
|
||||||
int64_t nTime; //!< Local time when entering the mempool
|
int64_t nTime; //!< Local time when entering the mempool
|
||||||
double entryPriority; //!< Priority when entering the mempool
|
|
||||||
unsigned int entryHeight; //!< Chain height when entering the mempool
|
unsigned int entryHeight; //!< Chain height when entering the mempool
|
||||||
CAmount inChainInputValue; //!< Sum of all txin values that are already in blockchain
|
|
||||||
bool spendsCoinbase; //!< keep track of transactions that spend a coinbase
|
bool spendsCoinbase; //!< keep track of transactions that spend a coinbase
|
||||||
int64_t sigOpCost; //!< Total sigop cost
|
int64_t sigOpCost; //!< Total sigop cost
|
||||||
int64_t feeDelta; //!< Used for determining the priority of the transaction for mining in a block
|
int64_t feeDelta; //!< Used for determining the priority of the transaction for mining in a block
|
||||||
|
@ -101,19 +98,14 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CTxMemPoolEntry(const CTransactionRef& _tx, const CAmount& _nFee,
|
CTxMemPoolEntry(const CTransactionRef& _tx, const CAmount& _nFee,
|
||||||
int64_t _nTime, double _entryPriority, unsigned int _entryHeight,
|
int64_t _nTime, unsigned int _entryHeight,
|
||||||
CAmount _inChainInputValue, bool spendsCoinbase,
|
bool spendsCoinbase,
|
||||||
int64_t nSigOpsCost, LockPoints lp);
|
int64_t nSigOpsCost, LockPoints lp);
|
||||||
|
|
||||||
CTxMemPoolEntry(const CTxMemPoolEntry& other);
|
CTxMemPoolEntry(const CTxMemPoolEntry& other);
|
||||||
|
|
||||||
const CTransaction& GetTx() const { return *this->tx; }
|
const CTransaction& GetTx() const { return *this->tx; }
|
||||||
CTransactionRef GetSharedTx() const { return this->tx; }
|
CTransactionRef GetSharedTx() const { return this->tx; }
|
||||||
/**
|
|
||||||
* Fast calculation of lower bound of current priority as update
|
|
||||||
* from entry priority. Only inputs that were originally in-chain will age.
|
|
||||||
*/
|
|
||||||
double GetPriority(unsigned int currentHeight) const;
|
|
||||||
const CAmount& GetFee() const { return nFee; }
|
const CAmount& GetFee() const { return nFee; }
|
||||||
size_t GetTxSize() const;
|
size_t GetTxSize() const;
|
||||||
size_t GetTxWeight() const { return nTxWeight; }
|
size_t GetTxWeight() const { return nTxWeight; }
|
||||||
|
|
|
@ -722,9 +722,6 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
||||||
CAmount nModifiedFees = nFees;
|
CAmount nModifiedFees = nFees;
|
||||||
pool.ApplyDelta(hash, nModifiedFees);
|
pool.ApplyDelta(hash, nModifiedFees);
|
||||||
|
|
||||||
CAmount inChainInputValue;
|
|
||||||
double dPriority = view.GetPriority(tx, chainActive.Height(), inChainInputValue);
|
|
||||||
|
|
||||||
// Keep track of transactions that spend a coinbase, which we re-scan
|
// Keep track of transactions that spend a coinbase, which we re-scan
|
||||||
// during reorgs to ensure COINBASE_MATURITY is still met.
|
// during reorgs to ensure COINBASE_MATURITY is still met.
|
||||||
bool fSpendsCoinbase = false;
|
bool fSpendsCoinbase = false;
|
||||||
|
@ -736,8 +733,8 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxMemPoolEntry entry(ptx, nFees, nAcceptTime, dPriority, chainActive.Height(),
|
CTxMemPoolEntry entry(ptx, nFees, nAcceptTime, chainActive.Height(),
|
||||||
inChainInputValue, fSpendsCoinbase, nSigOpsCost, lp);
|
fSpendsCoinbase, nSigOpsCost, lp);
|
||||||
unsigned int nSize = entry.GetTxSize();
|
unsigned int nSize = entry.GetTxSize();
|
||||||
|
|
||||||
// Check that the transaction doesn't have an excessive number of
|
// Check that the transaction doesn't have an excessive number of
|
||||||
|
|
|
@ -2699,7 +2699,7 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wt
|
||||||
if (GetBoolArg("-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS)) {
|
if (GetBoolArg("-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS)) {
|
||||||
// Lastly, ensure this tx will pass the mempool's chain limits
|
// Lastly, ensure this tx will pass the mempool's chain limits
|
||||||
LockPoints lp;
|
LockPoints lp;
|
||||||
CTxMemPoolEntry entry(wtxNew.tx, 0, 0, 0, 0, 0, false, 0, lp);
|
CTxMemPoolEntry entry(wtxNew.tx, 0, 0, 0, false, 0, lp);
|
||||||
CTxMemPool::setEntries setAncestors;
|
CTxMemPool::setEntries setAncestors;
|
||||||
size_t nLimitAncestors = GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT);
|
size_t nLimitAncestors = GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT);
|
||||||
size_t nLimitAncestorSize = GetArg("-limitancestorsize", DEFAULT_ANCESTOR_SIZE_LIMIT)*1000;
|
size_t nLimitAncestorSize = GetArg("-limitancestorsize", DEFAULT_ANCESTOR_SIZE_LIMIT)*1000;
|
||||||
|
|
Loading…
Reference in a new issue