#36598 [Demo] validation: remove AssumeUTXO

ReviewabilityReviewsAgreementSize
#36598 l0rinc [Demo] validation: remove AssumeUTXOWaiting on author0 -1Blocked445 + 227 tests
  • Remove AssumeUTXO snapshot loading and background historical validation
  • Eliminate the architectural complexity and maintenance burden of supporting concurrent chainstates
  • Unaddressed objection: removes major bootstrapping speedup and encourages non-Core clients (Sjors)
  • Suggests dropping background validation first rather than removing AssumeUTXO entirely (Sjors)
  • Concept approval because multiple chainstates add high maintenance and trust ambiguity (ismaelsadeeq)
  • Suggests retaining the feature as an optional IPC companion process to limit kernel impact (ariard)
  • 445 lines added or modified outside tests
  • 227 lines added or modified in tests
  • 5,795 lines removed in total
  • 82 files, 35 commits
Validation#46 of 53
P3 · cleanup
  • P3 after comparing with the other PRs here (assessed alone as P2): Lowered to P3: explicitly a demo not intended for merge; its value is as a reference for smaller extractions, not as reviewable validation change
  • P2 because it eliminates the substantial architectural burden of supporting concurrent chainstates
  • Simplifies core validation by removing dual chainstate roles, candidate sets, and complex lifetime locks
Reviewability: ReadyStalePaused
Agreement: StrongPositivePositive w/ caveatsNeutralMildDisputedBlockedCrickets
Reviews: current code-review ACKs, then (+stale ACKs) and -NACKs; greener = more ACKs.
Size: lines added or modified outside tests, then in tests; greener = smaller.

Goal

Removes AssumeUTXO snapshot loading, background historical validation, and multi-chainstate infrastructure across Bitcoin Core. Consolidates ChainstateManager and BlockManager to track a single active chainstate, eliminating dual block-file cursors, historical block download handling, dynamic validation cache rebalancing, and the loadtxoutset RPC. Datadirs with incomplete snapshots are rejected on startup, while UTXO set exports via dumptxoutset remain supported.

Problem: Supporting concurrent chainstates introduces substantial architectural complexity across validation, block storage, P2P block downloads, cache management, and wallets. Background validation also introduces trust model ambiguities, while ordinary initial block download has become faster and AssumeUTXO adoption has remained low relative to its maintenance overhead.

Evidence of importance:

  • PR description cites Core Dev meeting consensus: 'rough agreement about the ambiguity background validation introduces: we trust a snapshot enough to use it immediately, but describe that trust as temporary until the same node finishes checking history.'
  • PR description highlights that AssumeUTXO adoption 'isn't where we hoped it would be' citing #35054.
  • PR description notes that ordinary IBD speedups reduce the need: '#35295 is already merged, and the upcoming pruneassumevalid will make pruned IBD even faster.'
  • PR description outlines the broad architectural footprint: 'Multiple chainstates affect much more than snapshot loading: ordinary validation changes have to account for different chainstate roles, candidate sets, notifications, downloads, pruning, cache allocation, database lifetimes and locks.'

Scope: This is an exploratory draft demo PR explicitly not intended for merge ('it's not meant to be merged'). It spans 82 files and removes over 5,700 lines across validation, P2P, block storage, RPC, and tests to serve as a reference point for smaller independent PRs.

Risk of a mistake: high (validation, p2p, consensus, wallet, rpc_api). Massive refactor of the core chainstate lifecycle, block connection notifications, block file cursors, and network block download pipelines where a logic error could corrupt the chainstate or stall block synchronization.

Changed since the previous assessment: Now includes commit and patch details; the scope, approach, and commit sequence remain the same.

Reviewability

Paused · Waiting on author

Open objections from Sjors, ariard, ismaelsadeeq with no author reply for 8 days; review would repeat what has been asked.

Waiting on (from the thread read):

  • author: respond to Sjors's Concept NACK and suggestions from ariard and ismaelsadeeq 2026-10-24

Agreement

Blocked

objection that needs a change, nobody has replied (Sjors)

Thread notes: Added Sjors's Concept NACK objection to removing AssumeUTXO and ariard's suggestion of an optional IPC side-process architecture. Both items are open awaiting author response.

Objections, suggestions, and questions:

ReviewerTypeHarm, request, or questionStatusMust beAuthor repliedQuote
ismaelsadeeq (member)question, approachShould AssumeUTXO removal follow the usual deprecate-then-remove approach?openansweredno2026-10-22: 'should we do it through the usual deprecate then remove style?'
ariard (contributor)suggestion, approachConsider keeping AssumeUTXO as an optional special build flag side-companion process via IPC (`ipc/capnp/sidevalidation.cpp`) to reduce maintenance burden on libbitcoinkernel while preserving the featureopenansweredno2026-10-24: 'it would has been possible to find an intermediary technical solution, where we would have kept the AssumeUTXO feature has an optional special build flag side-companion process available through a new `ipc/capnp/sidevalidation.cpp`'
Sjors (member)objection, approachRemoving AssumeUTXO removes a major bootstrapping advantage (downloading/processing 100x less data), creating incentives to use non-Core clients, and the feature is unlikely to return; background validation should be dropped first insteadopenchangedno2026-10-24: 'I'm concept NACK on actually removing AssumeUTXO. I think we should drop background validation first, as I suggested in #36557.'

Support:

  • ismaelsadeeq (member) (Concept ACK, 2026-10-22): AssumeUTXO weakens full-node trust assumptions and historical validation, has high maintenance costs from multiple chainstates, and snapshot bootstrapping is better handled outside the reference implementation

Participants:

  • ismaelsadeeq (member, support, 1 statements 2026-10-22 to 2026-10-22): Concept ACK for removing AssumeUTXO; asked about deprecation approach
  • Sjors (member, objection, 1 statements 2026-10-24 to 2026-10-24): Concept NACK on removing AssumeUTXO; wants to drop background validation first
  • ariard (contributor, neutral, 1 statements 2026-10-24 to 2026-10-24): suggested keeping AssumeUTXO as an optional IPC companion process to reduce maintenance burden

Dependencies

Depends on: #36601

Enables:

Based on (shares commits with): #36601

Files

2810 lines under test/bench/ci.

  • src/validation.cpp +113/-1177
  • test/functional/feature_assumeutxo.py +0/-821
  • src/test/validation_chainstatemanager_tests.cpp +7/-750
  • src/validation.h +22/-325
  • test/functional/wallet_assumeutxo.py +0/-288
  • src/node/chainstate.cpp +94/-186
  • src/rpc/blockchain.cpp +43/-216
  • src/test/fuzz/utxo_snapshot.cpp +0/-235
  • src/node/blockstorage.cpp +48/-144
  • src/kernel/chainparams.cpp +0/-154
  • src/test/util/chainstate.h +0/-139
  • src/node/utxo_snapshot.h +0/-136
  • doc/design/assumeutxo.md +0/-127
  • src/test/validation_chainstate_tests.cpp +0/-126
  • test/functional/feature_assumeutxo_compat.py +125/-0
  • src/net_processing.cpp +7/-109
  • src/node/utxo_snapshot.cpp +0/-94
  • doc/assumeutxo.md +0/-85
  • src/node/blockstorage.h +6/-58
  • src/init.cpp +13/-46
  • src/txdb.cpp +18/-35
  • test/functional/tool_bitcoin_chainstate.py +7/-44
  • src/kernel/chainparams.h +0/-42
  • src/test/util/mining.cpp +0/-37
  • test/functional/feature_init.py +35/-1
  • src/kernel/types.h +0/-30
  • src/index/base.cpp +3/-25
  • src/test/coins_tests.cpp +3/-24
  • src/chain.h +6/-17
  • src/test/validation_tests.cpp +0/-23
  • src/wallet/wallet.cpp +3/-17
  • src/coins.h +2/-16
  • src/kernel/bitcoinkernel.cpp +8/-9
  • test/functional/rpc_dumptxoutset.py +15/-2
  • doc/release-notes-remove-assumeutxo.md +16/-0
  • src/test/fuzz/connman.cpp +0/-16
  • src/validationinterface.h +6/-10
  • src/index/base.h +5/-10
  • src/node/interfaces.cpp +4/-11
  • src/validationinterface.cpp +6/-9
  • src/kernel/chain.cpp +0/-14
  • src/rpc/blockchain.h +0/-14
  • src/test/fuzz/coins_view.cpp +5/-9
  • src/kernel/coinstats.cpp +1/-12
  • src/txdb.h +4/-9
  • src/util/vector.h +0/-13
  • src/interfaces/chain.h +2/-10
  • src/test/coinsviewoverlay_tests.cpp +8/-4
  • src/test/util/setup_common.cpp +3/-9
  • src/net.h +2/-9
  • doc/zmq.md +4/-6
  • src/coins.cpp +0/-10
  • src/test/util/validation.cpp +2/-8
  • src/zmq/zmqnotificationinterface.cpp +1/-7
  • src/test/fuzz/deserialize.cpp +0/-7
  • src/test/kernel/test_kernel.cpp +7/-0
  • src/test/chainstate_write_tests.cpp +2/-4
  • src/test/baseindex_tests.cpp +1/-4
  • src/test/util/setup_common.h +0/-5
  • src/bench/wallet_create_tx.cpp +1/-3
  • src/kernel/chain.h +0/-4
  • src/policy/fees/mempool_estimator.cpp +2/-2
  • src/test/util/mining.h +0/-4
  • src/test/validation_block_tests.cpp +1/-3
  • src/wallet/imports.cpp +0/-4
  • src/wallet/rpc/transactions.cpp +0/-4
  • src/kernel/bitcoinkernel.h +3/-0
  • src/test/fuzz/rpc.cpp +1/-2
  • src/test/util/validation.h +1/-2
  • test/functional/rpc_blockchain.py +0/-3
  • test/functional/test_framework/test_framework.py +0/-3
  • test/functional/test_runner.py +1/-2
  • ci/test/03_test_script.sh +1/-1
  • doc/release-process.md +0/-2
  • src/test/validation_flush_tests.cpp +1/-1
  • src/wallet/wallet.h +1/-1
  • src/zmq/zmqnotificationinterface.h +1/-1
  • test/lint/lint-circular-dependencies.py +0/-2
  • src/CMakeLists.txt +0/-1
  • src/external_signer.cpp +1/-0
  • src/kernel/CMakeLists.txt +0/-1
  • src/test/fuzz/CMakeLists.txt +0/-1

Card

The short text the ranking pass compares across PRs.

This draft demo PR removes AssumeUTXO snapshot importing, background validation, and multi-chainstate architecture across Bitcoin Core to showcase the potential simplifications. It is explicitly not intended for merge, but rather serves as a reference point for smaller proposals. The change addresses the maintenance burden of multi-chainstate logic in validation, block storage, and P2P download routines, citing low adoption and recent speed improvements to ordinary initial block download. It is based on #36601 and enables smaller targeted extractions such as dropping background sync or removing cache resizing.

Data

dossier JSON · extract JSON · model ledger, generated 2026-10-25T01:15, confidence high, input hash 357ea237498e5e7c
thread read through 2026-10-24 (3 statements), head bc62b59b8d
labels: Needs rebase · draft

Categories

Validation

P3 · cleanup (assessed alone as P2; Lowered to P3: explicitly a demo not intended for merge; its value is as a reference for smaller extractions, not as reviewable validation change)

Removes a significant recurring architectural burden by eliminating concurrent chainstates. As noted in the description, 'ordinary validation changes have to account for different chainstate roles, candidate sets, notifications, downloads, pruning, cache allocation, database lifetimes and locks', offering substantial and durable maintainability gains across validation.

Membership: Consolidates ChainstateManager and BlockManager to a single chainstate, removing AssumeUTXO snapshot loading and background validation.

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