From ac9c113bd2a2bb5001391a486d010189368f51f3 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Tue, 24 Jun 2025 02:20:03 +0200 Subject: [PATCH 1/3] mempool: use `FeeFrac` for calculating descendant score --- src/txmempool.h | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/txmempool.h b/src/txmempool.h index 10acb2aa22f..cca38002720 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -93,36 +93,24 @@ class CompareTxMemPoolEntryByDescendantScore public: bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const { - double a_mod_fee, a_size, b_mod_fee, b_size; + FeeFrac f1 = GetModFeeAndSize(a); + FeeFrac f2 = GetModFeeAndSize(b); - 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 = a_mod_fee * b_size; - double f2 = a_size * b_mod_fee; - - if (f1 == f2) { + if (FeeRateCompare(f1, f2) == 0) { return a.GetTime() >= b.GetTime(); } 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 + FeeFrac GetModFeeAndSize(const CTxMemPoolEntry &a) const { // Compare feerate with descendants to feerate of the transaction, and // return the fee/size for the max. - double f1 = (double)a.GetModifiedFee() * a.GetSizeWithDescendants(); - double f2 = (double)a.GetModFeesWithDescendants() * a.GetTxSize(); - - if (f2 > f1) { - mod_fee = a.GetModFeesWithDescendants(); - size = a.GetSizeWithDescendants(); - } else { - mod_fee = a.GetModifiedFee(); - size = a.GetTxSize(); - } + return std::max( + FeeFrac(a.GetModFeesWithDescendants(), a.GetSizeWithDescendants()), + FeeFrac(a.GetModifiedFee(), a.GetTxSize()) + ); } }; From 3322b3a05954a1bac9f49a92e3bb35d2cbd20029 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Tue, 24 Jun 2025 02:34:29 +0200 Subject: [PATCH 2/3] mempool: use `FeeFrac` for calculating ancestor score --- src/txmempool.h | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/txmempool.h b/src/txmempool.h index cca38002720..466792a1e6d 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -154,16 +154,10 @@ public: template bool operator()(const T& a, const T& b) const { - double a_mod_fee, a_size, b_mod_fee, b_size; + FeeFrac f1 = GetModFeeAndSize(a); + FeeFrac f2 = GetModFeeAndSize(b); - 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 = a_mod_fee * b_size; - double f2 = a_size * b_mod_fee; - - if (f1 == f2) { + if (FeeRateCompare(f1, f2) == 0) { return a.GetTx().GetHash() < b.GetTx().GetHash(); } return f1 > f2; @@ -171,20 +165,14 @@ public: // Return the fee/size we're using for sorting this entry. template - void GetModFeeAndSize(const T &a, double &mod_fee, double &size) const + FeeFrac GetModFeeAndSize(const T &a) 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(); - } + return std::min( + FeeFrac(a.GetModFeesWithAncestors(), a.GetSizeWithAncestors()), + FeeFrac(a.GetModifiedFee(), a.GetTxSize()) + ); } }; From 922adf66ac7420e21ea171d3586ea84554e5d91b Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Tue, 24 Jun 2025 02:49:31 +0200 Subject: [PATCH 3/3] mempool: use `FeeFrac` for calculating regular score --- src/txmempool.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/txmempool.h b/src/txmempool.h index 466792a1e6d..83926927cd6 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -126,9 +126,9 @@ class CompareTxMemPoolEntryByScore public: bool operator()(const CTxMemPoolEntry& a, const CTxMemPoolEntry& b) const { - double f1 = (double)a.GetFee() * b.GetTxSize(); - double f2 = (double)b.GetFee() * a.GetTxSize(); - if (f1 == f2) { + FeeFrac f1(a.GetFee(), a.GetTxSize()); + FeeFrac f2(b.GetFee(), b.GetTxSize()); + if (FeeRateCompare(f1, f2) == 0) { return b.GetTx().GetHash() < a.GetTx().GetHash(); } return f1 > f2;