@@ -237,6 +237,13 @@ struct Peer {
237
237
238
238
/* * Whether this peer relays txs via wtxid */
239
239
std::atomic<bool > m_wtxid_relay{false };
240
+ /* * The feerate in the most recent BIP133 `feefilter` message sent to the peer.
241
+ * It is *not* a p2p protocol violation for the peer to send us
242
+ * transactions with a lower fee rate than this. See BIP133. */
243
+ CAmount m_fee_filter_sent{0 };
244
+ /* * Timestamp after which we will send the next BIP133 `feefilter` message
245
+ * to the peer. */
246
+ std::chrono::microseconds m_next_send_feefilter{0 };
240
247
241
248
struct TxRelay {
242
249
mutable RecursiveMutex m_bloom_filter_mutex;
@@ -260,8 +267,6 @@ struct Peer {
260
267
261
268
/* * Minimum fee rate with which to filter inv's to this node */
262
269
std::atomic<CAmount> m_fee_filter_received{0 };
263
- CAmount m_fee_filter_sent{0 };
264
- std::chrono::microseconds m_next_send_feefilter{0 };
265
270
};
266
271
267
272
/* * Transaction relay data. Will be a nullptr if we're not relaying
@@ -4565,10 +4570,12 @@ void PeerManagerImpl::MaybeSendAddr(CNode& node, Peer& peer, std::chrono::micros
4565
4570
void PeerManagerImpl::MaybeSendFeefilter (CNode& pto, Peer& peer, std::chrono::microseconds current_time)
4566
4571
{
4567
4572
if (m_ignore_incoming_txs) return ;
4568
- if (!peer.m_tx_relay ) return ;
4569
4573
if (pto.GetCommonVersion () < FEEFILTER_VERSION) return ;
4570
4574
// peers with the forcerelay permission should not filter txs to us
4571
4575
if (pto.HasPermission (NetPermissionFlags::ForceRelay)) return ;
4576
+ // Don't send feefilter messages to outbound block-relay-only peers since they should never announce
4577
+ // transactions to us, regardless of feefilter state.
4578
+ if (pto.IsBlockOnlyConn ()) return ;
4572
4579
4573
4580
CAmount currentFilter = m_mempool.GetMinFee (gArgs .GetIntArg (" -maxmempool" , DEFAULT_MAX_MEMPOOL_SIZE) * 1000000 ).GetFeePerK ();
4574
4581
static FeeFilterRounder g_filter_rounder{CFeeRate{DEFAULT_MIN_RELAY_TX_FEE}};
@@ -4579,27 +4586,27 @@ void PeerManagerImpl::MaybeSendFeefilter(CNode& pto, Peer& peer, std::chrono::mi
4579
4586
currentFilter = MAX_MONEY;
4580
4587
} else {
4581
4588
static const CAmount MAX_FILTER{g_filter_rounder.round (MAX_MONEY)};
4582
- if (peer.m_tx_relay -> m_fee_filter_sent == MAX_FILTER) {
4589
+ if (peer.m_fee_filter_sent == MAX_FILTER) {
4583
4590
// Send the current filter if we sent MAX_FILTER previously
4584
4591
// and made it out of IBD.
4585
- peer.m_tx_relay -> m_next_send_feefilter = 0us;
4592
+ peer.m_next_send_feefilter = 0us;
4586
4593
}
4587
4594
}
4588
- if (current_time > peer.m_tx_relay -> m_next_send_feefilter ) {
4595
+ if (current_time > peer.m_next_send_feefilter ) {
4589
4596
CAmount filterToSend = g_filter_rounder.round (currentFilter);
4590
4597
// We always have a fee filter of at least minRelayTxFee
4591
4598
filterToSend = std::max (filterToSend, ::minRelayTxFee.GetFeePerK ());
4592
- if (filterToSend != peer.m_tx_relay -> m_fee_filter_sent ) {
4599
+ if (filterToSend != peer.m_fee_filter_sent ) {
4593
4600
m_connman.PushMessage (&pto, CNetMsgMaker (pto.GetCommonVersion ()).Make (NetMsgType::FEEFILTER, filterToSend));
4594
- peer.m_tx_relay -> m_fee_filter_sent = filterToSend;
4601
+ peer.m_fee_filter_sent = filterToSend;
4595
4602
}
4596
- peer.m_tx_relay -> m_next_send_feefilter = GetExponentialRand (current_time, AVG_FEEFILTER_BROADCAST_INTERVAL);
4603
+ peer.m_next_send_feefilter = GetExponentialRand (current_time, AVG_FEEFILTER_BROADCAST_INTERVAL);
4597
4604
}
4598
4605
// If the fee filter has changed substantially and it's still more than MAX_FEEFILTER_CHANGE_DELAY
4599
4606
// until scheduled broadcast, then move the broadcast to within MAX_FEEFILTER_CHANGE_DELAY.
4600
- else if (current_time + MAX_FEEFILTER_CHANGE_DELAY < peer.m_tx_relay -> m_next_send_feefilter &&
4601
- (currentFilter < 3 * peer.m_tx_relay -> m_fee_filter_sent / 4 || currentFilter > 4 * peer.m_tx_relay -> m_fee_filter_sent / 3 )) {
4602
- peer.m_tx_relay -> m_next_send_feefilter = current_time + GetRandomDuration<std::chrono::microseconds>(MAX_FEEFILTER_CHANGE_DELAY);
4607
+ else if (current_time + MAX_FEEFILTER_CHANGE_DELAY < peer.m_next_send_feefilter &&
4608
+ (currentFilter < 3 * peer.m_fee_filter_sent / 4 || currentFilter > 4 * peer.m_fee_filter_sent / 3 )) {
4609
+ peer.m_next_send_feefilter = current_time + GetRandomDuration<std::chrono::microseconds>(MAX_FEEFILTER_CHANGE_DELAY);
4603
4610
}
4604
4611
}
4605
4612
0 commit comments