#35054 p2p: UTXO set sharing

full analysis

https://github.com/bitcoin/bitcoin/pull/35054 · fjahr · +1714/-1 in 27 files, 13 commits · labels: P2P, Needs rebase, CI failed · draft

Goal

  • Allow nodes to fetch assumeutxo snapshots directly across the P2P network instead of via out-of-band sources
  • Enable fast, frictionless node bootstrapping for regular users and prepackaged node projects

Implements a draft BIP protocol for sharing UTXO set snapshots across the P2P network using chunks verified against a Merkle root. Adds the NODE_UTXO_SET service bit, P2P messages to query and fetch chunks, and a downloadutxoset RPC to trigger asynchronous fetching and snapshot activation.

Problem: Using assumeutxo currently requires acquiring a snapshot file out-of-band through third-party web downloads or torrents, introducing friction and centralized distribution points for users who want fast node onboarding.

Category: P2P (#11 of 65)

P2 · new feature

  • P2 because it removes the main barrier to adopting assumeutxo for fast node bootstrapping
  • Provides verified P2P snapshot relay needed by projects like BTCPayServer and prepackaged nodes

Addresses the principal barrier preventing assumeutxo from providing seamless fast bootstrapping to regular node operators. Author notes BTCPayServer and prepackaged node projects want assumeutxo but find out-of-band sourcing too difficult. Providing verified P2P snapshot relay significantly enhances user-facing sync capabilities.

Membership: Adds NODE_UTXO_SET service bit, four new net message types (getutxostinf, utxosetinfo, getutxoset, utxoset), and chunk downloading logic in net_processing.

Factors: security/stability 1, bug 0, performance 1, user value 2, leverage 1

Category: RPC / REST / ZMQ (#41 of 52)

P3 · new feature

  • P3 because it exposes the RPC interface to initiate asynchronous P2P snapshot fetching
  • Secondary control interface for the underlying P2P functionality

Exposes an interface to start asynchronous P2P snapshot fetching and verify against chainparams. It is secondary to the underlying P2P network feature.

Membership: Adds the downloadutxoset RPC method in src/rpc/blockchain.cpp.

Factors: security/stability 0, bug 0, performance 0, user value 2, leverage 0

Category: Tools and scripts (#22 of 22)

P4 · cleanup

  • P4 because it adds an internal maintenance script to compute snapshot Merkle roots
  • Utility script restricted to generating roots for chainparams

The standalone Python script in contrib is an internal maintenance tool to generate Merkle roots for chainparams.

Membership: Adds contrib/utxo-tools/utxo_snapshot_merkle.py to compute chunk Merkle roots of snapshot files.

Factors: security/stability 0, bug 0, performance 0, user value 1, leverage 0

Reviewability: Stale: Needs rebase, CI failing

  • Review is blocked: PR is a draft, has merge conflicts, failing CI, and author has been silent for 115 days

The PR has merge conflicts, failing CI, and the author has been silent for 115 days while marked as a draft.

Author status: silent since 2026-05-24 after placing the PR in draft to update it against the revised BIP specification

Open concerns:

  • Fundamental objections against expanding assumeutxo into the P2P protocol, citing validation complexity, dual chainstate maintenance burden, and the trust model of hardcoding snapshot Merkle roots
  • Potential memory exhaustion DoS where a peer advertises an extreme data_length in utxosetinfo causing large memory allocations
  • Draft implementation is out of sync with updates to the BIP draft specification

Resolved concerns:

  • Initial live-net testing confirmed snapshot download, activation, and transition to historical background validation worked as intended

Agreement: Disputed

  • Heavily disputed, with strong opposition against expanding assumeutxo into the P2P network
  • Concept approval because it provides in-band snapshot acquisition (andrewtoth, svanstaa)
  • Concept rejection: adds validation complexity and dual chainstate maintenance burden (stickies-v, l0rinc)
  • Concept rejection: introduces undesirable trust assumptions to the P2P protocol (evoskuil, eynhaender)
  • Concept rejection: uncertain demand and excessive long-term maintenance costs (narula, nkaretnikov)

Heavily disputed: six contributors Concept NACK expanding assumeutxo into P2P, against two Concept ACKs.

There is deep disagreement on whether Bitcoin Core should distribute UTXO snapshots over P2P. Multiple contributors argue that assumeutxo imposes severe complexity on validation and kernel development and that P2P snapshot distribution cements an undesirable trust model. Others support it as a necessary step to make assumeutxo usable without external channels.

  • andrewtoth and svanstaa gave Concept ACKs citing the benefit of in-band snapshot acquisition
  • stickies-v and l0rinc gave Concept NACKs citing validation complexity, dual chainstate hazards, and minimal demonstrated demand
  • evoskuil and eynhaender Concept NACKed on the basis of trust assumptions and degrading the trustless nature of the P2P protocol
  • narula and nkaretnikov Concept NACKed pointing to adoption uncertainty and maintenance complexity
  • sipa suggested considering P2P sync without background re-validation, which author fjahr rejected

Review verdicts (DrahtBot): 0 -6

Files

771 lines under test/bench/ci.

  • src/node/utxo_set_share.cpp +434/-0
  • src/test/utxo_set_share_tests.cpp +377/-0
  • src/node/utxo_set_share.h +193/-0
  • test/functional/p2p_utxo_set_share.py +190/-0
  • src/net_processing.cpp +154/-0
  • test/functional/test_framework/messages.py +122/-0
  • contrib/utxo-tools/utxo_snapshot_merkle.py +73/-0
  • src/rpc/blockchain.cpp +70/-0
  • src/protocol.h +28/-0
  • src/init.cpp +20/-0
  • src/kernel/chainparams.cpp +13/-0
  • src/kernel/chainparams.h +6/-0
  • src/net_processing.h +6/-0
  • src/node/context.h +6/-0
  • test/functional/test_framework/p2p.py +6/-0
  • src/consensus/merkle.h +5/-0
  • src/consensus/merkle.cpp +1/-1
  • src/CMakeLists.txt +1/-0
  • src/logging.cpp +1/-0
  • src/logging/categories.h +1/-0
  • src/node/context.cpp +1/-0
  • src/protocol.cpp +1/-0
  • src/rpc/client.cpp +1/-0
  • src/test/CMakeLists.txt +1/-0
  • src/test/fuzz/rpc.cpp +1/-0
  • src/validation.cpp +1/-0
  • test/functional/test_runner.py +1/-0

Card

This PR implements a draft BIP protocol for sharing assumeutxo snapshots over the P2P network using Merkle-proven chunks, aiming to eliminate third-party snapshot hosting as a prerequisite for fast bootstrapping. It adds P2P messages, service flag NODE_UTXO_SET, chunk download management, and a downloadutxoset RPC. The problem is strategically important for node onboarding, but the PR faces severe concept opposition from multiple contributors who view assumeutxo and P2P snapshot sharing as architectural mistakes. The PR is currently a stale draft with failing CI and merge conflicts, with no author activity for nearly four months.

Data

dossier JSON · extract JSON · model openrouter/google/gemini-3.8-flash, generated 2026-09-17T15:51, confidence high, input hash e94a13f2a2954c19