Return-Path: Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 1633BC000B for ; Tue, 8 Feb 2022 04:59:01 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id DF86340268 for ; Tue, 8 Feb 2022 04:59:00 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org X-Spam-Flag: NO X-Spam-Score: -1.621 X-Spam-Level: X-Spam-Status: No, score=-1.621 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.276, SPF_HELO_NONE=0.001, SPF_NONE=0.001, UNPARSEABLE_RELAY=0.001] autolearn=no autolearn_force=no Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mAohJTKnaGC1 for ; Tue, 8 Feb 2022 04:58:59 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 Received: from azure.erisian.com.au (cerulean.erisian.com.au [139.162.42.226]) by smtp4.osuosl.org (Postfix) with ESMTPS id AEF9B40267 for ; Tue, 8 Feb 2022 04:58:59 +0000 (UTC) Received: from aj@azure.erisian.com.au (helo=sapphire.erisian.com.au) by azure.erisian.com.au with esmtpsa (Exim 4.92 #3 (Debian)) id 1nHIac-0002nv-Oc; Tue, 08 Feb 2022 14:58:56 +1000 Received: by sapphire.erisian.com.au (sSMTP sendmail emulation); Tue, 08 Feb 2022 14:58:50 +1000 Date: Tue, 8 Feb 2022 14:58:50 +1000 From: Anthony Towns To: Bitcoin Protocol Discussion Message-ID: <20220208045850.GA6538@erisian.com.au> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Score-int: -18 X-Spam-Bar: - Subject: Re: [bitcoin-dev] Improving RBF Policy X-BeenThere: bitcoin-dev@lists.linuxfoundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Bitcoin Protocol Discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Feb 2022 04:59:01 -0000 On Mon, Feb 07, 2022 at 11:16:26AM +0000, Gloria Zhao wrote: > @aj: > > I wonder sometimes if it could be sufficient to just have a relay rate > > limit and prioritise by ancestor feerate though. Maybe something like: > > - instead of adding txs to each peers setInventoryTxToSend immediately, > > set a mempool flag "relayed=false" > > - on a time delay, add the top N (by fee rate) "relayed=false" txs to > > each peer's setInventoryTxToSend and mark them as "relayed=true"; > > calculate how much kB those txs were, and do this again after > > SIZE/RATELIMIT seconds > > - don't include "relayed=false" txs when building blocks? The "?" was me not being sure that point is a good suggestion... Miners might reasonably decide to have no rate limit, and always relay, and never exclude txs -- but the question then becomes is whether they hear about the tx at all, so rate limiting behaviour could still be a potential problem for whoever made the tx. > Wow cool! I think outbound tx relay size-based rate-limiting and > prioritizing tx relay by feerate are great ideas for preventing spammers > from wasting bandwidth network-wide. I agree, this would slow the low > feerate spam down, preventing a huge network-wide bandwidth spike. And it > would allow high feerate transactions to propagate as they should, > regardless of how busy traffic is. Combined with inbound tx request > rate-limiting, might this be sufficient to prevent DoS regardless of the > fee-based replacement policies? I think you only want to do outbound rate limits, ie, how often you send INV, GETDATA and TX messages? Once you receive any of those, I think you have to immediately process / ignore it, you can't really sensibly defer it (beyond the existing queues we have that just build up while we're busy processing other things first)? > One point that I'm not 100% clear on: is it ok to prioritize the > transactions by ancestor feerate in this scheme? As I described in the > original post, this can be quite different from the actual feerate we would > consider a transaction in a block for. The transaction could have a high > feerate sibling bumping its ancestor. > For example, A (1sat/vB) has 2 children: B (49sat/vB) and C (5sat/vB). If > we just received C, it would be incorrect to give it a priority equal to > its ancestor feerate (3sat/vB) because if we constructed a block template > now, B would bump A, and C's new ancestor feerate is 5sat/vB. > Then, if we imagine that top N is >5sat/vB, we're not relaying C. If we > also exclude C when building blocks, we're missing out on good fees. I think you're right that this would be ugly. It's something of a special case: a) you really care about C getting into the next block; but b) you're trusting B not being replaced by a higher fee tx that doesn't have A as a parent; and c) there's a lot of txs bidding the floor of the next block up to a level in-between the ancestor fee rate of 3sat/vB and the tx fee rate of 5sat/vB Without (a), maybe you don't care about it getting to a miner quickly. If your trust in (b) was misplaced, then your tx's effective fee rate will drop and (because of (c)), you'll lose anyway. And if the spam ends up outside of (c)'s range, either the rate limiting won't take effect (spam's too cheap) and you'll be fine, or you'll miss out on the block anyway (spam's paying more than your tx rate) and you never had any hope of making it in. Note that we already rate limit via INVENTORY_BROADCAST_MAX / *_INVENTORY_BROADCAST_INTERVAL; which gets to something like 10,500 txs per 10 minutes for outbound connections. This would be a weight based rate limit instead-of/in-addition-to that, I guess. As far as a non-ugly approach goes, I think you'd have to be smarter about tracking the "effective fee rate" than the ancestor fee rate manages; maybe that's something that could fall out of Murch and Clara's candidate set blockbuilding ideas [0] ? Perhaps that same work would also make it possible to come up with a better answer to "do I care that this replacement would invalidate these descendents?" [0] https://github.com/Xekyo/blockbuilding > > - keep high-feerate evicted txs around for a while in case they get > > mined by someone else to improve compact block relay, a la the > > orphan pool? > Replaced transactions are already added to vExtraTxnForCompact :D I guess I was thinking that it's just a 100 tx LRU cache, which might not be good enough? Maybe it would be more on point to have a rate limit apply only to replacement transactions? > For wallets, AJ's "All you need is for there to be *a* path that follows > the new relay rules and gets from your node/wallet to perhaps 10% of > hashpower" makes sense to me (which would be the former). Perhaps a corollarly of that is that it's *better* to have the mempool acceptance rule only consider economic incentives, and have the spam prevention only be about "shall I tell my peers about this?" If you don't have that split; then the anti-spam rules can prevent you from getting the tx in the mempool at all; whereas if you do have the split, then even if the bitcoind anti-spam rules are blocking you at every turn, you can still send your tx to miners by some other route, and then they can add it to their mempool directly without any hassle. Cheers, aj