aboutsummaryrefslogtreecommitdiff
path: root/src/txmempool.h
diff options
context:
space:
mode:
authorSuhas Daftuar <sdaftuar@gmail.com>2018-01-09 12:27:57 -0500
committerSuhas Daftuar <sdaftuar@gmail.com>2018-01-09 12:27:57 -0500
commit9a51319578091234fdd218a1eb144d517ea82b85 (patch)
tree85b5d154e47a9b15dd08e2b57497372a1c7b1425 /src/txmempool.h
parent6773f92b302915b75db4ded9814563d42de3d489 (diff)
downloadbitcoin-9a51319578091234fdd218a1eb144d517ea82b85.tar.xz
Sort mempool by min(feerate, ancestor_feerate)
This more closely approximates the desirability of a given transaction for mining.
Diffstat (limited to 'src/txmempool.h')
-rw-r--r--src/txmempool.h33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/txmempool.h b/src/txmempool.h
index a0698387f2..a5eba9787e 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -266,27 +266,46 @@ public:
}
};
+/** \class CompareTxMemPoolEntryByAncestorScore
+ *
+ * Sort an entry by min(score/size of entry's tx, score/size with all ancestors).
+ */
class CompareTxMemPoolEntryByAncestorFee
{
public:
bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const
{
- double aFees = a.GetModFeesWithAncestors();
- double aSize = a.GetSizeWithAncestors();
+ double a_mod_fee, a_size, b_mod_fee, b_size;
- double bFees = b.GetModFeesWithAncestors();
- double bSize = b.GetSizeWithAncestors();
+ GetModFeeAndSize(a, a_mod_fee, a_size);
+ GetModFeeAndSize(b, b_mod_fee, b_size);
// Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
- double f1 = aFees * bSize;
- double f2 = aSize * bFees;
+ double f1 = a_mod_fee * b_size;
+ double f2 = a_size * b_mod_fee;
if (f1 == f2) {
return a.GetTx().GetHash() < b.GetTx().GetHash();
}
-
return f1 > f2;
}
+
+ // Return the fee/size we're using for sorting this entry.
+ void GetModFeeAndSize(const CTxMemPoolEntry &a, double &mod_fee, double &size) const
+ {
+ // Compare feerate with ancestors to feerate of the transaction, and
+ // return the fee/size for the min.
+ double f1 = (double)a.GetModifiedFee() * a.GetSizeWithAncestors();
+ double f2 = (double)a.GetModFeesWithAncestors() * a.GetTxSize();
+
+ if (f1 > f2) {
+ mod_fee = a.GetModFeesWithAncestors();
+ size = a.GetSizeWithAncestors();
+ } else {
+ mod_fee = a.GetModifiedFee();
+ size = a.GetTxSize();
+ }
+ }
};
// Multi_index tag names