diff --git a/src/coins.cpp b/src/coins.cpp index 1116f159b..250354614 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -7,6 +7,7 @@ #include "memusage.h" #include "random.h" #include "version.h" +#include "policy/fees.h" #include @@ -443,7 +444,17 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const { if (tx.IsCoinBase()) return 0.0; - CAmount nTotalIn = 0; + + // Joinsplits do not reveal any information about the value or age of a note, so we + // cannot apply the priority algorithm used for transparent utxos. Instead, we just + // use the maximum priority whenever a transaction contains any JoinSplits. + // (Note that coinbase transactions cannot contain JoinSplits.) + // FIXME: this logic is partially duplicated between here and CreateNewBlock in miner.cpp. + + if (tx.vjoinsplit.size() > 0) { + return MAX_PRIORITY; + } + double dResult = 0.0; BOOST_FOREACH(const CTxIn& txin, tx.vin) { @@ -452,34 +463,9 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const if (!coins->IsAvailable(txin.prevout.n)) continue; if (coins->nHeight < nHeight) { dResult += coins->vout[txin.prevout.n].nValue * (nHeight-coins->nHeight); - nTotalIn += coins->vout[txin.prevout.n].nValue; } } - // If a transaction contains a joinsplit, we boost the priority of the transaction. - // Joinsplits do not reveal any information about the value or age of a note, so we - // cannot apply the priority algorithm used for transparent utxos. Instead, we pick a - // very large number and multiply it by the transaction's fee per 1000 bytes of data. - // One trillion, 1000000000000, is equivalent to 1 ZEC utxo * 10000 blocks (~17 days). - if (tx.vjoinsplit.size() > 0) { - unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); - nTotalIn += tx.GetJoinSplitValueIn(); - CAmount fee = nTotalIn - tx.GetValueOut(); - CFeeRate feeRate(fee, nTxSize); - CAmount feePerK = feeRate.GetFeePerK(); - - if (feePerK == 0) { - feePerK = 1; - } - - dResult += 1000000000000 * double(feePerK); - // We cast feePerK from int64_t to double because if feePerK is a large number, say - // close to MAX_MONEY, the multiplication operation will result in an integer overflow. - // The variable dResult should never overflow since a 64-bit double in C++ is typically - // a double-precision floating-point number as specified by IEE 754, with a maximum - // value DBL_MAX of 1.79769e+308. - } - return tx.ComputePriority(dResult); }