diff options
author | Suhas Daftuar <sdaftuar@gmail.com> | 2015-10-19 15:15:12 -0400 |
---|---|---|
committer | Suhas Daftuar <sdaftuar@gmail.com> | 2016-03-14 12:13:34 -0400 |
commit | e2eeb5dda790cf301aa669704a25fb35f67400e7 (patch) | |
tree | aeac40ffcbe1d93d5822b92f3bb5363d5758c6ed /src/txmempool.h | |
parent | 72abd2ce3c5ad8157d3a993693df1919a6ad79c3 (diff) |
Add ancestor feerate index to mempool
Diffstat (limited to 'src/txmempool.h')
-rw-r--r-- | src/txmempool.h | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/txmempool.h b/src/txmempool.h index 0db3d5bd27..3f80a6ec24 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -244,10 +244,34 @@ public: } }; +class CompareTxMemPoolEntryByAncestorFee +{ +public: + bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) + { + double aFees = a.GetModFeesWithAncestors(); + double aSize = a.GetSizeWithAncestors(); + + double bFees = b.GetModFeesWithAncestors(); + double bSize = b.GetSizeWithAncestors(); + + // Avoid division by rewriting (a/b > c/d) as (a*d > c*b). + double f1 = aFees * bSize; + double f2 = aSize * bFees; + + if (f1 == f2) { + return a.GetTx().GetHash() < b.GetTx().GetHash(); + } + + return f1 > f2; + } +}; + // Multi_index tag names struct descendant_score {}; struct entry_time {}; struct mining_score {}; +struct ancestor_score {}; class CBlockPolicyEstimator; @@ -380,12 +404,18 @@ public: boost::multi_index::tag<entry_time>, boost::multi_index::identity<CTxMemPoolEntry>, CompareTxMemPoolEntryByEntryTime - >, + >, // sorted by score (for mining prioritization) boost::multi_index::ordered_unique< boost::multi_index::tag<mining_score>, boost::multi_index::identity<CTxMemPoolEntry>, CompareTxMemPoolEntryByScore + >, + // sorted by fee rate with ancestors + boost::multi_index::ordered_non_unique< + boost::multi_index::tag<ancestor_score>, + boost::multi_index::identity<CTxMemPoolEntry>, + CompareTxMemPoolEntryByAncestorFee > > > indexed_transaction_set; |