aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGregory Sanders <gsanders87@gmail.com>2019-07-31 13:21:00 -0400
committerGregory Sanders <gsanders87@gmail.com>2019-10-03 14:03:27 -0400
commit8e59af55aaf1b196575084bce2448af02d97d745 (patch)
tree066de49201c9a95482cc601fbe385195c991752c /src
parenta689c119076c7b8dc5b4dea4539e4cbf5adfb72f (diff)
downloadbitcoin-8e59af55aaf1b196575084bce2448af02d97d745.tar.xz
feefilter: Compute the absolute fee rather than stored rate to match mempool acceptance logic
Diffstat (limited to 'src')
-rw-r--r--src/net_processing.cpp17
-rw-r--r--src/txmempool.cpp2
-rw-r--r--src/txmempool.h7
3 files changed, 15 insertions, 11 deletions
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index e345af604c..9aa0294c27 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -3847,10 +3847,10 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
if (fSendTrickle && pto->m_tx_relay->fSendMempool) {
auto vtxinfo = mempool.infoAll();
pto->m_tx_relay->fSendMempool = false;
- CAmount filterrate = 0;
+ CFeeRate filterrate;
{
LOCK(pto->m_tx_relay->cs_feeFilter);
- filterrate = pto->m_tx_relay->minFeeFilter;
+ filterrate = CFeeRate(pto->m_tx_relay->minFeeFilter);
}
LOCK(pto->m_tx_relay->cs_filter);
@@ -3859,9 +3859,9 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
const uint256& hash = txinfo.tx->GetHash();
CInv inv(MSG_TX, hash);
pto->m_tx_relay->setInventoryTxToSend.erase(hash);
- if (filterrate) {
- if (txinfo.feeRate.GetFeePerK() < filterrate)
- continue;
+ // Don't send transactions that peers will not put into their mempool
+ if (txinfo.fee < filterrate.GetFee(txinfo.vsize)) {
+ continue;
}
if (pto->m_tx_relay->pfilter) {
if (!pto->m_tx_relay->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
@@ -3884,10 +3884,10 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
for (std::set<uint256>::iterator it = pto->m_tx_relay->setInventoryTxToSend.begin(); it != pto->m_tx_relay->setInventoryTxToSend.end(); it++) {
vInvTx.push_back(it);
}
- CAmount filterrate = 0;
+ CFeeRate filterrate;
{
LOCK(pto->m_tx_relay->cs_feeFilter);
- filterrate = pto->m_tx_relay->minFeeFilter;
+ filterrate = CFeeRate(pto->m_tx_relay->minFeeFilter);
}
// Topologically and fee-rate sort the inventory we send for privacy and priority reasons.
// A heap is used so that not all items need sorting if only a few are being sent.
@@ -3914,7 +3914,8 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
if (!txinfo.tx) {
continue;
}
- if (filterrate && txinfo.feeRate.GetFeePerK() < filterrate) {
+ // Peer told you to not send transactions at that feerate? Don't bother sending it.
+ if (txinfo.fee < filterrate.GetFee(txinfo.vsize)) {
continue;
}
if (pto->m_tx_relay->pfilter && !pto->m_tx_relay->pfilter->IsRelevantAndUpdate(*txinfo.tx)) continue;
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index 835b8d63bd..e4c1fd4bc6 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -773,7 +773,7 @@ void CTxMemPool::queryHashes(std::vector<uint256>& vtxid) const
}
static TxMempoolInfo GetInfo(CTxMemPool::indexed_transaction_set::const_iterator it) {
- return TxMempoolInfo{it->GetSharedTx(), it->GetTime(), CFeeRate(it->GetFee(), it->GetTxSize()), it->GetModifiedFee() - it->GetFee()};
+ return TxMempoolInfo{it->GetSharedTx(), it->GetTime(), it->GetFee(), it->GetTxSize(), it->GetModifiedFee() - it->GetFee()};
}
std::vector<TxMempoolInfo> CTxMemPool::infoAll() const
diff --git a/src/txmempool.h b/src/txmempool.h
index f2fc1c8310..229a923a28 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -334,8 +334,11 @@ struct TxMempoolInfo
/** Time the transaction entered the mempool. */
std::chrono::seconds m_time;
- /** Feerate of the transaction. */
- CFeeRate feeRate;
+ /** Fee of the transaction. */
+ CAmount fee;
+
+ /** Virtual size of the transaction. */
+ size_t vsize;
/** The fee delta. */
int64_t nFeeDelta;