<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Antoine Poinsot</title>
    <link>https://antoinep.com/posts/</link>
    <description>Recent content on Antoine Poinsot</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright> </copyright>
    <lastBuildDate>Tue, 10 Nov 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://antoinep.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>CVE-2025-62860: thousands of Bitcoin nodes disabled DoS protection</title>
      <link>https://antoinep.com/posts/cve-2025-62860/</link>
      <pubDate>Tue, 10 Nov 2026 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/cve-2025-62860/</guid>
      <description>&lt;p&gt;In September 2025, Martin Zumsande stumbled upon a bunch of misbehaving Bitcoin Knots nodes. This&#xA;led us to discover a widespread configuration bug which exposed Bitcoin Knots and Bitcoin Core nodes&#xA;to privacy leaks and various DoS vectors.&lt;/p&gt;&#xA;&lt;p&gt;It already feels far away, but until not too long ago Bitcoin was targeted by a&#xA;&lt;a href=&#34;https://blog.lopp.net/bip-110-post-mortem&#34;&gt;campaign&lt;/a&gt; of disinformation and harassment to promote a misguided fork coin. This&#xA;all started when a group of Bitcoin enthusiasts, vocal on social media, objected to a &lt;a href=&#34;https://antoinep.com/posts/relay_policy_drama/&#34;&gt;default relay&#xA;policy change&lt;/a&gt; in Bitcoin Core. They decided to turn to Bitcoin Knots as an&#xA;alternative, at the time still merely a fork of Bitcoin Core&amp;rsquo;s software, not yet of the Bitcoin&#xA;network.&lt;/p&gt;&#xA;&lt;p&gt;Some seized on the discontent to politicize Bitcoin&amp;rsquo;s reference implementation development process,&#xA;using the all-too-effective tactic of &lt;a href=&#34;https://www.propwatch.org/category_results.php?cat_id=1&amp;amp;id=62&amp;amp;k=projection&#34;&gt;Accusation in a Mirror&lt;/a&gt;, amplified by&#xA;social media. Others fueled the controversy through virtue signaling or attention seeking, seemingly&#xA;unaware of the harm they were causing.&lt;/p&gt;&#xA;&lt;p&gt;For context, September 2025 was around the release of Bitcoin Core 30, just before the publication&#xA;of the consensus change later enforced by Knots. On the mass psychosis timeline, we&amp;rsquo;re right in the&#xA;middle of the &amp;ldquo;Bitcoin Core v30 will insta-kill Bitcoin with CSAM&amp;rdquo; narrative. We are past&#xA;accusations of Bitcoin contributors being pedophiles and the release of deepfake sexual videos&#xA;targeting one of them, just not quite yet at the justification of a &amp;ldquo;temporary&amp;rdquo; emergency&#xA;confiscation fork or one of Bitcoin&amp;rsquo;s most productive contributors in recent years quitting over&#xA;personal attacks.&lt;/p&gt;&#xA;&lt;p&gt;During this period, the meaningless &amp;ldquo;node count&amp;rdquo; metric was a central talking point of Knots&#xA;promoters. While this count was artificially inflated for social media campaign purposes, a&#xA;non-trivial chunk of them were simply that of people discontent with Bitcoin Core&amp;rsquo;s relay policy.&#xA;Intrigued, my (then) colleague Martin figured a lower bound could be established pretty easily.&lt;/p&gt;&#xA;&lt;p&gt;Bitcoin nodes gossip about other nodes they know of to help peers discover each other. A peer can&#xA;request a sample of these addresses using a &lt;code&gt;GETADDR&lt;/code&gt; message. To limit how much information about&#xA;the network topology can be gathered this way, Bitcoin Core &lt;a href=&#34;https://github.com/bitcoin/bitcoin/pull/18991&#34;&gt;caches its responses to&#xA;&lt;code&gt;GETADDR&lt;/code&gt;&lt;/a&gt; for 24 hours, returning the same set of addresses to repeated requests instead&#xA;of revealing new ones each time.&lt;/p&gt;&#xA;&lt;p&gt;This also provides a convenient way to detect Sybils: if multiple advertised nodes return the exact&#xA;same cached response, they are likely instances of the same underlying node. Counting these&#xA;duplicates can therefore establish a lower bound on the number of fake nodes. In running this&#xA;experiment, Martin unexpectedly discovered that the vast majority of Knots nodes on Tor did not&#xA;cache their &lt;code&gt;GETADDR&lt;/code&gt; responses at all!&lt;/p&gt;&#xA;&lt;p&gt;Martin mentioned this discovery to me, and I started investigating the &lt;a href=&#34;https://github.com/bitcoin/bitcoin/compare/28.x...bitcoinknots:bitcoin:28.x-knots&#34;&gt;diff&lt;/a&gt; between&#xA;the Knots release and its Bitcoin Core counterpart. Surely, I thought, the bug must be somewhere&#xA;among the many unreviewed changes Knots had made to Bitcoin Core. Turns out there was indeed a bug&#xA;hiding in there, but this was only part of the story&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;After a couple hours of investigations, myself and another colleague failed to find what could cause&#xA;this misbehaviour, and failed to reproduce it. Eventually, we decided the side quest was not worth&#xA;it and went back to work. Before calling it a day though, Martin let a more comprehensive experiment&#xA;run overnight, which revealed something interesting&amp;hellip; Only the Knots plus Tor combination was&#xA;affected: the vast majority of Knots nodes on clearnet, and Core nodes on either network, did cache&#xA;the response to a &lt;code&gt;GETADDR&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When checking the result of the experiment the next day, we struggled to make sense of it. Not only&#xA;was the bug specific to Knots, it was also specific to Tor, and we couldn’t reproduce it locally.&lt;/p&gt;&#xA;&lt;p&gt;Martin also mentioned that the distribution of Knots nodes is heavily skewed towards Tor, contrary&#xA;to that of Core nodes. This is what prompted his Sybil investigation in the first place, as Tor&#xA;identities are free to create. However I pointed that this distribution could simply be explained by&#xA;the commercial success of some Knots turnkey solution. That&amp;rsquo;s because turnkey node-in-a-box&#xA;solutions commonly (ab)use Tor as a VPN for remote access behind a NAT.&lt;/p&gt;&#xA;&lt;p&gt;From past experience, I also knew such solutions set the &lt;code&gt;whitelist&lt;/code&gt; configuration, because some of&#xA;the apps they bundle need it (for bloom filters, or privileged p2p access). Could it be?.. BINGO!&#xA;Start9 &lt;a href=&#34;https://github.com/Start9Labs/bitcoin-knots-startos/blob/2dcf06c39e6b15dcd0e2a5fd9e33ebd977f752a3/assets/compat/bitcoin.conf.template#L94&#34;&gt;whitelisted&lt;/a&gt; all of localhost, which included the Tor daemon. Bitcoin Core and&#xA;Bitcoin Knots would apply the whitelist by treating inbound Tor connections as coming from the IP of&#xA;the Tor daemon. Bitcoin Knots lifted more protections by default for whitelisted peers, including&#xA;the &lt;code&gt;ADDR&lt;/code&gt; caching privacy leak mitigation, which is what made this issue observable there.&lt;/p&gt;&#xA;&lt;p&gt;While it was made worse by, and only visible on, Knots, it is important to highlight this issue&#xA;affected all users of Bitcoin Core and Bitcoin Knots that configured &lt;code&gt;-whitelist&lt;/code&gt; with an IP range&#xA;that included the Tor daemon used by their node. This is a non-default configuration that was&#xA;surprisingly widespread. All turnkey node solutions I knew of were affected, and high profile&#xA;projects like Electrs or BTCPayServer recommended setting &lt;code&gt;-whitelist&lt;/code&gt; in their documentation.&lt;/p&gt;&#xA;&lt;p&gt;Therefore the misbehaviour observed on hundreds of Bitcoin Knots nodes was actually a symptom of&#xA;something far more widespread, and concerning. With &lt;code&gt;-whitelist&lt;/code&gt; set to the IP range of the Tor&#xA;daemon, your node would lift various DoS and privacy protections for all incoming Tor peers. This&#xA;meant that &lt;strong&gt;affected nodes could be trivially DoSed and footprinted&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;We chose not to probe nodes to get the total number of affected nodes. That can be extrapolated from&#xA;the Knots numbers though, where 80% of ~3.5k nodes were demonstrably affected. About twice as many&#xA;Core nodes were running behind Tor, and even if we conservatively estimate a third of which to be&#xA;turnkey setups, the total is already about 5,000 affected nodes.&lt;/p&gt;&#xA;&lt;p&gt;We alerted the Bitcoin Core security team on September 12. Because the vast majority of Knots nodes&#xA;were affected, we also notified Luke Dashjr. This was a gamble, given his ongoing personal attacks&#xA;against Bitcoin Core contributors and the conspiracy theories he was spreading about the project.&#xA;His affiliates had also made legal threats against mining pools running Bitcoin Core. We were&#xA;worried he might end up exploiting the vulnerability to spread more FUD about Bitcoin Core,&#xA;justifying such an attack through the same narrative he had built around the project to rationalize&#xA;his behaviour and, eventually, his fork coin.&lt;/p&gt;&#xA;&lt;p&gt;I messaged Luke on September 17. He acknowledged receipt the same day and signaled he would respect&#xA;the embargo period. To his credit, he has as far as I know not broken the embargo nor tried to&#xA;exploit this vulnerability to his benefit. He even offered to credit me publicly on responsibly&#xA;disclosing a security issue to Knots, when the discourse shifted to &amp;ldquo;Bitcoin Core uses its security&#xA;policy to push CSAM on its users&amp;rdquo; (it&amp;rsquo;s embarrassing to write such a ridiculous statement, but it&amp;rsquo;s&#xA;important to remember how low parts of our community had fallen during that time). I declined, as I&#xA;figured it unnecessarily risked revealing the vulnerability before many users had the opportunity to&#xA;patch their node.&lt;/p&gt;&#xA;&lt;p&gt;Bitcoin Core fixed the surprising behaviour of applying the whitelist to inbound Tor peers in &lt;a href=&#34;https://github.com/bitcoin/bitcoin/pull/33395&#34;&gt;PR&#xA;#33395&lt;/a&gt;, which shipped in 28.3, 29.2 and 30.0 a month later. But projects did not need to&#xA;wait for a Bitcoin Core release to distribute a patch to their users. In fact, indiscriminately&#xA;whitelisting an entire IP range by default is pretty risky to start with. For a security critical&#xA;project, it&amp;rsquo;s preferable to block everything by default, and only make pinpointed exceptions.&lt;/p&gt;&#xA;&lt;p&gt;But this is much less flexible, and turnkey nodes may not know what IP address future&#xA;whitelist-requiring applications will use. Bitcoin Core offers an option that can prevent the&#xA;footgun without losing too much flexibility: &lt;code&gt;-whitebind&lt;/code&gt;. By using this option you make your&#xA;&lt;code&gt;bitcoind&lt;/code&gt; listen on additional ports (presumably on a loopback address). This can be used to give&#xA;more fine grained permissions (for instance none on port 8333, &amp;ldquo;noban&amp;rdquo; on port 9333, &amp;ldquo;bloomfilter&amp;rdquo;&#xA;on port 10333, etc..) and make it harder to misuse: presumably a proxy for untrusted peers would be&#xA;configured to connect to the default port, and wouldn&amp;rsquo;t silently give peers additional permissions&#xA;simply by virtue of running a local daemon. This was the approach &lt;a href=&#34;https://github.com/fort-nix/nix-bitcoin/pull/414&#34;&gt;used by nix-bitcoin&lt;/a&gt;, a&#xA;node-in-a-box solution that was not affected by the vulnerability.&lt;/p&gt;&#xA;&lt;p&gt;I reported this issue to various affected projects that were shipping software directly to end&#xA;users. I contacted Nix-Bitcoin, Start9, Umbrel, Raspiblitz, Nodl and MyNode. Nix-Bitcoin had already&#xA;discovered and patched the issue in 2021 (see above). Start9, Umbrel, Raspiblitz and Nodl were&#xA;responsive. All of them promptly implemented a mitigation and shipped it to users. MyNode was a bit&#xA;harder to reach, but they eventually shipped a fix (approximately a month later). I also shared the&#xA;issue with Nicolas Dorier, since BTCPayServer requires a whitelisted connection for its indexer to&#xA;work properly. He checked and told me their Docker configuration, which is the recommended way of&#xA;deploying BTCPayServer, was not affected.&lt;/p&gt;&#xA;&lt;p&gt;The details of the vulnerability have just been published by the Bitcoin Core project in a &lt;a href=&#34;https://bitcoincore.org/en/2026/11/10/disclose-cve-2025-62860/&#34;&gt;security&#xA;advisory&lt;/a&gt;, following its &lt;a href=&#34;https://bitcoincore.org/en/security-advisories/&#34;&gt;security disclosure policy&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As of November 2026, most nodes have upgraded to a Bitcoin Core version that contains the&#xA;mitigation. 13% of reachable peers are still running a version without the mitigation behind Tor,&#xA;which could be vulnerable if configured with a whitelisted IP range that includes the Tor daemon.&#xA;Out of those, 80% run version 28 or earlier, which have been EOL for 6 months or more and are&#xA;already affected by publicly disclosed vulnerabilities, some of them high-severity.&lt;/p&gt;&#xA;&lt;p&gt;To conclude, this is not the most exciting security vulnerability I&amp;rsquo;ve been involved in reporting&#xA;(or patching), but it&amp;rsquo;s certainly one where the embargo period felt the most awkward. There was&#xA;something surreal about coordinating a responsible disclosure with Luke, who was perfectly&#xA;reasonable in our private exchanges while continuing his attacks on Bitcoin Core contributors in&#xA;public. And there was a certain irony in watching those who had turned their preference for Knots&#xA;into a campaign against Bitcoin Core and its contributors post about upgrading to the latest Knots&#xA;release to &amp;ldquo;own&amp;rdquo; Core developers, unaware that the update protected them from a vulnerability&#xA;responsibly disclosed to Knots, and fixed, by those very developers.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Quantum threat: let&#39;s not turn Bitcoin into an altcoin</title>
      <link>https://antoinep.com/posts/quantum_risk_mitigation/</link>
      <pubDate>Fri, 05 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/quantum_risk_mitigation/</guid>
      <description>&lt;p&gt;Cryptographically Relevant Quantum Computers are an uncertain, existential threat to Bitcoin.&#xA;Discussions about addressing this issue raise fundamental questions about the nature of Bitcoin, as&#xA;a consensus system and as a currency. Some trends in the discourse around this issue concern me, so&#xA;naturally i figured one more blog post would fix that.&lt;/p&gt;&#xA;&lt;p&gt;I believe there is something that sets Bitcoin apart from technically similar competing&#xA;alternatives. Apparently, so does the market. The reason for this boils down to network effects:&#xA;people believe Bitcoin is useful because other people believe Bitcoin is useful. And the cornerstone&#xA;of usefulness is reliability: most people expect to be safer storing value in Bitcoin than in any of&#xA;the competing alternatives. I believe this expectation largely matches reality, but the way Bitcoin&#xA;approaches the CRQC threat could drastically change this.&lt;/p&gt;&#xA;&lt;p&gt;Two possible responses to this risk could undermine trust in Bitcoin so severely as to make it&#xA;indistinguishable from an altcoin. The first one is that a large portion of the userbase gets their&#xA;coins stolen, as that would be a fatal blow to network effects. The other one is that the vast&#xA;majority of the economy coordinates to pre-emptively freeze other people&amp;rsquo;s coins, deemed to pose a&#xA;systemic risk if a CRQC materializes, as that would directly undermine Bitcoin&amp;rsquo;s value proposition.&#xA;It is important to stress that the latter is not merely an ideological position: confiscation being&#xA;impractical is the whole reason why users trust Bitcoin to have value in the first place. Break this&#xA;trust, and you&amp;rsquo;ll eventually lose the network effects.&lt;/p&gt;&#xA;&lt;p&gt;These failure scenarios may only be avoided if the vast majority of Bitcoin users have migrated to&#xA;post-quantum output types by the time, if ever, the Bitcoin economy believes a CRQC will imminently&#xA;materialize. Therefore a migration strategy should attempt to maximize the number of individual&#xA;users upgraded before Quantum Panic day (QP-day?). This is an enormous undertaking, because most&#xA;Bitcoin users are not active Bitcoin enthusiasts or companies. They don&amp;rsquo;t keep up with the latest&#xA;developments, rarely move their coins, and even more rarely upgrade their custody setup. This means&#xA;that in the scenario where a CRQC eventually materializes, migration must take place during the&#xA;period of uncertainty, as once we knew for sure it was going to happen it would already be too late&#xA;to migrate the long tail of Bitcoin users.&lt;/p&gt;&#xA;&lt;p&gt;To make matters worse, the PQ signature scheme would itself be more cumbersome to use and several&#xA;common practices that underpin today&amp;rsquo;s Bitcoin usage would be unavailable&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. This is&#xA;a typical collective action dilemma: everyone would greatly benefit from everyone migrating (in the&#xA;event a CRQC does materialize), yet every individual&amp;rsquo;s benefits to unilaterally migrate are&#xA;low&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; and associated costs are high. In light of this, i think it&amp;rsquo;s useful to classify&#xA;migration strategies in two categories: strategies whose costs are borne individually vs strategies&#xA;whose costs are borne collectively.&lt;/p&gt;&#xA;&lt;p&gt;In the first category i would include P2QR&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;, an output type that makes a PQ signature scheme&#xA;available &lt;em&gt;exclusively&lt;/em&gt;. This maximizes the (limited&lt;sup id=&#34;fnref1:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;) individual benefits if CRQCs become&#xA;a reality, as it guarantees the owner retains access to his coins on any chain that survives. It is&#xA;also the only option that is effectively a full migration, which is useful in avoiding &amp;ldquo;marketing&#xA;upgrades&amp;rdquo; whereby a service provider adopts the official PQ migration output types while still&#xA;leaving its users dependent on EC security assumptions&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;. Of course, the downside&#xA;of this approach is that individual users must bear the costs of upgrading long before anyone knows&#xA;whether it is at all necessary. This strategy therefore does not satisfactorily address the &amp;ldquo;long&#xA;tail&amp;rdquo; problem.&lt;/p&gt;&#xA;&lt;p&gt;In the second category i would include P2TRv2&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;, which prescribes introducing a Taproot clone&#xA;with a PQ signature scheme available in leaf scripts, so users can attach a PQ escape hatch to their&#xA;coins at no cost, to later complete the migration by disabling EC operations in this output type&#xA;if/when the CRQC threat materializes. Because it is no more expensive to use, wallets would start&#xA;defaulting to this output type and progressively migrate the long tail of users over the next&#xA;~decade&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;. As time passes, more information about the progress of CRQCs can guide the&#xA;next steps.&lt;/p&gt;&#xA;&lt;p&gt;This strategy embraces the fact that we simply do not have a good replacement for EC-based&#xA;signatures. Making access to CRQC resistance depend on introducing significant friction in (or giving up&#xA;entirely) established workflows and use cases will lead to users not migrating until the CRQC threat&#xA;materializes. This would not give the long tail of Bitcoin users enough time to migrate before&#xA;QP-day and therefore leave the system vulnerable. Since Bitcoin still systemically relies on EC&#xA;security unless the vast majority of users migrate, P2TRv2 leverages Taproot&amp;rsquo;s hidden spend path&#xA;feature to eliminate the individual costs of opting into the migration, and lets its completion be a&#xA;later consensus change.&lt;/p&gt;&#xA;&lt;p&gt;And even if we had a good replacement for EC cryptography, the P2TRv2 strategy would also shine on&#xA;two fronts. First, it defers the step that comes with more downsides for Bitcoin until the CRQC&#xA;threat becomes less speculative&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;. This is important even if you are convinced CRQCs&#xA;are coming, because a more consensual first step may let the migration begin sooner. Secondly, it&#xA;allows the work of porting to the new signature scheme the wide range of protocols, standards and&#xA;use cases that can be salvaged to proceed in parallel with the migration period.&lt;/p&gt;&#xA;&lt;p&gt;Why not do both then? On the surface, this seems compelling: those who can afford to fully migrate&#xA;to the more cumbersome PQ scheme today can, and others who prefer to opt into the escape-hatch&#xA;solution can as well. Yay, more optionality! Well, not really. One of the options is critical to the&#xA;success of the migration, since it gives a chance to migrate the long tail of users, while the other&#xA;one is more of a nice to have. Actually the more credible EC disabling in P2TRv2 becomes, the more&#xA;the P2QR strategy becomes a waste of onchain space rather than a nice to have. And having the P2TRv2&#xA;output type as the Schelling point of the migration virtually guarantees that EC operations will be&#xA;disabled in this output type: otherwise literally every active user risks losing their funds. Thus&#xA;having P2QR as a second option alongside P2TRv2 would only create more risks by weakening P2TRv2 as&#xA;the Schelling point of the migration.&lt;/p&gt;&#xA;&lt;p&gt;Various alternative strategies have been proposed based on the P2MR output type. First introduced in&#xA;the 8th revision of &lt;a href=&#34;https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki&#34;&gt;BIP 360&lt;/a&gt;, P2MR is a clone of Taproot but without the key path spend. I&#xA;will discuss here the strategy i have seen most widely defended by proponents of P2MR: doing BIP 360&#xA;alongside the introduction of a PQ signature scheme as a Script operand. The motivation is similar&#xA;to that of P2TRv2: let users commit to a PQ spend path while still being able to use the cheaper EC&#xA;spends. The big difference is the removal of the key path in an attempt to mitigate &amp;ldquo;long range&amp;rdquo;&#xA;attacks. This difference unfortunately makes migration more expensive by about 15%&lt;sup id=&#34;fnref:8&#34;&gt;&lt;a href=&#34;#fn:8&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;8&lt;/a&gt;&lt;/sup&gt; and&#xA;preemptively gives up the Taproot &lt;a href=&#34;https://delvingbitcoin.org/t/changes-to-bip-360-pay-to-quantum-resistant-hash-p2qrh/1811/11&#34;&gt;incentive structure&lt;/a&gt;, key feature of the last&#xA;Bitcoin upgrade. I believe this is the wrong tradeoff.&lt;/p&gt;&#xA;&lt;p&gt;The long-range vs short-range distinction is at the heart of the debate around the PQ migration&#xA;strategy. I believe most of the disagreements come down to whether we should see this distinction as&#xA;meaningful. From the point of view of an individual Bitcoin user, it certainly is meaningful: in a&#xA;world where your public key becomes a secret, sharing it on a global public broadcast network&#xA;clearly will increase your risk. But this does not mean that the distinction is meaningful when&#xA;considering the Bitcoin system as a whole. Public keys are already assumed to be, well, public&#xA;throughout widely adopted workflows. Users trust that the discrete logarithm problem is hard when&#xA;their hardware wallets share their xpub with online devices, when their wallet software shares their&#xA;xpub or output descriptor with their wallet provider, when they share their xpub with a payee, when&#xA;they publish a silent payment address or a paynym, when they reuse or spend from a hashed-pubkey&#xA;address, etc.. In these conditions, whether some users have their public keys hashed onchain before&#xA;spending time is irrelevant to the PQ migration of the Bitcoin system.&lt;/p&gt;&#xA;&lt;p&gt;To fully migrate Bitcoin away from relying on EC security, the P2MR strategy would therefore need to&#xA;be complemented by a later disabling of EC operations, just like P2TRv2. But besides making it more&#xA;expensive for users to opt into the migration output type, it also incentivizes using it for&#xA;&lt;a href=&#34;https://delvingbitcoin.org/t/changes-to-bip-360-pay-to-quantum-resistant-hash-p2qrh/1811/9&#34;&gt;purposes&lt;/a&gt; other than PQ migration. This makes it harder to believe that 1) enough&#xA;users would migrate in the first place and 2) the EC disabling would in fact happen, since it would&#xA;raise confiscation concerns. For these reasons, and because i don&amp;rsquo;t think we should downgrade&#xA;Bitcoin until CRQCs materialize, i think P2TRv2 is a superior solution to P2MR.&lt;/p&gt;&#xA;&lt;p&gt;In conclusion, the goal of a PQ migration should be to allow Bitcoin &lt;strong&gt;as we know it&lt;/strong&gt; to survive a&#xA;break of the discrete logarithm assumption. Transforming Bitcoin into yet another altcoin by&#xA;permitting widespread theft, or by enabling confiscation, is not an interesting goal. The major&#xA;challenge is that each individual Bitcoin user would strongly benefit from everyone else migrating,&#xA;while migration itself is individually costly and would need to begin long before we can be&#xA;reasonably certain whether the CRQC threat will materialize. The P2TRv2 strategy addresses this&#xA;issue by shifting the migration costs from individual users opting into using the new output&#xA;type in the short term, to ~all Bitcoin users coordinating to update consensus rules in the&#xA;medium to long term. And P2TRv2 variants that allow users to avoid revealing their public&#xA;key onchain before spending make, in my view, the wrong set of tradeoffs.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Mikhail Kudinov and Jonas Nick, &lt;a href=&#34;https://eprint.iacr.org/2025/2203&#34;&gt;“Hash-based Signature Schemes for Bitcoin”&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Why should one migrate if nobody else does? One response may be to have coins available&#xA;on an altcoin that bootstraps off of Bitcoin&amp;rsquo;s UTxO set, but it says nothing of the value of said&#xA;coins on whichever chain survives. This also ignores another option available to many users: just&#xA;selling (part of) their coins to hedge against the CRQC risk.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;I steelmanned the case for P2QR &lt;a href=&#34;https://gnusha.org/pi/bitcoindev/0vqF88LoOnY4GiUB4vf-MdeZpTAtR70tokS3cLwt2DX0e6_fD1X_wyhPwWEdIdm6R88AULObIU08CWsb5QfeoaM5c4yXPqN5wHyCrqMCtfQ=@protonmail.com/&#34;&gt;here&lt;/a&gt;, Pieter also previously&#xA;suggested something like P2QR &lt;a href=&#34;https://delvingbitcoin.org/t/changes-to-bip-360-pay-to-quantum-resistant-hash-p2qrh/1811/20&#34;&gt;here&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Since &amp;ldquo;Post-Quantum&amp;rdquo; is a valuable marketing label currently, and most of the&#xA;costs associated with migration arise not from using a different output type, but updating all your&#xA;workflow with the new signature type that does not rely on EC security, this seems likely to happen.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;First proposed by Matt Corallo &lt;a href=&#34;https://gnusha.org/pi/bitcoindev/c2684826-6c93-419b-9a96-c0f0a791c9ac@mattcorallo.com/&#34;&gt;here&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;This is possible because the vast majority of wallets use a single-key spending policy&#xA;and follow BIP 32 to deterministically generate keys from a master key. This BIP 32 master key is&#xA;itself derived from a seed using a hash function (the seed is itself generally derived from mnemonic&#xA;words using BIP 39). This makes it possible to securely use a PQ key derived from the BIP 32 seed&#xA;even if EC cryptography is broken.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:7&#34;&gt;&#xA;&lt;p&gt;There are of course &lt;em&gt;some&lt;/em&gt; downsides to this first step, such as introducing a new&#xA;output type. But these downsides are marginal compared to those of alternative strategies, and also&#xA;come with benefits in the case where CRQCs never materialize, such as having more users migrated to&#xA;Taproot.&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:8&#34;&gt;&#xA;&lt;p&gt;Calculation based on a 2-input, 2-output transaction for a typical single-key spending policy.&amp;#160;&lt;a href=&#34;#fnref:8&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Misbehaving nodes investigation</title>
      <link>https://antoinep.com/posts/misbehaving_nodes/</link>
      <pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/misbehaving_nodes/</guid>
      <description>&lt;p&gt;In late June 2025, Eric Voskuil reached out to me asking about a weird behaviour he had observed&#xA;on the Bitcoin network. Libbitcoin had started dropping peers which advertized an excessively off&#xA;timestamp in their &lt;code&gt;version&lt;/code&gt; message and they found that while most peers were within seconds, a&#xA;handful were off by small amounts and a large number was behind by up to 5100 minutes.  What&amp;rsquo;s more,&#xA;all those peers were Bitcoin Core v27.1 or v27.2.&lt;/p&gt;&#xA;&lt;p&gt;Now, to be clear, 5100 minutes is &lt;em&gt;a lot&lt;/em&gt;. Bitcoin Core will reject block (headers) with a timestamp&#xA;more than 2 hours in the future. 5100 minutes is 3.5 days behind: a node with a local clock so&#xA;skewed will reject blocks when they are created. It would only catchup due to Bitcoin Core&amp;rsquo;s&#xA;&lt;a href=&#34;https://github.com/bitcoin/bitcoin/blob/5ad79b203505fe7b867c05139d78e9aa6d662dcc/src/net_processing.cpp#L5241-L5266&#34;&gt;stale tip detection logic&lt;/a&gt;, 3.4 days later. Further, that &lt;em&gt;all&lt;/em&gt; of them are&#xA;running specifically (outdated) versions 27.1 or 27.2 is quite odd.&lt;/p&gt;&#xA;&lt;p&gt;I of course suspected spy nodes. But it was not a very satisfactory answer. Any surprising&#xA;behaviour could be attributed to a spy node, and i don&amp;rsquo;t see any reason for a spy to tell everyone&#xA;their clock is days behind. And why would they alternate versions, but &lt;em&gt;only&lt;/em&gt; between 27.1 and 27.2?&#xA;Clearly that didn&amp;rsquo;t explained much. However Bitcoin Core &lt;a href=&#34;https://bitcoincore.org/en/releases/27.0/#p2p-and-network-changes&#34;&gt;dropped network-adjusted time in&#xA;27.0&lt;/a&gt; and later &lt;a href=&#34;https://github.com/bitcoin/bitcoin/pull/29623&#34;&gt;cleaned up&lt;/a&gt; the relevant logic in 28.0. I&#xA;figured it might be the case that a bug slipped through in the removal for 27 and was inadvertently&#xA;fixed when this logic was cleaned up in 28. And the fact that we only noticed this bug for 27.1 and&#xA;27.2 nodes would be simply that all 27.0 nodes had upgraded to patch releases. That seemed pretty&#xA;unlikely, but was the best hunch i could come up with off the top of my head.&lt;/p&gt;&#xA;&lt;p&gt;A couple days later, Eric comes back with another oddity. This time, he notices a bunch of nodes&#xA;that don&amp;rsquo;t honour the &lt;code&gt;version&lt;/code&gt; message&amp;rsquo;s relay flag. The &lt;code&gt;relay&lt;/code&gt; flag instructs a node whether it&#xA;should announce transactions to the sender of the &lt;code&gt;version&lt;/code&gt; message. Not respecting this flag is a&#xA;protocol violation and will result in a disconnection, in Bitcoin Core or Libbitcoin alike. In&#xA;Eric&amp;rsquo;s experiment Libbitcoin would always set &lt;code&gt;relay&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; and yet those peers would still&#xA;announce it transactions. All of the misbehaving peers were Bitcoin Core version 25.0 or 25.1 (but&#xA;never 25.2!). Again, weird. The announced transactions traffic appeared to be organic, it wasn&amp;rsquo;t&#xA;someone trying to exploit something.&lt;/p&gt;&#xA;&lt;p&gt;In both cases, these are nodes that are misbehaving but don&amp;rsquo;t appear to be particularly malicious.&#xA;In both cases, the malicious nodes claim to be some outdated Bitcoin Core version, and in at least&#xA;one of these cases we know it&amp;rsquo;s not true (Bitcoin Core will always honour the &lt;code&gt;relay&lt;/code&gt; flag). Was it&#xA;some script kiddy who modified a Bitcoin Core client without knowing what he&amp;rsquo;s doing? That seems&#xA;highly unlikely as that&amp;rsquo;s 4 different versions and &lt;strong&gt;hundreds&lt;/strong&gt; of nodes in total. Some proxy&#xA;spoofing the &lt;code&gt;version&lt;/code&gt; message of a Bitcoin Core node? For what purpose?&lt;/p&gt;&#xA;&lt;p&gt;At this point my guesswork was hitting a wall, so i asked Eric for a sample of the specific IPs&#xA;exposing this behaviour. Upon receiving the sample, trying to connect to a couple of those IPs using&#xA;a Bitcoin Core node did not expose this behaviour. I reported back to Eric, hinting that it must be&#xA;a bug in his implementation. After further testing Eric found out that the time reported by these&#xA;nodes was cycling between different values, a correct ones and a few skewed ones. &amp;ldquo;Almost like it&amp;rsquo;s&#xA;4 nodes.&amp;rdquo; Hmm. By repeatedly connecting to those nodes, it was possible to observe the same&#xA;behaviour with Bitcoin Core. I decided to start writing a script which would repeatedly connect to&#xA;these IPs and collect their &lt;code&gt;version&lt;/code&gt; messages.&lt;/p&gt;&#xA;&lt;p&gt;I brought this up over lunch at &lt;a href=&#34;https://chaincode.com/&#34;&gt;Chaincode&lt;/a&gt;, as well as to Bitcoin&amp;rsquo;s Chief Data Enjoyer,&#xA;&lt;a href=&#34;https://b10c.me&#34;&gt;@0xb10c&lt;/a&gt;. Pieter analyzed my IPs sample and remarked they virtually all belonged to the same&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Autonomous_system_%28Internet%29&#34;&gt;AS&lt;/a&gt;, &lt;a href=&#34;https://www.peeringdb.com/net/37635&#34;&gt;AS401199&lt;/a&gt; dubbed &amp;ldquo;Bitprojects&amp;rdquo;. &amp;ldquo;Looks like pretty much 4 full /24&amp;rsquo;s.&amp;rdquo;&#xA;Hmm. Meanwhile, @0xb10c shared some historical data he had about &lt;code&gt;start_height&lt;/code&gt;, which was equally&#xA;off. Interestingly, it made clear the divide between skewed clock / height and not was also between&#xA;versions. He also mentioned that somebody else had reached out to him about these IPs, not because&#xA;of the time offset but because the person noticed one of them took 13s to reply to a &lt;code&gt;GETDATA&lt;/code&gt;.&#xA;Finally, he had also noticed the cycling behaviour:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I looked a bit more at my data, and it seems that if you connect to an IP twice, you might reach a&#xA;different node from time to time. At least it gives you a singificantly different start_height and&#xA;timeoffset.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://antoinep.com/posts/misbehaving_nodes/b10c_historical_start_height.png&#34; alt=&#34;Historical data about version message from @0xb10c&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;At this point it became clear &lt;a href=&#34;https://bitprojects.io/index.html&#34;&gt;Bitprojects&lt;/a&gt; was running misconfigured nodes&#xA;with some sort of broken proxy in front of them. Most likely it was related to their &amp;ldquo;anycast&#xA;hosting&amp;rdquo; service. I initially considered they may be running for each IP one correctly configured&#xA;node and several misconfigured ones. But this wouldn&amp;rsquo;t explain how they fail to honour the &lt;code&gt;relay&lt;/code&gt;&#xA;flag in version messages. Or set &lt;code&gt;NODE_NETWORK&lt;/code&gt; even for pruned nodes (another misbehaviour Eric&#xA;noticed). So they must have some sort of buggy middleware in-between? It actually turned out that&#xA;the set of IPs with skewed clocks and the set of IPs sending incorrect version messages were&#xA;disjoint. I focused on the skewed clocks for now, the rest is a mystery for another day. To learn&#xA;more about how they exactly screwed up the timestamp and height, i ran a Script which would connect&#xA;8 times in a row to every Bitprojects IP. For each connection it would collect the announced time&#xA;and start height.&lt;/p&gt;&#xA;&lt;p&gt;I ran this Script around block height &lt;code&gt;902950&lt;/code&gt;. In total i received 2951 version messages with a&#xA;correct block height, 379 messages for block height &lt;code&gt;902577&lt;/code&gt; (about 2 days and a half behind), 347&#xA;messages for block height &lt;code&gt;902446&lt;/code&gt; (about 3 days and a half behind), 395 messages for height&#xA;&lt;code&gt;902440&lt;/code&gt;, 388 messages for height &lt;code&gt;902435&lt;/code&gt;, 354 messages for height &lt;code&gt;902425&lt;/code&gt;, 363 for height&#xA;&lt;code&gt;902409&lt;/code&gt;, 408 messages for height &lt;code&gt;902403&lt;/code&gt;, and a few outliers. The timestamps received essentially&#xA;matched those values. Looking at the specific values returned per IP, although their behaviour&#xA;wasn&amp;rsquo;t perfectly consistent, there was a clear pattern of returning a correct value about half the&#xA;time, and when it&amp;rsquo;s skewed half the time it&amp;rsquo;s about 2 days behind and the rest of the time about 3&#xA;days behind. Here is an excerpt:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;IP 203.11.72.225: 8 version messages&#xA;        Time &amp;#39;2025-06-27T10:55:12&amp;#39;: 4 version messages&#xA;        Time &amp;#39;2025-06-24T01:06:34&amp;#39;: 2 version messages&#xA;        Time &amp;#39;2025-06-25T05:33:20&amp;#39;: 1 version messages&#xA;        Time &amp;#39;2025-06-23T22:08:14&amp;#39;: 1 version messages&#xA;        Height 902950: 4 version messages&#xA;            2025-06-27T10:55:12&#xA;            2025-06-27T10:55:54&#xA;            2025-06-27T10:56:34&#xA;            2025-06-27T10:57:28&#xA;        Height 902425: 2 version messages&#xA;            2025-06-24T01:06:34&#xA;            2025-06-24T01:07:54&#xA;        Height 902577: 1 version messages&#xA;            2025-06-25T05:33:20&#xA;        Height 902440: 1 version messages&#xA;            2025-06-23T22:08:14&#xA;&#xA;IP 203.11.72.226: 8 version messages&#xA;        Time &amp;#39;2025-06-27T10:55:06&amp;#39;: 5 version messages&#xA;        Time &amp;#39;2025-06-23T22:08:33&amp;#39;: 2 version messages&#xA;        Time &amp;#39;2025-06-25T05:34:40&amp;#39;: 1 version messages&#xA;        Height 902950: 5 version messages&#xA;            2025-06-27T10:55:06&#xA;            2025-06-27T10:55:28&#xA;            2025-06-27T10:55:54&#xA;            2025-06-27T10:56:14&#xA;            2025-06-27T10:56:54&#xA;        Height 902435: 1 version messages&#xA;            2025-06-23T22:08:33&#xA;        Height 902440: 1 version messages&#xA;            2025-06-23T22:08:14&#xA;        Height 902577: 1 version messages&#xA;            2025-06-25T05:34:40&#xA;&#xA;IP 203.11.72.227: 8 version messages&#xA;        Time &amp;#39;2025-06-27T10:55:12&amp;#39;: 4 version messages&#xA;        Time &amp;#39;2025-06-23T22:08:13&amp;#39;: 2 version messages&#xA;        Time &amp;#39;2025-06-24T01:15:23&amp;#39;: 1 version messages&#xA;        Time &amp;#39;2025-06-25T05:34:01&amp;#39;: 1 version messages&#xA;        Height 902950: 4 version messages&#xA;            2025-06-27T10:55:12&#xA;            2025-06-27T10:55:29&#xA;            2025-06-27T10:55:54&#xA;            2025-06-27T10:57:07&#xA;        Height 902435: 1 version messages&#xA;            2025-06-23T22:08:13&#xA;        Height 902403: 1 version messages&#xA;            2025-06-24T01:15:23&#xA;        Height 902577: 1 version messages&#xA;            2025-06-25T05:34:01&#xA;        Height 902446: 1 version messages&#xA;            2025-06-23T22:13:27&#xA;&#xA;IP 203.11.72.228: 8 version messages&#xA;        Time &amp;#39;2025-06-27T10:55:12&amp;#39;: 5 version messages&#xA;        Time &amp;#39;2025-06-24T01:15:24&amp;#39;: 2 version messages&#xA;        Time &amp;#39;2025-06-25T05:34:01&amp;#39;: 1 version messages&#xA;        Height 902950: 5 version messages&#xA;            2025-06-27T10:55:12&#xA;            2025-06-27T10:55:34&#xA;            2025-06-27T10:55:49&#xA;            2025-06-27T10:56:14&#xA;            2025-06-27T10:57:34&#xA;        Height 902403: 2 version messages&#xA;            2025-06-24T01:15:24&#xA;            2025-06-24T01:16:02&#xA;        Height 902577: 1 version messages&#xA;            2025-06-25T05:34:01&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I eventually reached out to the Bitprojects maintainer, who was very responsive. They let me know&#xA;the misbehaviour was due to a clock misconfiguration, and the nodes running out of resources. They&#xA;said they would immediately pause the nodes until they can reconfigure them properly.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>On relay policy and recent OP_RETURN drama</title>
      <link>https://antoinep.com/posts/relay_policy_drama/</link>
      <pubDate>Thu, 01 May 2025 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/relay_policy_drama/</guid>
      <description>&lt;p&gt;I recently &lt;a href=&#34;https://gnusha.org/pi/bitcoindev/rhfyCHr4RfaEalbfGejVdolYCVWIyf84PT2062DQbs5-eU8BPYty5sGyvI3hKeRZQtVC7rn_ugjUWFnWCymz9e9Chbn7FjWJePllFhZRKYk=@protonmail.com&#34;&gt;emailed&lt;/a&gt; the Bitcoin development mailing list about lifting the restrictions&#xA;on the use of &lt;code&gt;OP_RETURN&lt;/code&gt; outputs in standard transactions. This triggered yet another shitstorm,&#xA;which prompted me to lay down my thoughts on the topic as a blog post to minimize the time wasted&#xA;arguing in parts on Twitter.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-relay-policy-and-why-is-it-necessary&#34;&gt;What is relay policy and why is it necessary?&lt;/h2&gt;&#xA;&lt;p&gt;Policy is extremely broad and refers to all the rules observed by the software when interacting with&#xA;the Bitcoin P2P network. Examples include the organization of requests emitted to peers, delays in&#xA;message processing, refusing to process blocks with a timestamp more than 2 hours in the future&#xA;(compared to the system time), or refusing to process certain types of transactions. The object of&#xA;recent drama is the latter. I will use the nomenclature from my &lt;a href=&#34;https://bitcoin.stackexchange.com/a/120271/101498&#34;&gt;Bitcoin Stackexchange answer&lt;/a&gt; on the topic and refer to the rules dictating the format of transactions in isolation as&#xA;&amp;ldquo;transaction standardness&amp;rdquo;, which is a subset of &amp;ldquo;mempool policy&amp;rdquo;, itself considered a subset of&#xA;&amp;ldquo;transaction relay policy&amp;rdquo;, finally a subset of &amp;ldquo;relay policy&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Standardness rules exist for three main reasons. The first is as DoS protection. Your peers on the&#xA;P2P network are not identified and some transactions are more expensive than others to process. An&#xA;asymmetry between the cost of sending you an unconfirmed transaction (which is very small) and the&#xA;cost for you to process it creates a DoS vector. Another reason for standardness rules is to provide&#xA;upgrade hooks for soft forks. Invalidating a type of transactions in a soft fork that was already&#xA;non-standard for a while gives more guarantees that a non-upgraded miner won&amp;rsquo;t include a&#xA;newly-invalid transaction in a block, making soft forks significantly safer to roll out. Finally,&#xA;standardness rules have also been used as a way to nudge behaviour toward a less harmful approach,&#xA;or to mildly deter certain activities. For instance by standardizing &lt;code&gt;OP_RETURN&lt;/code&gt; outputs, or&#xA;discouraging data storage back when &lt;a href=&#34;https://gnusha.org/pi/bitcoindev/QMywWcEgJgWmiQzASR17Dt42oLGgG-t3bkf0vzGemDVNVnvVaD64eM34nOQHlBLv8nDmeBEyTXvBUkM2hZEfjwMTrzzoLl1_62MYPz8ZThs=@wuille.net&#34;&gt;blocks were not full&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-are-the-current-standardness-rules&#34;&gt;What are the current standardness rules?&lt;/h2&gt;&#xA;&lt;p&gt;An unconfirmed transaction will be dropped by Bitcoin Core if:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;it&amp;rsquo;s invalid by consensus;&lt;/li&gt;&#xA;&lt;li&gt;it is timelocked to any future block but the next block;&lt;/li&gt;&#xA;&lt;li&gt;its version is anything but 1, 2 or 3;&lt;/li&gt;&#xA;&lt;li&gt;it&amp;rsquo;s larger than 400k weight units;&lt;/li&gt;&#xA;&lt;li&gt;it&amp;rsquo;s smaller without witness than 65 bytes;&lt;/li&gt;&#xA;&lt;li&gt;any of its inputs has a too large or non-pushonly scriptSig;&lt;/li&gt;&#xA;&lt;li&gt;any of its inputs spends a scriptpubkey that does not match any script template from a shortlist;&lt;/li&gt;&#xA;&lt;li&gt;any of its inputs spends a legacy P2SH scriptpubkey which contains too many signature operations;&lt;/li&gt;&#xA;&lt;li&gt;any of its inputs spends a Segwit P2WSH scriptpubkey which contains a too large witness script;&lt;/li&gt;&#xA;&lt;li&gt;any of its inputs spends a Taproot output with a witness stack which contains an annex;&lt;/li&gt;&#xA;&lt;li&gt;any of its inputs&amp;rsquo; witness stacks contain a too large element;&lt;/li&gt;&#xA;&lt;li&gt;any of its outputs has a scriptPubKey which does not match any script template from a shortlist;&lt;/li&gt;&#xA;&lt;li&gt;if more than one of its outputs matches the &lt;code&gt;OP_RETURN&lt;/code&gt; (&amp;ldquo;datacarrier&amp;rdquo;) template;&lt;/li&gt;&#xA;&lt;li&gt;any of its outputs has a below-dust value;&lt;/li&gt;&#xA;&lt;li&gt;it requires validating too many signatures overall;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what-modification-is-proposed-why&#34;&gt;What modification is proposed? Why?&lt;/h2&gt;&#xA;&lt;p&gt;I recently suggested lifting the restrictions on the usage of &lt;code&gt;OP_RETURN&lt;/code&gt; outputs in standard&#xA;transactions. &amp;ldquo;&lt;code&gt;OP_RETURN&lt;/code&gt;s&amp;rdquo; are a provably-unspendable type of outputs that were made standard in&#xA;response to the usage of regular output types to store data in the Bitcoin blockchain (that is,&#xA;non-transaction data). The goal was to provide a less harmful but as convenient method to store the&#xA;data, that good actors could pick up. This was &lt;a href=&#34;https://transactionfee.info/charts/output-opreturn&#34;&gt;successful&lt;/a&gt;. Along with the&#xA;standardization of this new output type, the size of the associated data was limited as a mild&#xA;deterrent against storing too much data.&lt;/p&gt;&#xA;&lt;p&gt;Mild deterrent because these are otherwise valid transactions, that the node would accept as part of&#xA;a block. Most of the public transaction relay network enforcing a policy of filtering too large&#xA;&lt;code&gt;OP_RETURN&lt;/code&gt; outputs could deter isolated demand for those, or nudge developers to design their&#xA;applications to take these limitations into account. But it is &lt;strong&gt;ineffective&lt;/strong&gt; to prevent this type&#xA;of transactions from being used if there is significant demand for them. Worse, treating a widely&#xA;used type of transaction as non-standard is actually &lt;strong&gt;harmful&lt;/strong&gt; from both the perspective of a node&#xA;runner (blinding them to part of the network activity) and that of the network at large (hurting&#xA;optimistic block reconstruction).&lt;/p&gt;&#xA;&lt;p&gt;For a long time, &lt;code&gt;OP_RETURN&lt;/code&gt;s remained the primary mean for people to store a small amount of data&#xA;onchain. A few years ago people started leveraging the Segwit discount and storing data into an&#xA;input&amp;rsquo;s witness instead. This let them store more data at a lower cost. A trend started around &lt;a href=&#34;https://docs.ordinals.com/inscriptions.html&#34;&gt;this&#xA;type&lt;/a&gt; of transactions, which became in high demand. In fact so much so that it&#xA;became the main driver of block space demand for a while. Although this approach already permitted&#xA;to store ~5000 times more data in a single standard transaction, the demand for inscription&#xA;incentivized people to build &lt;a href=&#34;https://slipstream.mara.com&#34;&gt;private bridges&lt;/a&gt; to miners to bypass other standardness&#xA;limits such as the maximum transaction size in order to store even more data.&lt;/p&gt;&#xA;&lt;p&gt;We are now in a situation where Bitcoin Core&amp;rsquo;s restriction on the size of &lt;code&gt;OP_RETURN&lt;/code&gt;s by&#xA;standardness is not binding anymore. One can store ~5000 times as much data in a standard&#xA;transaction by stuffing its witness. Private bridges to miners and alternative public relay networks&#xA;were built that allow to store ~50k times as more data in a single transaction. In fact these&#xA;alternative relays allow bypassing several of Bitcoin Core&amp;rsquo;s standardness rules, including the&#xA;maximum size of &lt;code&gt;OP_RETURN&lt;/code&gt;s!&lt;/p&gt;&#xA;&lt;p&gt;While these restrictions are not binding anymore for whoever wants to store data onchain, they still&#xA;unnecessarily restrict constructions with time-sensitive transactions. Protocol designers want those&#xA;transactions to be standard for a good reason: they don&amp;rsquo;t want to rely on private bridges for&#xA;security-critical transaction broadcast. Those transactions need to relay properly on the more&#xA;censorship resistant public network. It was recently brought to my attention that &lt;a href=&#34;https://citrea.xyz/&#34;&gt;Citrea&lt;/a&gt;&#xA;faced this situation with their &lt;a href=&#34;https://github.com/chainwayxyz/clementine&#34;&gt;Clementine bridge&lt;/a&gt;. In their construction, a watchtower&#xA;challenge transaction needs to both pass on 144 bytes of data and be confirmed as soon as possible.&#xA;Since they are restricted to a single 80 bytes &lt;code&gt;OP_RETURN&lt;/code&gt; output by Bitcoin Core standardness, they&#xA;use two unspendable Taproot outputs to include the other 64 bytes of data. These Taproot outputs&#xA;will remain unspent forever, and every single full node will have to keep them in its UTxO set&#xA;forever.&lt;/p&gt;&#xA;&lt;p&gt;In the specific case of Citrea, it&amp;rsquo;s unlikely that many of those outputs would end up onchain. But&#xA;it illustrates a severe issue in Bitcoin Core&amp;rsquo;s standardness rules. Not only they do not provide&#xA;binding constraints to prevent using the block chain to store arbitrary data, they also incentivize&#xA;more harmful ways of storing data! This is why i proposed to drop those restrictions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-about-optionality-do-you-hate-freedom&#34;&gt;What about optionality? Do you hate freedom?&lt;/h2&gt;&#xA;&lt;p&gt;Peter Todd&amp;rsquo;s &lt;a href=&#34;https://github.com/bitcoin/bitcoin/pull/32359&#34;&gt;pull request&lt;/a&gt; to drop these restrictions also removes the accompanying&#xA;startup options (&lt;code&gt;-datacarrier&lt;/code&gt; and &lt;code&gt;-datacarriersize&lt;/code&gt;). This was quickly picked up as a narrative&#xA;by trolls in the thread as well as on social media: not only does Bitcoin Core changes the default,&#xA;it takes its users hostage by preventing them to turn it back on!&lt;/p&gt;&#xA;&lt;p&gt;This is obviously nonsense when you think about it for a minute. These options are one of the only&#xA;knobs available to a user to tweak transaction standardness rules, let alone relay policy. Would it&#xA;make sense for Bitcoin Core to provide startup options to tweak other aspects of policy? Should we&#xA;add an option to let the user pick what transaction version should its node consider standard? An&#xA;option to accept transactions that are timelocked up to &lt;code&gt;N&lt;/code&gt; blocks in the future in its mempool? To&#xA;disable wtxid relay? Obviously not. But why? And how do we think about it consistently?&lt;/p&gt;&#xA;&lt;p&gt;For one, options do not come for free. They increase code complexity and cognitive load on the user.&#xA;Additional load means reduced ability for the user to make an informed decision about every single&#xA;option. So the question, really, is when should we have an option? I think the answer to that is&#xA;&amp;ldquo;when we can reasonably expect users to have a good reason to change the default, and more so than&#xA;for other options we could provide instead&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;According to this criterion we&amp;rsquo;ve established, what can we say of &lt;code&gt;-datacarrier&lt;/code&gt; and&#xA;&lt;code&gt;-datacarriersize&lt;/code&gt; in a world where there is no restriction on &lt;code&gt;OP_RETURN&lt;/code&gt;s by default? First of all&#xA;defaults are sticky. The vast majority of people do not change the default, so we can&amp;rsquo;t really&#xA;expect providing the startup option to have any global effect. The local effect of a user setting&#xA;&lt;code&gt;-datacarrier=0&lt;/code&gt; or &lt;code&gt;-datacarriersize=X&lt;/code&gt; on their node would effectively just be shooting themselves&#xA;in the foot: they would willfully blind themselves to part of unconfirmed transaction activity. If&#xA;they are a miner this could increase roundtrips for compact block reconstruction. If they are&#xA;transacting, this would prevent them from seeing part of transactions they are competing with&#xA;for block space.&lt;/p&gt;&#xA;&lt;p&gt;Once the default is set to not impose restrictions on the use of &lt;code&gt;OP_RETURN&lt;/code&gt; outputs, there is no&#xA;reason for a user to change the default. Therefore i don&amp;rsquo;t think a startup option to do that should&#xA;exist.&lt;/p&gt;&#xA;&lt;p&gt;Freedom is good. Having a startup option for every single operation that pertains to relay policy is&#xA;not that.&lt;/p&gt;&#xA;&lt;h2 id=&#34;is-bitcoin-dead&#34;&gt;Is Bitcoin dead?&lt;/h2&gt;&#xA;&lt;p&gt;No.&lt;/p&gt;&#xA;&lt;p&gt;Many have taken the opportunity of my proposal to grandstand on Twitter. They exploit gullible&#xA;people by making wild claims about &lt;code&gt;OP_RETURN&lt;/code&gt; outputs being an existential threat to Bitcoin. I&#xA;hope my post made it clear it is not, but consider also this. If Bitcoin was so brittle that Core&#xA;choosing to relay perfectly safe, inexpensive to validate, consensus-valid transactions would break&#xA;it, it would be utterly uninteresting in the first place!&lt;/p&gt;&#xA;&lt;p&gt;The ability of this parasitical group to reach this level of attention is really telling of what our&#xA;community values. I hope bitcoiners start demonstrating more critical thinking and stop giving in to&#xA;the latest conspiracy theory every 6 months.&lt;/p&gt;&#xA;&lt;h2 id=&#34;is-bitcoin-core-compromised&#34;&gt;Is Bitcoin Core compromised?&lt;/h2&gt;&#xA;&lt;p&gt;No.&lt;/p&gt;&#xA;&lt;p&gt;You should be highly skeptical of anyone making this claim. It undermines Bitcoin&amp;rsquo;s long term&#xA;success.  Cultural incentives matter. It is about time that we stop tolerating nonsense and come&#xA;back to a place where most of us value (proof of) work, ideas, and selflessness instead of overblown&#xA;emotional reactions, unbacked wild claims and adhesion to various cults.&lt;/p&gt;&#xA;&lt;p&gt;For more on Bitcoin Core i highly recommend Adam Jonas&amp;rsquo; &amp;ldquo;&lt;a href=&#34;https://youtu.be/TqxDr_SjAgg?t=19080&#34;&gt;Has Bitcoin Core lost focus?&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>CVE-2025-43707: out-of-bounds read in the Rust-Miniscript satisfier</title>
      <link>https://antoinep.com/posts/cve-2025-43707/</link>
      <pubDate>Thu, 24 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/cve-2025-43707/</guid>
      <description>&lt;p&gt;On March 25, &lt;a href=&#34;https://github.com/pythcoiner&#34;&gt;@Pythcoiner&lt;/a&gt; from the&#xA;&lt;a href=&#34;https://wizardsardine.com&#34;&gt;Wizardsardine&lt;/a&gt; team contacted me about a crash bug&#xA;in &lt;a href=&#34;https://github.com/wizardsardine/liana&#34;&gt;Liana&lt;/a&gt; they had identified as&#xA;coming from the&#xA;&lt;a href=&#34;https://github.com/rust-bitcoin/rust-miniscript&#34;&gt;&lt;code&gt;rust-miniscript&lt;/code&gt;&lt;/a&gt;&#xA;dependency. After investigating i identified the crash as coming from the&#xA;library&amp;rsquo;s Miniscript satisfier, and found it could be triggered by an attacker.&lt;/p&gt;&#xA;&lt;p&gt;The impact of this vulnerability is that an attacker could make a victim crash by getting them to&#xA;satisfy a transaction spending a specially-crafted descriptor. In simpler terms, a victim could&#xA;crash when &amp;ldquo;signing&amp;rdquo; a transaction that spends from a specific &amp;ldquo;wallet&amp;rdquo;. This is not critical (but&#xA;still pretty annoying!) if you consider the victim as being a software running locally. But these&#xA;are pretty common operations and it would not be surprising that an application running on a server&#xA;publicly exposes them (for instance through &lt;a href=&#34;https://bitcoindevkit.org/adoption/all&#34;&gt;BDK&lt;/a&gt;). There,&#xA;an attacker exploiting this bug could prevent all users from accessing the service.&lt;/p&gt;&#xA;&lt;p&gt;The bug itself is an out-of-bounds read in the &lt;a href=&#34;https://github.com/rust-bitcoin/rust-miniscript/blob/e6404b77b819a6e8477f34ee2561f69631643d0e/src/miniscript/satisfy.rs#L1029&#34;&gt;&lt;code&gt;Satisfaction::thresh()&lt;/code&gt;&lt;/a&gt; function.&#xA;This code assumes that the size of the &lt;code&gt;sat_indices&lt;/code&gt; vector is strictly superior to the threshold&#xA;&lt;code&gt;k&lt;/code&gt;. This is not always the case, as &lt;code&gt;thresh(2,A,B)&lt;/code&gt; is valid Miniscript. Therefore trying to&#xA;satisfy any &lt;code&gt;thresh()&lt;/code&gt; fragment with a threshold &lt;code&gt;k&lt;/code&gt; equal to the number of sub-fragments will&#xA;trigger an out-of-bounds read in the &lt;code&gt;sat_indices&lt;/code&gt; vector. It can be fixed with the following diff:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-patch&#34; data-lang=&#34;patch&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;diff --git a/src/miniscript/satisfy.rs b/src/miniscript/satisfy.rs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;index d141340..cca7051 100644&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;--- a/src/miniscript/satisfy.rs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+++ b/src/miniscript/satisfy.rs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -1026,7 +1026,8 @@ impl&amp;lt;Pk: MiniscriptKey + ToPublicKey&amp;gt; Satisfaction&amp;lt;Placeholder&amp;lt;Pk&amp;gt;&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;         // For example, the fragment thresh(2, hash, hash, 0, 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         // is uniquely satisfyiable because there is no satisfaction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         // for the 0 fragment&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-        else if !sats[sat_indices[thresh.k()]].has_sig&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+        else if sat_indices.len() &amp;gt; thresh.k()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+            &amp;amp;&amp;amp; !sats[sat_indices[thresh.k()]].has_sig&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt;             &amp;amp;&amp;amp; sats[sat_indices[thresh.k()]].stack != Witness::Impossible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             // All arguments should be `d`, so dissatisfactions have no&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I reported this issue according to &lt;a href=&#34;https://github.com/rust-bitcoin/rust-bitcoin/blob/master/SECURITY.md&#34;&gt;&lt;code&gt;rust-bitcoin&lt;/code&gt;&amp;rsquo;s security&#xA;policy&lt;/a&gt; by emailing Andrew&#xA;Poelstra on March 25th, who acknowledged receipt on the same day. Andrew and Sanket Kanjalkar came&#xA;back to me a couple days later. They asked for a 4 weeks embargo on the details and silently fixed&#xA;the vulnerability in rust-miniscript &lt;a href=&#34;https://github.com/rust-bitcoin/rust-miniscript/pull/798&#34;&gt;PR&#xA;#798&lt;/a&gt;. The fix was then&#xA;&lt;a href=&#34;https://github.com/rust-bitcoin/rust-miniscript/pull/803&#34;&gt;backported&lt;/a&gt; to the &lt;code&gt;12.x&lt;/code&gt; release branch&#xA;and a &lt;a href=&#34;https://github.com/rust-bitcoin/rust-miniscript/releases/tag/12.3.1&#34;&gt;&lt;code&gt;12.3.1&lt;/code&gt;&lt;/a&gt; version was&#xA;released on April 1st. They also responded to this incident by &lt;a href=&#34;https://github.com/rust-bitcoin/rust-miniscript/pull/798/files#diff-03aa9083322d882a6788541078684e30a3770162a9ba3ead5453d21d5d3593f3&#34;&gt;increasing the fuzz&#xA;coverage&lt;/a&gt;&#xA;of their satisfier.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d like to thank the Rust-Miniscript maintainers Andrew Poelstra and Sanket Kanjalkar for the swift&#xA;reply and the no-bullshit communication throughout this report. Thanks to the Wizardsardine team, and&#xA;@Pythcoiner in particular, for identifying the crash in the first place. Finally, thanks to&#xA;&lt;a href=&#34;https://chaincode.com&#34;&gt;Chaincode Labs&lt;/a&gt; for sponsoring my Bitcoin open source work.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Bitcoin Core scope, concretely</title>
      <link>https://antoinep.com/posts/bitcoin_core_scope/</link>
      <pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/bitcoin_core_scope/</guid>
      <description>&lt;p&gt;In my last two posts i presented Bitcoin Core&amp;rsquo;s &lt;a href=&#34;https://antoinep.com/posts/core_project_direction&#34;&gt;prioritisation&#xA;issues&lt;/a&gt; and then &lt;a href=&#34;https://antoinep.com/posts/stating_the_obvious&#34;&gt;provided an&#xA;answer&lt;/a&gt; to what the scope and goals of the Bitcoin&#xA;Core project should be. Now what?&lt;/p&gt;&#xA;&lt;p&gt;Well, it&amp;rsquo;s not like we are starting a new project from scratch where we could just begin enforcing&#xA;the scope as we develop it. We are fixing things in flight, with users and developers that depend on&#xA;or care about existing modules that would be out of scope. Although developers working in these&#xA;areas should realize they impose a non-trivial cost on all the other contributors that don&amp;rsquo;t believe&#xA;they should be a priority, just throwing shit at each other is not going to move things forward.&#xA;Engaging with &amp;ldquo;just delete the GUI&amp;rdquo; or &amp;ldquo;just delete the wallet&amp;rdquo; is a non-starter.&lt;/p&gt;&#xA;&lt;p&gt;On the other hand not doing anything is making a choice by default, the choice of continuous burden&#xA;on everyone else and reduced overall software quality.  This needs to be addressed if we want to&#xA;keep Bitcoin Core the go-to full node client for Bitcoin users, but also to keep critical&#xA;contributors motivated to continue working on the project.&lt;/p&gt;&#xA;&lt;p&gt;The multiprocess project presents an opportunity in this regard. Separate &lt;code&gt;bitcoin-node&lt;/code&gt;,&#xA;&lt;code&gt;bitcoin-wallet&lt;/code&gt; and &lt;code&gt;bitcoin-gui&lt;/code&gt; binaries communicating through well-defined interfaces open the&#xA;door to splitting the current project into 3. The contributors at&#xA;&lt;a href=&#34;https://github.com/bitcoin/bitcoin&#34;&gt;github.com/bitcoin/bitcoin&lt;/a&gt; would focus on the Bitcoin Core&#xA;node and release a &lt;code&gt;bitcoin-node&lt;/code&gt; program, exposing JSONRPC and IPC interfaces. The contributors&#xA;at &lt;a href=&#34;https://github.com/bitcoin-core/wallet&#34;&gt;github.com/bitcoin-core/wallet&lt;/a&gt; would work on the&#xA;&lt;code&gt;bitcoin-wallet&lt;/code&gt; process. The Bitcoin Core wallet releases would contain both the wallet and node&#xA;processes, presumably with a wrapper to make it transparent to users. This project would release the&#xA;equivalent of today&amp;rsquo;s &lt;code&gt;bitcoind&lt;/code&gt;. Finally, the contributors at&#xA;&lt;a href=&#34;https://github.com/bitcoin-core/gui&#34;&gt;github.com/bitcoin-core/gui&lt;/a&gt; would develop and release the&#xA;&lt;code&gt;bitcoin-gui&lt;/code&gt; program, which would ship with the node and wallet.  Similarly to the wallet it would&#xA;presumably ship with a wrapper to abstract for the user the technicality of using multiple&#xA;processes. Bitcoin Core the project would still announce and host the node, wallet and GUI releases&#xA;at &lt;a href=&#34;https://bitcoincore.org&#34;&gt;https://bitcoincore.org&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This approach would make it so Bitcoin Core still releases a wallet and a GUI while still reaping&#xA;the benefit that developments in these areas don&amp;rsquo;t impact the workflow of contributors to the node&#xA;project anymore. Of course, there is no free lunch. The maintenance, fix and update burden shifting&#xA;out of the node contributors either means it will shift on to the contributors of the wallet and GUI&#xA;project or that it won&amp;rsquo;t happen at all. This is arguably the entire point: we are currently &lt;a href=&#34;https://antoinep.com/posts/core_project_direction&#34;&gt;trading&#xA;off&lt;/a&gt; quality in the node for maintainance of&#xA;these areas.  I argue &lt;a href=&#34;https://antoinep.com/posts/stating_the_obvious&#34;&gt;this is backward&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This could also be an opportunity for the wallet and GUI projects. There&amp;rsquo;s been little interest in&#xA;contributing to the Bitcoin Core wallet in the past years, despite there being tremendous interest&#xA;in working on Bitcoin wallets in general. For instance&#xA;&lt;a href=&#34;https://github.com/rust-bitcoin&#34;&gt;&lt;code&gt;rust-bitcoin&lt;/code&gt;&lt;/a&gt; has never made so much progress, and&#xA;&lt;a href=&#34;https://github.com/bitcoindevkit/bdk&#34;&gt;BDK&lt;/a&gt; is a major success &lt;a href=&#34;https://bitcoindevkit.org/adoption/all&#34;&gt;adopted by dozens of&#xA;projects&lt;/a&gt; with probably millions of users altogether. They&#xA;have a larger feature set, with the Bitcoin Core wallet still struggling to catch up even years&#xA;after a feature has been largely adopted by the industry&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. I count at least two dozen active&#xA;contributors across these two projects. Regarding the GUI, it&amp;rsquo;s hardly being developed at all&#xA;anymore, with only 29 PRs merged in the past year&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. There&amp;rsquo;s been talk of revamping it forever&#xA;(&lt;a href=&#34;https://github.com/BitcoinDesign/Bitcoin-Core-App&#34;&gt;1&lt;/a&gt;,&#xA;&lt;a href=&#34;https://github.com/bitcoin-core/gui-qml&#34;&gt;2&lt;/a&gt;) but it has never really materialized. It would be&#xA;reasonable for the wallet to have a lower review bar than the node, and for the GUI to have a lower&#xA;one than the wallet, as long as it&amp;rsquo;s advertized to our users. This could enable these projects to&#xA;iterate faster and make more progress. Surely, being in their own project shielded from the&#xA;&lt;a href=&#34;https://bitcoin-irc.chaincode.com/bitcoin-core-dev/2025-01-30#1086218&#34;&gt;animosity of other&#xA;contributors&lt;/a&gt; and with the&#xA;ability to make progress could make working on these project more fun and attract new contributors.&#xA;A larger contributor base could in turn lead to improved software quality and increased capacity to&#xA;catch up with features.&lt;/p&gt;&#xA;&lt;p&gt;Doing this raises a number of questions. What branch of the node would the wallet and GUI projects&#xA;track? How do you split &lt;code&gt;depends&lt;/code&gt;? What about the Guix builds? The shared code in &lt;code&gt;src/common&lt;/code&gt;,&#xA;&lt;code&gt;src/util&lt;/code&gt;, &lt;code&gt;src/crypto&lt;/code&gt;, in tests, etc? There may be non-trivial and non-ideal choices to make in&#xA;the process but we should not overlook the benefits of this approach: we re-focus the main project&#xA;toward its critical mission and we keep the wallet and GUI, possibly unleashing more progress in&#xA;these areas.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;See for instance PSBT v2, a BIP that Ava authored and is &lt;a href=&#34;https://github.com/bitcoin/bitcoin/pull/21283&#34;&gt;still not merged into Bitcoin Core&#xA;after 4 years&lt;/a&gt; due to lack of review. Meanwhile&#xA;&lt;a href=&#34;https://groups.google.com/g/bitcoindev/c/OPx9qvmr5Nc/m/8mp8VHjQBQAJ&#34;&gt;Ledger started using it 4 years&#xA;ago&lt;/a&gt; and it was &lt;a href=&#34;https://github.com/ElementsProject/libwally-core/pull/330&#34;&gt;merged in&#xA;libwally&lt;/a&gt; 2.5 years ago then &lt;a href=&#34;https://github.com/ElementsProject/lightning/pull/5898&#34;&gt;adopted by&#xA;Core-Lightning&lt;/a&gt; 2 years ago.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Running this command on February 12th 2025: &lt;code&gt;git log --merges --grep &amp;quot;bitcoin-core/gui#&amp;quot; --oneline --since=2024-02-12 |wc -l&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Stating the obvious</title>
      <link>https://antoinep.com/posts/stating_the_obvious/</link>
      <pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/stating_the_obvious/</guid>
      <description>&lt;p&gt;Following &lt;a href=&#34;https://antoinep.com/posts/core_project_direction&#34;&gt;my post&lt;/a&gt; from a couple weeks ago, i&#xA;set out to answer my own question.&lt;/p&gt;&#xA;&lt;p&gt;How do we define a project scope? An interesting exercise is to consider what should be the bounds if&#xA;we had near infinite resources. Should there be a limit in the scope of the project then? Surely you&#xA;can think of examples of features we&amp;rsquo;d never want to include in Bitcoin Core (for instance a general&#xA;purpose text editor, a browser, a recursive DNS resolver, ..).  But then where do we draw the line?&#xA;It&amp;rsquo;s tempting to say &amp;ldquo;at non-Bitcoin stuff&amp;rdquo;, but this is only begging the question. A message&#xA;encryption feature (or even &lt;code&gt;signmessage&lt;/code&gt; for this matter) can be argued to be Bitcoin-related as&#xA;much as a DNS resolver.&lt;/p&gt;&#xA;&lt;p&gt;I think in this case the scope should be &amp;ldquo;whatever is demanded by users, subject to veto by&#xA;contributors&amp;rdquo;. The first part is simply because what is useful to Bitcoin Core users may vary so&#xA;widely across usage types and time that it&amp;rsquo;s hard to draw a non-arbitrary line. The second part is&#xA;to reflect that developers won&amp;rsquo;t implement features they believe to be harmful or dumb despite there&#xA;being user demand (think colored coins, inscriptions, altcoin client, ..). Near infinite resources&#xA;means we can assume only those users interested in a feature set bear its associated costs (larger&#xA;binary, additional dependencies, etc). Of course it also means that implementing, reviewing and&#xA;maintaining a new feature does not materially affect the ability of preserving the quality of the&#xA;rest of the software.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately in real life we do not have near infinite resources. Work on a new feature necessarily&#xA;presents an opportunity cost: this development and review time could have been spent elsewhere. In&#xA;addition it presents future costs: it will have to be maintained, and may interact with new features&#xA;being introduced later on. Future work on test infratructure, modernizing the codebase, etc.. now&#xA;will have to deal with it. This is &lt;em&gt;not&lt;/em&gt; an abstract concern. It is also made worse by the&#xA;incentives surrounding the contribution dynamic. Absent a project scope, any feature that receives&#xA;enough review could make it in. The authors get the benefit of getting their feature merged into&#xA;Bitcoin Core, and the maintainers and future contributors pay the associated costs.&lt;/p&gt;&#xA;&lt;p&gt;These costs mean we need to make tradeoffs. We cannot both keep piling more code, more features AND&#xA;also maintain a high bar for quality. High bar for quality meaning the code we ship received&#xA;significant scrutiny, testing and that we are actively working to find bugs (especially&#xA;&lt;a href=&#34;https://bitcoincore.org/en/security-advisories&#34;&gt;security-critical ones&lt;/a&gt;). Does this mean we should&#xA;allocate all our resources toward improving testing and review? Absolutely not! Some developments&#xA;are well worth the risk and maintenance cost. And software costs/risks need to be balanced against&#xA;network and industry wide costs, risks and opportunities. That is, a Bitcoin Core vs Bitcoin&#xA;tradeoff. For instance it&amp;rsquo;s worth it for Bitcoin Core to bear the complexity introduced by &lt;a href=&#34;https://github.com/bitcoin/bitcoin/issues/27463&#34;&gt;package&#xA;relay&lt;/a&gt; because it significantly improves the&#xA;robustness of second layer protocols used by a large number of Bitcoin users. Another example is&#xA;compact block relay. Does &lt;a href=&#34;https://bitcoincore.org/en/2024/10/08/disclose-blocktxn-crash/&#34;&gt;&lt;code&gt;CVE-2024-35202&lt;/code&gt;&lt;/a&gt;&#xA;means Bitcoin Core should not have implemented this protocol upgrade? Absolutely not! Implementing&#xA;mitigations against fundamental centralization pressures in Bitcoin literally is at the core of&#xA;Bitcoin Core&amp;rsquo;s mission.&lt;/p&gt;&#xA;&lt;p&gt;But what is Bitcoin Core&amp;rsquo;s mission? It seems obvious to say that block relay should be a priority&#xA;for the Bitcoin Core project. But at what cost? And how do you generalize that? Here again, the&#xA;answer is the vague truism &amp;ldquo;Bitcoin Core should prioritize in function of what its users value&#xA;most&amp;rdquo;. But different users are going to value different things. Some will prefer to have new indexes&#xA;to query mempool data, others will want a more efficient wallet that support higher loads, and&#xA;others yet would prefer to have Assumeutxo implemented in the GUI. And from this it&amp;rsquo;s easy to shrug&#xA;and conclude &amp;ldquo;there is no good way to prioritize one type of user over another, people will just&#xA;work on what they want&amp;rdquo;. But this is sticking the head in the sand to avoid seeing the issue and&#xA;this is missing a critical distinction in the group of Bitcoin Core users.&lt;/p&gt;&#xA;&lt;p&gt;For technical and historical reasons, Bitcoin Core is the only reasonable full node implementation&#xA;for all Bitcoin users to run. Re-implementations of Bitcoin face significant technical challenges&#xA;and appear to be doomed to have consensus bugs. Forks of Bitcoin Core, while more reasonable to run&#xA;from a consensus bugs perspective, have nowhere near the level of quality assurance Bitcoin Core&#xA;has. But Bitcoin Core does not hold a monopoly, and its advantage can erode. A large share of users&#xA;turning to other implementations would be a major setback for the project, and, given the state of&#xA;available alternatives at the moment, one for the industry at large too.&lt;/p&gt;&#xA;&lt;p&gt;When you consider that Bitcoin Core&amp;rsquo;s userbase is indirectly all Bitcoin users, how to prioritise&#xA;development becomes quite clear. Bitcoin Core should be a robust backbone for the Bitcoin network,&#xA;balancing between securing the Bitcoin Core software and implementing new features to strengthen and&#xA;improve the Bitcoin network. I know this feels like stating the obvious, but sometimes it appears to&#xA;be necessary.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Bitcoin Core project direction</title>
      <link>https://antoinep.com/posts/core_project_direction/</link>
      <pubDate>Fri, 24 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/core_project_direction/</guid>
      <description>&lt;p&gt;What should be the mid to long term goals of the project?&lt;/p&gt;&#xA;&lt;p&gt;This is something i&amp;rsquo;ve been thinking about and discussing with others for a while. I don&amp;rsquo;t quite&#xA;have finished thoughts about this, but i think it&amp;rsquo;s important to discuss. It&amp;rsquo;s also a good time as&#xA;most of us will meet in person soon.&lt;/p&gt;&#xA;&lt;p&gt;A lot of decisions we make now about what features should go in, which should be prioritized, what&#xA;to review, what is valuable to start working on, are dependent on what we expect to happen in the&#xA;future. However, we currently cannot have any expectations about what will or will not happen in the&#xA;future. This significantly hinders our ability to make progress.&lt;/p&gt;&#xA;&lt;p&gt;I think we are in this situation where everybody is working on their own thing and there is no broad&#xA;agreement about what the scope of the project should even be. As a consequence, year after year we&#xA;keep piling up more code, more features, more RPCs, etc.. with at best a constant amount of&#xA;competent reviewers&amp;rsquo; time. This is not tenable, as a focus which gets further dispersed will&#xA;inevitably lead to reduced overall software quality.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://antoinep.com/posts/core_project_direction/rpc_count.png&#34; alt=&#34;rpc_count.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;In addition there is a lot of wishful thinking. At a larger level, in the form &amp;ldquo;Bitcoin Core SHOULD&#xA;definitely feature X&amp;rdquo; with no consideration whatsoever about the tradeoffs. At a smaller level, as&#xA;we&amp;rsquo;ve seen with the priority projects degenerating into people voting about what others should spend&#xA;their time on. And finally at a local pull-request level. Any contributor will know about these PRs&#xA;that nobody NACKs although they aren&amp;rsquo;t going anywhere because people have looked into it and don&amp;rsquo;t&#xA;think this is a good idea. But seldom would someone say it out loud as they&amp;rsquo;d bear the cost for&#xA;everyone else, despite it being a net benefit with regard to project-wide resource allocation.  We&#xA;all wish someone else would do it for us, or that the author would magically lose interest and work&#xA;on more important things. Or even that this SHOULD happen, oh, yes, definitely SHOULD happen, but&#xA;others should carry the burden of review, maintenance and responsibility. Or its variant &amp;ldquo;oh yes&#xA;i&amp;rsquo;ll help, absolutely, just not right now, maybe next decade&amp;rdquo;. Being enthusiastic to people&amp;rsquo;s idea&#xA;is well-intentioned, and not saying no is the comfortable thing to do.  Unfortunately it also has&#xA;negative consequences, both direct and indirect. When making decisions about where to take the&#xA;project we need to discuss &amp;ldquo;should&amp;rdquo; as bounded by &amp;ldquo;can&amp;rdquo; -and &lt;strong&gt;not&lt;/strong&gt; &amp;ldquo;could&amp;rdquo;- or we&amp;rsquo;ll stay stuck in&#xA;this untenable position.&lt;/p&gt;&#xA;&lt;p&gt;At this point you may think this is not specific to Bitcoin Core, that it&amp;rsquo;s the fate of any open&#xA;source project with no Benevolent Dictator, the Cathedral vs the Bazaar, all that. But it&amp;rsquo;s not&#xA;because there is no hierarchy that we can&amp;rsquo;t be more efficient. That we can&amp;rsquo;t decide of a direction&#xA;for the project. Finding broad agreement on a few guiding principles for what Bitcoin Core should be&#xA;will help determine what should or should not happen at all. It&amp;rsquo;s also the basis to form rough&#xA;consensus on concrete goals to set ourselves, which in turn can go a long way in prioritizing&#xA;development.&lt;/p&gt;&#xA;&lt;p&gt;Aligning ourselves on a set of specific goals for the project helps gather support for making&#xA;uncomfortable decisions. For instance saying no to a feature someone invested time in developing, or&#xA;getting rid of legacy components. But it also enables us to resolve the coordination issue in making&#xA;things we decided should happen, actually happen. Compared to other open source projects in a&#xA;similar situation we have the immense advantage of disposing of substantial financial resources.&#xA;There are Bitcoin Core dev offices in New York, London, and soon, Amsterdam and San Francisco. For&#xA;instance, those could be used for a sprint if we think something that should happen cannot because&#xA;it did not get enough review from key contributors in this area. Setting clear goals would not only&#xA;help us fight against scope creep, it would enable us to make better use of the means at our&#xA;disposal.&lt;/p&gt;&#xA;&lt;p&gt;We don&amp;rsquo;t need a benevolent dictator for this to happen. We just need sufficient buy-in from active&#xA;contributors. This is up to us.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>On Soft Forks</title>
      <link>https://antoinep.com/posts/softforks/</link>
      <pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://antoinep.com/posts/softforks/</guid>
      <description>&lt;p&gt;It appears many have different perspectives on soft forks than i do. Recent events and private&#xA;discussions prompted me to share my thoughts on the topic.&lt;/p&gt;&#xA;&lt;p&gt;Bitcoin&amp;rsquo;s value proposition is to be censorship-resistant money (some like to say &amp;ldquo;decentralised&amp;rdquo;).&#xA;And so far it largely succeeded: 15 years after its inception it&amp;rsquo;s still possible for anyone with&#xA;occasional access to the internet to receive, store and send value globally through the Bitcoin&#xA;network without having to ask anyone for permission. This is remarkable, and it would be a great&#xA;achievement if we can keep it this way for another 15 years. There seems however to be &lt;a href=&#34;https://transactionfee.info/charts/fees-per-day-btc&#34;&gt;little&#xA;demand&lt;/a&gt; for using Bitcoin (at least, as a&#xA;medium of exchange). Or maybe just everybody is using Lightning and channel closures are a thing of&#xA;the past. Some believe many would like to use Bitcoin but are simply unable to, and this seems to be&#xA;one motivation behind the recent soft fork excitement. Another common, presumptuous, explanation is&#xA;that actually a lot of people need Bitcoin, but &lt;em&gt;they don&amp;rsquo;t realise it&lt;/em&gt;. It&amp;rsquo;s necessary for the&#xA;western bitcoiner, well educated in the Bitcoin cult, to come and coinsplain them why they need to&#xA;accept Bitcoin in their heart despite having already made the choice it was not the best option for&#xA;them. We should note however that a low usage of Bitcoin can be viewed as a good thing: the contrary&#xA;may imply large scale economic repression is happening.&lt;/p&gt;&#xA;&lt;p&gt;Bitcoin achieves its goal of being censorship resistant money through coordination. Users coordinate&#xA;around a fixed set of rules defining the money. These rules are embedded in software: a Bitcoin&#xA;client (or node). One rule defines how clients coordinate to agree on the state of the system:&#xA;transactions are ordered in a chain of PoW. Most realise how the censorship-resistant coordination&#xA;permitted by mining is fundamental to Bitcoin. It is important to take a step back and also realise&#xA;how amazing it is that millions across the world today coordinate around a fixed set of rules for&#xA;their money. This happened progressively as Bitcoin grew, and it&amp;rsquo;s hard to see how it could be&#xA;replicated today. We need to appreciate how fragile is this coordination of millions of people&#xA;spread around the world, with different backgrounds, cultures, incentives, on something as political&#xA;as the rules defining their money. Politically as much as technically, consensus is the most important&#xA;feature of Bitcoin and &lt;strong&gt;we must be very careful in risking it&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A soft fork is an update to the consensus rules defining Bitcoin. It is technically a&#xA;backward-compatible update, making it much &lt;a href=&#34;https://gnusha.org/pi/bitcoindev/CAPg+sBjJcqeqGLHnPyWt23z3YoCRGozQupuMxy51J_-hdkKBSA@mail.gmail.com&#34;&gt;safer to roll&#xA;out&lt;/a&gt;&#xA;on the network.  However, it is still an update to the rules defining the money. The &amp;ldquo;soft&amp;rdquo;&#xA;qualifier, while well deserved from a technical standpoint, had the unfortunate consequence of&#xA;making it sound less politically dangerous to some. It is not.&lt;/p&gt;&#xA;&lt;p&gt;In the past couple of years, a number of Bitcoin enthusiasts and developers published proposals to&#xA;introduce new functionalities to the Bitcoin scripting system. A common complaint emerging from this&#xA;group (both &lt;a href=&#34;https://x.com/jamesob/status/1857049961235403101&#34;&gt;formulated publicly&lt;/a&gt; or reported to&#xA;me in private discussions) was the lack of engagement of protocol developers, and especially of the&#xA;fetishised Bitcoin Core maintainers, with their proposals. I have reasons to provide for the lack of&#xA;engagement, but before that i want to address the Bitcoin Core attacks and criticims.&lt;/p&gt;&#xA;&lt;p&gt;In a broader context, i believe much harm arises from attributing intentions to groups of people.&#xA;Sure, people engage in groupthink. But at the end of the day each individual has his own interest,&#xA;motives &lt;strong&gt;and responsibility&lt;/strong&gt;. The same is true for the emergent group of developers happening to&#xA;be contributing to the Bitcoin Core open source project. There is no loosely defined &amp;ldquo;Core devs&amp;rdquo; to&#xA;blame. It is also important to realise how small the group of contributors is compared to the&#xA;criticality of the project and the many areas it covers (cryptography, validation engine,&#xA;mempool/mining, transaction and blocks propagation, nodes addresses management, indexes, wallet,&#xA;GUI(s), build system(s), utilities, ..).  Even smaller is the group of contributors actively working&#xA;on &amp;ldquo;protocol stuff&amp;rdquo;. And it&amp;rsquo;s not like there is a shortage of important problems to tackle, despite&#xA;what some may say.&lt;/p&gt;&#xA;&lt;p&gt;Maintainers in particular take a lot of undeserved shit. Note they are also contributors working on&#xA;their own projects: Ava on improving the wallet (such as to &lt;a href=&#34;https://github.com/bitcoin/bitcoin/pull/29675&#34;&gt;use the features enabled by the last&#xA;soft fork&lt;/a&gt;, which we are still far from taking full&#xA;advantage of), Gloria on package relay (to secure the second-layer protocol(s) enabled by the&#xA;second-to-last soft fork), Michael on the toolchain (so Bitcoin survives one more release cycle&#xA;without being backdoored a la &lt;a href=&#34;https://en.wikipedia.org/wiki/XZ_Utils_backdoor&#34;&gt;&lt;code&gt;xz&lt;/code&gt;&lt;/a&gt;), and Russ on&#xA;multiprocess (to be more robust against situations like&#xA;&lt;a href=&#34;https://bitcoincore.org/en/2024/07/03/disclose_upnp_rce/&#34;&gt;this&lt;/a&gt;). But when acting as maintainers,&#xA;they are mainly directed by what other contributors are interested in working on. They coordinate&#xA;and facilitate activitites of the various contributors and, to be honest, take care of a lot of&#xA;things regular contributors are often less concerned with (broken CI, dependencies management,&#xA;releases and backports, codesigning, spam on the repo, &amp;hellip;).&lt;/p&gt;&#xA;&lt;p&gt;Therefore maintainers&amp;rsquo; activity largely reflects what the larger group of contributors is interested&#xA;in. If you are mad at a maintainer for not engaging with your pet project, it only talks to your&#xA;inability in getting any single of the Bitcoin Core contributors interested in your proposal.&lt;/p&gt;&#xA;&lt;p&gt;With that out of the way, let&amp;rsquo;s now discuss the lack of interest in the recent proposals. I can only&#xA;talk for myself, although others may agree with (parts of) the analysis. It is also worth to&#xA;explicitly mention not all contributors are ignoring all proposals: some individuals who contribute&#xA;to Bitcoin Core did engage with some proposals, or even came up with their own. I did take part in&#xA;some of the discussions, albeit less so in the past year. Anthony Towns developed and &lt;a href=&#34;https://github.com/bitcoin-inquisition/&#34;&gt; maintains a&#xA;whole implementation&lt;/a&gt; dedicated to testing proposals. Greg&#xA;Sanders &lt;a href=&#34;https://delvingbitcoin.org/t/ln-symmetry-project-recap/359&#34;&gt;went through all the work&lt;/a&gt; of&#xA;making an Eltoo proof of concept: design the scripts to be used, design the protocol as an extension&#xA;of the existing &lt;a href=&#34;https://github.com/lightning/bolts/&#34;&gt;BOLTs&lt;/a&gt;, actually implement it and start&#xA;discussions (themselves backed by concrete proposals and implementations) about the necessary&#xA;changes to the transaction relay protocol to make such channels more robust. This is so far the most&#xA;extensive work i have seen supporting any of the existing proposals, but this is not something you&#xA;will learn from listening to the full-time Twitter soft fork influencers.&lt;/p&gt;&#xA;&lt;p&gt;A first reason for my lack of engagement is that there has been a lot of motivated reasoning of the&#xA;kind &amp;ldquo;we need a soft fork; X is a possible option; let&amp;rsquo;s do X&amp;rdquo;. A common variant has &amp;ldquo;it&amp;rsquo;s been too&#xA;long since the last soft fork&amp;rdquo; as its first step instead. This couldn&amp;rsquo;t be farther from my vision of&#xA;Bitcoin. A soft fork is a risky, costly, mean to an end. We should not do a soft fork for the sake&#xA;of doing a soft fork.&lt;/p&gt;&#xA;&lt;p&gt;A related pattern i have noticed is what i dubbed the &amp;ldquo;irrational intervention&amp;rdquo;. It goes like this:&#xA;&amp;ldquo;Bitcoin is imperfect; we must change Bitcoin; X is a possible option; let&amp;rsquo;s do X&amp;rdquo;. I think this is&#xA;an emotional response to witnessing a suboptimal situation, and succumbing to this strong appeal to&#xA;&amp;ldquo;do something about it&amp;rdquo;. There is also the &amp;ldquo;try something&amp;rdquo; variant which explicitly acknowledges the&#xA;person has not rationally assessed whether X is at all a solution to the problem identified. It&amp;rsquo;s&#xA;hard not to draw a parallel between this attitude and the &lt;a href=&#34;https://blog.bitmex.com/the-blocksize-war-chapter-1-first-strike/&#34;&gt;block size debates from 10 years&#xA;ago&lt;/a&gt;. We should not do a soft&#xA;fork without a careful analysis of its costs and benefits.&lt;/p&gt;&#xA;&lt;p&gt;This leads us to a third reason, probably the most common. It seems most proposals are a solution in&#xA;search of a problem.  Don&amp;rsquo;t get me wrong, these are often interesting to think about, and usually&#xA;neatly tie into existing research and constructions.  But until their champion(s) can make a strong&#xA;case that they will bring tangible improvements to real-life Bitcoin users, they are not reasonable&#xA;to consider for a soft fork. It is not true of all proposals, as some were designed to address a&#xA;specific usecase. I &lt;a href=&#34;https://delvingbitcoin.org/t/using-op-vault-for-recovery/150&#34;&gt;have looked into&#xA;some&lt;/a&gt; but none really convinced me&#xA;they were worth changing Bitcoin&amp;rsquo;s consensus rules. And i say that despite having a strong financial&#xA;interest (&lt;a href=&#34;https://wizardsardine.com/revault/&#34;&gt;1&lt;/a&gt;, &lt;a href=&#34;https://wizardsardine.com/liana/&#34;&gt;2&lt;/a&gt;) in some of&#xA;them making it in.&lt;/p&gt;&#xA;&lt;p&gt;Another reason is that time is in fact scarce, and people&amp;rsquo;s imagination for Script opcodes&#xA;unlimited. Nowadays everyone and their cat have a soft fork proposal. My recently joining &lt;a href=&#34;https://chaincode.com/&#34;&gt;Chaincode&#xA;Labs&lt;/a&gt; was motivated in parts by having more time to keep up with the&#xA;research in this area. Still, we all need a way to prioritize which proposals to give attention to,&#xA;among other important works which also need our attention. I have to say the pretty low SNR of some&#xA;discussions in the past couple of years led me to realise my time was better spent elsewhere. A&#xA;mailing list is a 1-to-N mechanism. If someone is going to post to the mailing list, it&amp;rsquo;s reasonable&#xA;to expect them to be familiar with previous research on the topic, to not be rehashing previous&#xA;discussions without bringing anything new to the table, to be presenting their ideas to be&#xA;understandable to a reader who does not have all the context and to not be sharing half-baked ideas&#xA;that take longer to debunk than to broadcast.&lt;/p&gt;&#xA;&lt;p&gt;I am excited by the prospects of all the energy invested in exploring the design space of extending&#xA;Bitcoin&amp;rsquo;s scripting capabilities. If someone comes up with a way to make Bitcoin significantly more&#xA;accessible or more robust, a soft fork should definitely be on the table. But the upsides must&#xA;compensate for the costs of a soft fork. Bitcoin users is a much broader group than Bitcoin&#xA;enthusiasts, let alone than Bitcoin Twitter. And coordinating on changing the rules of all of these&#xA;people&amp;rsquo;s money is inherently political. There is nothing wrong with discussing soft forks, on the&#xA;contrary. More research is better. But to be taken seriously, anyone suggesting to activate anything&#xA;needs to acknowledge a soft fork comports substantial political and technical risks to a network&#xA;that millions depend on for their censorship-resistant payments and that secures trillions of&#xA;dollars worth of other people&amp;rsquo;s money.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
