Validation

PRPriorityReviewabilityReviewsAgreementSize
(+)#35793 darosior Implement BIP 54 (Consensus Cleanup) without mainnet activation
  • Protect the network against known consensus attacks including timewarp exploits and Merkle tree collisions
  • Prevent severe block validation delays caused by excessive legacy signature operations
P2 · DoS protection
  • P1 because it addresses critical consensus vulnerabilities including timewarp exploits and CVE-2017-12842
  • Eliminates block validation denial-of-service vectors caused by legacy signature operations
  • Enforces new consensus soft fork rules requiring thorough review before activation
Ready
  • Ready for review
  • Cleanly rebased on master with passing CI and all feedback addressed
0Strong
  • Broad concept support across contributors and maintainers
  • Concept approval without stated reasons (dergoegge, fanquake, theStack, hsjoberg, stickies-v)
  • Detailed review on sigops limits and timewarp mitigations with concerns addressed (ariard, polespinasa)
  • Collaborated on mining template enforcement merged in a prior PR (fjahr)
151 + 6,433 tests
  • 151 lines added or modified outside tests
  • 6,433 lines added or modified in tests
  • 123 lines removed in total
  • 39 files, 22 commits
(+)#34132 l0rinc coins, dbwrapper: remove error catcher, make point-read failures fatal
  • Prevent database read failures and corruption from masquerading as missing coins
  • Safely shut down the node instead of running with corrupt chainstate or rejecting valid transactions
  • Simplify the coin view stack by eliminating the dedicated error catcher layer
P2 · cleanup
  • P2 because it prevents corrupt database entries from masquerading as missing inputs during validation
  • Avoids silent node operation with corrupt state that could reject valid blocks and transactions
  • Simplifies coin view lookups across chainstate and index databases
Ready
  • Ready to review
  • Clean state and CI passes after recent rebase
1 (+1)
Mild
  • General agreement on treating database read errors as fatal and simplifying the view stack
  • Approval of code and test coverage (optout21)
  • Concept approval for removing indirection (andrewtoth, sedited)
  • Open concern whether corrupt optional indexes should crash the whole node (ajtowns)
+292/-381
  • 33 files
  • 9 commits
(+)#36000 l0rinc validation: prefetch blocks while connecting
  • Overlap block read I/O with validation during initial sync, reindexing, and reorgs
  • Significantly reduces sync and reindex times for node operators
P2 · speedup
  • P2 because it brings double-digit performance gains to core block connection
  • Reduces wall-clock time by 13-15% for IBD and 35-50% for reindexing for node operators
Ready
  • Ready for review
1Mild
  • Strong support with independent benchmarks verifying speedups (andrewtoth)
  • Verified double-digit speedups for IBD and up to 35% on reindexing (andrewtoth)
  • Minor suggestion to clear the queue when an invalid block is found (w0xlt)
147 + 44 tests
  • 147 lines added or modified outside tests
  • 44 lines added or modified in tests
  • 9 lines removed in total
  • 9 files, 6 commits
(+)#36149 mzumsande validation: Leave pruned blocks in `m_blocks_unlinked`, fix another `nSequenceId` issue
  • Prevent debug crashes and block candidate corruption when handling pruned stale forks
  • Ensure late-arriving ancestor blocks can properly propagate transaction counts
  • Allow fuzz testing to safely exercise pruning on out-of-chain blocks
P2 · bug fix
  • P2 because it fixes assertion crashes and candidate corruption during block redownloads
  • Addresses rare crashes triggered by debug checks when stale forks are pruned
  • Enables fuzzers to explore out-of-chain pruning paths without hitting false crashes
  • Ranking pass: moved up: it is the only one of the crash/assert cluster with confirmed reproducers (#31512, #36021) and fuzz verification
Author reworking
  • Wait for author to finish exploring an alternative conditional removal approach before reviewing
1
Strong
  • Strong support with full review and fuzz reproduction
  • Verified the fixes for unlinked chain tracking and candidate set ordering (marcofleon)
  • Verified fuzz reproduction of candidate corruption on existing seeds (jeanpablojp)
  • Concept approval without objections (l0rinc)
30 + 39 tests
  • 30 lines added or modified outside tests
  • 39 lines added or modified in tests
  • 37 lines removed in total
  • 5 files, 4 commits
(+)#31989 jamesob BIP-119 (OP_CHECKTEMPLATEVERIFY) (regtest only)
  • Let contract and protocol developers test covenants and vault architectures on regtest
  • Addresses the lack of native primitives in Script to constrain output spending
P2 · decision needed
  • P2 because deciding whether Core should ship experimental consensus opcodes is a major milestone
  • It strategically shapes the future validation layer and smart contracting roadmap for covenants
  • Ranking pass: moved down: grouped with the other undecided soft-fork implementations; the decision value is real but below concrete correctness and performance work
Needs rebase
  • Needs rebase due to merge conflicts across several files
  • Author has been inactive since July 2025
0 (+1) -2Blocked
  • Blocked by objections against adopting consensus soft forks without broader community consensus
  • Unaddressed objection: premature without widespread community consensus (darosior, BitcoinErrorLog)
  • Concept approval because it is a minimal extension of script capabilities (ariard, jaybny)
244 + 3,439 tests
  • 244 lines added or modified outside tests
  • 3,439 lines added or modified in tests
  • 23 lines removed in total
  • 33 files, 9 commits
(+)#29247 arminsabouri CAT in Tapscript (BIP-347)
  • Allows Tapscript to concatenate stack elements for advanced covenant and contract designs
  • Provides a reference implementation for protocol developers and users to evaluate BIP-347 on testnets
P2 · decision needed
  • P2 because a working implementation is essential for evaluating whether to adopt the soft fork
  • Resolving exact opcode semantics and edge cases is critical to deciding the path forward on BIP-347
  • Ranking pass: moved down: same soft-fork decision-needed grouping as #31989/#32247/#36122
Author silent
  • Author has been silent for over four months
  • Maintainers converted the pull request to draft pending community consensus on the soft fork
0
  • No review verdicts recorded
Disputed
  • Drafted because concept consensus for the soft fork does not yet exist (achow101)
  • Cannot be merged even if the code is acceptable until consensus is reached (achow101)
  • Concern that unrestricted output sizes allow unintended introspection and covenants (moonsettler)
  • Acknowledged the need to pause and wait for wider consensus (EthanHeilman)
46 + 742 tests
  • 46 lines added or modified outside tests
  • 742 lines added or modified in tests
  • 7 lines removed in total
  • 9 files, 3 commits
(+)#35744 l0rinc coins: prevent DB resize from invalidating cursors
  • Prevent node crashes during concurrent UTXO scans and AssumeUTXO cache rebalancing
  • Ensure UTXO database iterators remain valid when resizing the cache
P2 · bug fix
  • P2 because it prevents node aborts during concurrent UTXO scans and AssumeUTXO rebalancing
  • Keeps database iterators valid until destroyed so cache resizing cannot trigger crashes
Ready
  • Ready for review
  • Cleanly addresses reviewer feedback with passing CI and unit tests
0
Strong
  • Strong collaboration shaping the shared mutex and sync framework design (andrewtoth)
  • Suggested integrating shared locks into lockorder tracking with non-LIFO releases (andrewtoth)
  • Concept approval without stated reasons (sedited)
89 + 105 tests
  • 89 lines added or modified outside tests
  • 105 lines added or modified in tests
  • 49 lines removed in total
  • 9 files, 8 commits
(+)#36244 w0xlt validation, net: Process blocks asynchronously and reduce cs_main contention
  • Keep nodes responsive to peers and avoid network latency spikes while validating incoming blocks
  • Ensure compact block responses and regular peer messaging stay fast during heavy validation load
P2 · speedup
  • P2 because it mitigates validation lock contention on the main critical section
  • Unblocks future architectural improvements such as parallel sibling block validation
Ready
  • Ready for review now, passing CI with extensive unit and regression test coverage
0
  • No review verdicts recorded
Crickets
  • Early architectural discussion is positive with no objections raised
  • Points out steady-state message processing and compact-block serving as key benefits (andrewtoth)
  • Notes that it enables eventual parallel validation of competing sibling blocks (andrewtoth)
889 + 2,245 tests
  • 889 lines added or modified outside tests
  • 2,245 lines added or modified in tests
  • 294 lines removed in total
  • 41 files, 20 commits
(+)#35714 l0rinc validation: stop writes after flush failure
  • Prevent database corruption by stopping metadata flushes immediately if block file writes fail
  • Avoid falsely marking block data as available when underlying block or undo writes did not persist
P2 · bug fix
  • P2 because it prevents chainstate and block index desynchronization during disk I/O errors
  • Avoids recording durable block status when block files fail to fsync or write completely
Ready
  • Ready to review: small self-contained change with passing CI and resolved reviewer questions
1 (+1)
Strong
  • Strong support for halting writes immediately on flush failures
  • Concept approval highlighting corruption risks with separate -blocksdir storage (mzumsande)
  • Verified by testing failure handling and unit test coverage (optout21)
  • Confirmed the logic gap is closed and opened a follow-up refactor (arejula27)
2 + 26 tests
  • 2 lines added or modified outside tests
  • 26 lines added or modified in tests
  • 3 lines removed in total
  • 2 files, 2 commits
(+)#29491 fjahr [EXPERIMENTAL] Schnorr batch verification for blocks
  • Speed up initial block download and block validation on Taproot-heavy blocks
  • Batch-verify Schnorr signatures during block connection across worker threads
P2 · speedup
  • P2 because accelerating block connection and initial block download directly helps node operators
  • Substantially increases throughput on synthetic Schnorr blocks once queue contention is resolved
Ready
  • Ready for code review and benchmarking, though upstream secp256k1 dependency is not yet merged
0
  • No review verdicts recorded
Strong
  • Collaborative support focused on threading architecture and benchmarking (andrewtoth, Eunovo)
  • Recommended per-thread batches to avoid worker mutex contention (andrewtoth)
  • Co-authored queue optimizations and provided comparative speedup benchmarks (Eunovo)
  • Identified performance bottlenecks where earlier iterations were slower than master (0xB10C, willcl-ark)
2,452 + 287 tests
  • 2,452 lines added or modified outside tests
  • 287 lines added or modified in tests
  • 182 lines removed in total
  • 56 files, 11 commits
(+)#32247 jamesob BIP-348 (OP_CHECKSIGFROMSTACK) (regtest only)
  • Allow developers to experiment with covenants and LN-Symmetry on regtest using OP_CHECKSIGFROMSTACK
  • Enable testing arbitrary stack signature verification in Tapscript without risking mainnet consensus
P2 · new feature
  • P2 because it enables practical experimentation with proposed covenant designs on regtest
  • Validating consensus correctness and script semantics is strategically valuable for the network roadmap
Needs rebase
  • Needs rebase and has merge conflicts with master
  • Author has been silent for over 400 days
0 (+1)
Positive
  • Broad support with no blocking objections to regtest implementation
  • Code review ACK noting implementation matches BIP semantics (JeremyRubin)
  • Contributed functional tests covering edge cases and sigops budgets (instagibbs)
  • Concept approval without stated reasons (jonatack, shahsb, yuvicc, delta1)
135 + 161 tests
  • 135 lines added or modified outside tests
  • 161 lines added or modified in tests
  • 12 lines removed in total
  • 20 files, 3 commits
(+)#36122 fjahr BIP460: CISA for Taproot key path spends
  • Cut transaction fees and witness size by aggregating signatures across multiple inputs.
  • Encourage collaborative transactions like Payjoin and CoinJoin by removing per-input signature overhead.
P2 · new feature
  • P2 because cross-input signature aggregation offers substantial block space savings across transactions
  • Consensus rule changes require extensive scrutiny to ensure batch verification and validation safety
  • Ranking pass: moved down: explicitly opened as an experimental companion to the BIPs, the least decision-ready of the soft-fork group
Needs rebase
  • Wait for a rebase to resolve merge conflicts.
  • Author noted this is a draft reference implementation not yet intended for upstream merge.
0
  • No review verdicts recorded
Mild
  • Commended consensus and policy test coverage after running local tests (BarneyChambers)
  • Reported three bugs in wallet signing and PSBT aggregation that break completion states (BarneyChambers)
  • Author has not yet replied to the reported wallet issues
7,784 + 3,504 tests
  • 7,784 lines added or modified outside tests
  • 3,504 lines added or modified in tests
  • 488 lines removed in total
  • 133 files, 22 commits
(+)#32427 sedited kernel: Replace leveldb-based BlockTreeDB with WAL and .dat file based store
  • Allow external tools and indexers to read block data concurrently without stopping bitcoind
  • Remove single-process locking constraints on block tree storage
P2 · cleanup
  • P2 because replacing the block index storage engine affects disk persistence across all full nodes
  • Carries broad leverage by swapping core storage and adding an automated startup migration
Author reworking
  • Hold off review because the author converted to draft to rework concurrent reading and WAL threading
  • Branch also needs a rebase
0 (+6)Mild
  • Strong concept support for removing LevelDB locking constraints (theuni, josibake, stickies-v, marcofleon)
  • Concerns about read-mode interactions with unapplied WAL files and lock ownership (willcl-ark)
  • Technical feedback on WAL atomicity and platform-specific flush edge cases (stickies-v)
  • Author converted to draft to redesign parallel readers and threaded WAL processing (sedited)
988 + 769 tests
  • 988 lines added or modified outside tests
  • 769 lines added or modified in tests
  • 201 lines removed in total
  • 31 files, 10 commits
(+)#35906 purpleKarrot First steps towards a stateless, side-effect free validation library
  • Allow consensus header and block validity checks to be tested directly without full node block ingestion
  • Make validation logic stateless and free of hidden side effects to support a modular validation library
P2 · test coverage
  • P2 because it brings direct unit tests to core consensus checks that previously needed full block ingestion
  • Removes hidden side effects from consensus checks and advances modular, stateless validation architecture
Ready
  • Ready for review with passing CI and clean mergeability
  • Only minor test nits remain open on the latest revision
1 (+1)
Strong
  • Strong support for decoupling validation checks to enable direct testing (optout21, janb84, josibake)
  • Support because it simplifies inputs and tests error cases cleanly (optout21)
  • Verified by testing that direct validation testing is a major improvement (janb84)
  • Support for comprehensive consensus tests and explicit validation timing (josibake)
  • Concept approval without stated reasons (yuvicc)
46 + 809 tests
  • 46 lines added or modified outside tests
  • 809 lines added or modified in tests
  • 37 lines removed in total
  • 6 files, 7 commits
(+)#35307 shuv-amp blockstorage: keep snapshot base in normal blockfile range
  • Prevent node crashes and false database corruption errors during assumeutxo background validation
  • Ensures nodes do not fail startup or require reindexing if the snapshot base block arrived out-of-band
P3 · bug fix
  • P3 because it prevents an irrecoverable abort or false database corruption error in assumeutxo validation
  • The crash only triggers if the base block was submitted out-of-band before loading the snapshot
  • Ranking pass: raised to P2: an unrecoverable abort / false corruption error requiring reindex is the same class of chainstate-integrity failure as #35744 and #36149, which sit at P2
Ready
  • Ready for review: rebased, passes CI, and includes functional test coverage
0
  • No review verdicts recorded
Neutral
  • Neutral feedback focused on the realism of the failure scenario
  • Questioned why someone would load a snapshot when already at that block height (mzumsande)
  • Author explained that out-of-band block submissions create an accepted state that crashes without a fix
32 + 53 tests
  • 32 lines added or modified outside tests
  • 53 lines added or modified in tests
  • 26 lines removed in total
  • 5 files, 1 commits
(+)#35003 furszy validation: improve block data I/O error handling in P2P paths
  • Prevent block storage I/O failures from leaving nodes silently stuck unable to advance the chain
  • Trigger graceful shutdown instead of ungraceful aborts when disk access fails during peer requests
P3 · bug fix
  • P3 because it prevents a rare bug where an inaccessible disk leaves a node stuck instead of halting
  • A hung chain activation leaves the node alive but silently degraded and unable to process new blocks
Author silent 70d
  • Author silent for 70 days following an approach objection and broader architectural questions
1 (+4) -1
Disputed
  • Approach objection to returning null pointers instead of preserving filesystem exceptions (josibake)
  • PR cannot be merged as-is without deciding a unified error-handling strategy across paths (maflcko)
  • Author defended consistency with existing callers but has not replied since July (furszy)
15 + 533 tests
  • 15 lines added or modified outside tests
  • 533 lines added or modified in tests
  • 7 lines removed in total
  • 10 files, 5 commits
(+)#35557 ryanofsky kernel, validation: Add btck_chainstate_manager_set_clock_time
  • Allow kernel users and multi-instance tests to mock time per instance without relying on global state
  • Prevent kernel validation code from accidentally calling nondeterministic host system clocks
P3 · cleanup
  • P3 because routing time through validation logic cleans up scattered direct clock queries
  • Fixes an edge-case race condition in chainstate manager initial block download tests
Ready
  • Ready to review: branch builds cleanly, passes CI, and is actively maintained across rebases
0
  • No review verdicts recorded
Strong
  • Positive sentiment with constructive review on typing, testing, and clock ergonomics
  • Supported keeping the changes unified and requested scoped clock tests (sedited)
  • Commended the test race fix and suggested using a fake clock (seduless)
  • Questioned whether this is still necessary after global mock time merged (maflcko)
172 + 86 tests
  • 172 lines added or modified outside tests
  • 86 lines added or modified in tests
  • 99 lines removed in total
  • 31 files, 6 commits
(+)#36280 furszy validation: throw when a compressed script can't be decompressed
  • Fail explicitly on corrupted compressed scripts instead of silently treating them as empty scripts
  • Prevents corrupt UTXO database or undo data from quietly yielding anyone-can-spend outputs
P3 · bug fix
  • P3 because it fixes error handling for corrupted UTXO and undo data
  • Requires database corruption to trigger in practice, limiting real-world impact
  • Prevents severe misinterpretation of corrupt records as anyone-can-spend coins
  • Ranking pass: moved up: corrupt records silently becoming anyone-can-spend is the most consensus-relevant of the corruption-handling P3s, pairs with #34132
Ready
  • Ready for review with passing CI, unit tests, and fuzz coverage
0
Positive
  • Positive early sentiment with no objections raised
  • Concept approval without stated reasons (sedited)
7 + 54 tests
  • 7 lines added or modified outside tests
  • 54 lines added or modified in tests
  • 4 lines removed in total
  • 3 files, 2 commits
(+)#35938 kwsantiago blockstorage: fail instead of storing a null XOR key over a lost one
  • Prevent node from overwriting a missing block obfuscation key with a null key
  • Stop prompting users to run a destructive reindex that silently wipes valid block storage
  • Fail startup with an explicit error directing users to restore the key file or resync
P3 · bug fix
  • P3 because prevents destructive reindexing that resets valid block data when one key file is lost
  • Limited impact because it requires out-of-band file deletion or external storage faults to trigger
  • Ranking pass: moved up: prevents irreversible loss of otherwise recoverable block data, ranked with the other data-integrity P3s
Ready
  • Ready to review
0 -1
Disputed
  • Concept NACK arguing recovery from local tampering is low priority (l0rinc)
  • Prefers improving corruption detection over special-casing unreadable block files (sedited)
41 + 22 tests
  • 41 lines added or modified outside tests
  • 22 lines added or modified in tests
  • 0 lines removed in total
  • 2 files, 1 commits
(+)#35195 l0rinc coins: cache UTXO outpoint hash codes
  • Speed up UTXO cache lookups during Initial Block Download and AssumeUTXO loading
  • Trade a small amount of memory to avoid recomputing hashes on table operations
P3 · speedup
  • P3 because it speeds up Initial Block Download and AssumeUTXO sync times
  • Yields modest validation performance gains by optimizing UTXO cache lookups
Needs rebase
  • Review is blocked by merge conflicts and author inactivity
0
Strong
  • Concept approval because benchmarks show speedup justifies memory use (optout21)
  • Open question whether caching should use __is_fast_hash instead (optout21)
4 + 17 tests
  • 4 lines added or modified outside tests
  • 17 lines added or modified in tests
  • 7 lines removed in total
  • 2 files, 2 commits
(+)#34864 l0rinc coins: tighten cache entry state invariants
  • Prevent unreachable and contradictory states in the UTXO cache
  • Protect consensus-critical cache synchronization from logic bugs around coin spending and updates
P3 · cleanup
  • P3 because it hardens internal UTXO cache state invariants against logic errors
  • Does not fix an active bug or affect user-facing behavior
Ready
  • Worthwhile to review now; code is clean, CI passes, and all reviewer feedback has been addressed
1
Strong
  • Broad agreement on making invalid cache states unrepresentable
  • Support for maintainability benefits from making invalid states impossible (optout21)
  • Concept approval without stated reasons (andrewtoth)
  • Verified by running coins fuzz targets without errors or crashes (ptrinh)
90 + 60 tests
  • 90 lines added or modified outside tests
  • 60 lines added or modified in tests
  • 192 lines removed in total
  • 9 files, 9 commits
(+)#35646 yuvicc RFC: Separate out runtime errors from BlockValidationState using `util::Expected`
  • Stop conflating internal runtime failures like disk write errors with peer-penalizing block invalidity
  • Separate internal system faults from consensus rejection logic across block processing
P3 · cleanup
  • P3 because it cleans up core validation invariants without fixing an active bug or performance bottleneck
  • Unblocks further modernization of validation routines and error propagation
  • Ranking pass: moved down slightly: overlaps #29700 and needs an approach decision before either is worth deep line review
CI failing
  • CI is failing and reviewers asked to split the large commit into smaller steps before detailed review
0
Positive
  • Broad concept support for separating runtime errors from block validation results
  • Concept approval citing enforced error handling and less risk of conflating errors (optout21)
  • Concept approval welcoming the direction but requesting piecemeal commits (hodlinator)
373 + 244 tests
  • 373 lines added or modified outside tests
  • 244 lines added or modified in tests
  • 384 lines removed in total
  • 41 files, 5 commits
(+)#35751 andrewtoth validation: use parallel input prevout fetching in TestBlockValidity
  • Speeds up block template validation for miners and Stratum v2 services
  • Prevents dummy template checks from polluting the main coins cache
P3 · speedup
  • P3 because it speeds up block template checking by roughly ten percent on full blocks
  • The benefit applies to template assembly and Stratum v2 checks but leaves normal tip advancement unchanged
  • It does not affect consensus rules or block connection during initial block download
  • Ranking pass: moved up: a measured ~10% win on a real workload ranks above the untested cleanups it was sitting among
Waiting on author
  • Wait for the author to push an agreed reentrancy assert before reviewing
0 (+1)
Disputed
  • Concept approval for improving template verification performance for Stratum v2 (Sjors)
  • Support for the performance improvement building on earlier parallel fetching work (optout21)
  • Blocking objection on potential reentrancy issues awaits a promised assert fix (l0rinc)
14 + 25 tests
  • 14 lines added or modified outside tests
  • 25 lines added or modified in tests
  • 7 lines removed in total
  • 3 files, 2 commits
(+)#33637 l0rinc refactor: optimize block index comparisons (1.4-6.8x faster)
  • Speed up block index comparisons performed during block tracking and validation
  • Reduces CPU overhead on frequent comparison paths during node operation
P3 · speedup
  • P3 because micro-optimizing comparator operations provides isolated speedups on specific checks
  • The overall speedup yields minimal perceptible impact on node performance or initial block download
Ready
  • Ready for review
  • CI is passing and previous reviewer feedback has been addressed
1 (+1)
Strong
  • Strong support for optimizing and modernizing comparison hot paths
  • Approved the simplified comparison approach (laanwj)
  • Approved the localized hot-path micro-optimization (optout21)
  • Concept support for the performance improvements (mzumsande, Raimo33)
26 + 221 tests
  • 26 lines added or modified outside tests
  • 221 lines added or modified in tests
  • 44 lines removed in total
  • 12 files, 7 commits
(+)#34254 mzumsande validation: Prevent duplicate logging and looping in invalid block handling
  • Prevent redundant block index traversals and duplicate log entries when handling invalid blocks
  • Clean up and clarify validation control flow during invalid block processing
P3 · cleanup
  • P3 because it eliminates redundant block index iterations and repeated log lines during block validation
  • Performance and log cleanups only trigger during rare invalid block events or manual invalidations
  • Helps untangle historical validation duplication and clarifies control flow
Ready
  • Ready for review
  • CI is passing and prior review concerns have been addressed
1 (+1)
Strong
  • Strong support for cleaning up redundant loops and logs in chain activation (Crypt-iQ, stratospher)
  • Concept approval of the refactoring approach (frankomosh, stratospher)
  • Prior concern about missing updates for inactive blocks resolved with a regression test (Crypt-iQ)
+64/-30
  • 6 files
  • 3 commits
(+)#35873 jeanpablojp test: add a tx_valid vector for CVE-2024-38365
  • Add a positive test vector verifying transactions where embedded signatures survive inside pushdata
  • Protects downstream implementations and future refactors against consensus regressions from CVE-2024-38365
P3 · test coverage
  • P3 because it adds regression test coverage for a consensus edge case that split another implementation
  • Pins critical script evaluation behavior against regressions where Core only tested failure paths
Ready
  • Ready for review: clean 7-line test vector change passing CI
1
Strong
  • Strong support with no open objections
  • Verified by mutation testing that btcd-style deletion fails the test (sedited)
0 + 7 tests
  • 0 lines added or modified outside tests
  • 7 lines added or modified in tests
  • 0 lines removed in total
  • 1 files, 1 commits
(+)#36231 ViniciusCestarii test: add pow tests covering live mutants
  • Add unit tests for proof-of-work and difficulty calculation edge cases found via mutation testing
  • Protects consensus and header-sync validation from future regressions
P3 · test coverage
  • P3 because it improves unit test coverage over core consensus and header-sync proof-of-work logic
  • Kills live mutants in consensus-critical code to guard against future regressions without fixing active bugs
  • Ranking pass: moved up: consensus/pow regression coverage grouped with the other test-vector PRs
Ready
  • Ready for review: the patch is small, cleanly rebased, and passes CI
1Strong
  • Strong support after author addressed setup suggestions in revision (brunoerg)
  • No open concerns remain
0 + 67 tests
  • 0 lines added or modified outside tests
  • 67 lines added or modified in tests
  • 0 lines removed in total
  • 1 files, 4 commits
(+)#33324 l0rinc blocks: add resumable reobfuscation for existing block files
  • Allow node operators to obfuscate existing block files or rotate keys without redownloading the chain
  • Protects pre-v28 datadirs from false-positive antivirus scanner deletion or quarantine
P3 · new feature
  • P3 because it helps operators with pre-v28 datadirs protect block files from antivirus false positives
  • Avoids having to redownload the entire blockchain to obfuscate or rotate keys
  • It is an optional one-off migration and existing nodes run fine without it
  • Ranking pass: moved down: one-off optional migration, below the correctness and performance P3s
Needs rebase
  • Needs rebase against master due to merge conflicts
0 (+1)
Positive w/ caveats
  • General support for the migration feature, but architectural debate remains on the interface
  • Approval after hardening error handling and argument parsing (sedited)
  • Prefers an external CLI tool rather than adding another daemon startup option (stickies-v, luke-jr)
  • Contributed improvements for streaming chunks and timestamp preservation (ajtowns)
276 + 175 tests
  • 276 lines added or modified outside tests
  • 175 lines added or modified in tests
  • 43 lines removed in total
  • 15 files, 9 commits
(+)#35187 sedited kernel: Block validation without a complete UTXO set
  • Allow external library consumers to validate blocks without maintaining a full local UTXO database
  • Enables stateless verification for downstream projects like rust-bitcoinkernel
P3 · new feature
  • P3 because it exposes a check-only validation helper without altering internal node validation
  • Serves primarily as a backing implementation for the kernel API rather than core node logic
Needs rebase
  • Needs rebase against master due to merge conflicts
0 (+2)
Blocked
  • Concept approval for stateless block validation (yuvicc, nervana21)
  • Verified by implementing a prototype test suite in rust-bitcoinkernel (alexanderwiederin)
  • Prefers an in-memory coin container over dynamic callbacks to prevent inconsistent lookups (ajtowns)
  • Questioned whether assumevalid logic should bypass script checks during standalone validation (nervana21)
242 + 119 tests
  • 242 lines added or modified outside tests
  • 119 lines added or modified in tests
  • 0 lines removed in total
  • 6 files, 5 commits
(+)#36049 l0rinc streams: avoid termination on buffered write failure
  • Prevent abrupt node crashes when encountering storage errors during block writing
  • Allow standard storage error handling and graceful shutdown when disks run out of space
P3 · bug fix
  • P3 because it routes block write errors to standard storage failure handling rather than hard aborts
  • Applies only to failure recovery paths when storage runs out of space or fails
Ready
  • Ready for review as the patch is small and CI is passing
0
Strong
  • General agreement that the bug exists and should be addressed
  • Concept approval after independently hitting the identical bug (w0xlt)
  • Inquired whether terminating was acceptable for storage errors, which author resolved (andrewtoth)
6 + 14 tests
  • 6 lines added or modified outside tests
  • 14 lines added or modified in tests
  • 3 lines removed in total
  • 3 files, 3 commits
(+)#29700 ryanofsky kernel, refactor: return error status on all fatal errors
  • Return fatal error details programmatically instead of aborting the node process during validation
  • Let libbitcoinkernel users handle critical failures directly without relying on notification callbacks
P3 · cleanup
  • P3 because changes across validation routines are purely refactoring without changing runtime behavior
  • Updates function signatures to thread return values through without altering core validation logic
Review #25665 first
0
  • No review verdicts recorded
Blocked
  • Blocked by an unaddressed approach objection
  • Unaddressed objection: Result-style error handling is unidiomatic and harms performance (purpleKarrot)
  • Nonblocking objection: nesting interrupt results inside error results invites unhandled stops (maflcko)
  • Approval without detailed technical analysis (Graysonbarton)
1,314 + 440 tests
  • 1,314 lines added or modified outside tests
  • 440 lines added or modified in tests
  • 675 lines removed in total
  • 55 files, 22 commits
(+)#35861 fjahr Testnet 5 (BIP95)
  • Add parameters and configuration for Testnet 5 to provide a reliable public test network
  • Prevent hash rate manipulation and block storms seen on prior testnets by dropping the 20-minute rule
  • Enable testing of modern consensus cleanup rules enforced from genesis
P3 · new feature
  • P2 because it fixes recurring public testnet stability failures by removing exploitable difficulty resets
  • Enables ecosystem-wide validation testing of consensus cleanup rules from genesis
Needs rebase
  • Review #35793 first
  • Branch has merge conflicts, failing CI, and awaits a mined genesis block
0
  • No review verdicts recorded
Crickets
  • No reviews or concept feedback yet
317 + 6,426 tests
  • 317 lines added or modified outside tests
  • 6,426 lines added or modified in tests
  • 129 lines removed in total
  • 59 files, 25 commits
(+)#32575 fjahr consensus: Remove special treatment for single threaded script checking
  • Unify script verification dispatch so single-threaded and multithreaded execution share one path
  • Eliminate dual-purpose behavior to make block validation easier to reason about and maintain
  • Help unblock future consensus verification optimizations like batch verification
P3 · cleanup
  • P3 because it is an internal cleanup of block validation logic that does not fix an active bug
  • Has neutral performance while removing hard-to-follow dual paths in consensus script checks
  • Provides modest leverage by unblocking future consensus optimizations like batch verification
Author silent
  • Author has been silent for over three months though all pending review feedback was addressed
  • Review is worthwhile to help resolve the outstanding approach disagreement
0 -1
Disputed
  • Broad concept support for simplifying block script verification flow (theuni, sedited, darosior, Eunovo)
  • Confirmed no measurable performance regression across single-threaded benchmarks (svanstaa, l0rinc)
  • Approach objection that combining consensus changes with refactoring is too risky (l0rinc)
  • Author declined to split the changes into separate PRs
90 + 17 tests
  • 90 lines added or modified outside tests
  • 17 lines added or modified in tests
  • 85 lines removed in total
  • 4 files, 6 commits
(+)#34534 fjahr rpc: Manual prune lock management (Take 2)
  • Prevent needed blocks from being pruned when external or offline wallets are temporarily unloaded
  • Allows wallets to rescan against pruned nodes without having to manage full manual pruning logic
P3 · new feature
  • P3 because it hooks into existing block storage prune locks without changing validation rules
  • Held locks can cause disk consumption to temporarily exceed configured prune targets
  • Ranking pass: moved up: an actual user-facing capability for pruned-node operators outranks the pure cleanups below it
Ready
  • Ready for review; CI passes and earlier reviewer feedback has been addressed
0 (+1)
Positive
  • Generally positive sentiment on supporting unloaded wallet rescans
  • Concept approval for the unloaded wallet rescan use case (stickies-v)
  • Approval after thread safety feedback was resolved (sedited)
  • Questioned whether existing manual pruning options already suffice (andrewtoth)
+404/-1
  • 9 files
  • 6 commits
(+)#33854 Eunovo fix assumevalid is ignored during reindex
  • Prevent fallback to slow full script verification when reindexing after an interrupted initial sync
  • Ensure assumevalid applies even if the previous sync stopped before reaching minimum chainwork
P3 · speedup
  • P3 because missing assumevalid only causes redundant script checks, keeping validation strictly safe
  • Benefits only the rare scenario where an initial sync was interrupted before minimum chainwork
  • Ranking pass: moved down: reviewers dispute that the rare interrupted-IBD case justifies the complexity, lowering confidence in the benefit
Needs rebase
  • Needs rebase due to merge conflicts with the main branch
0
Disputed
  • Concept approval verified with a reproducer (l0rinc)
  • Thinks added complexity is not worth the benefit for a rare salvage scenario (sedited)
  • Concerned about breaking offline reindexing and potential peer disconnects (sedited, mzumsande)
177 + 108 tests
  • 177 lines added or modified outside tests
  • 108 lines added or modified in tests
  • 96 lines removed in total
  • 11 files, 8 commits
(+)#35662 l0rinc script: prevent stale sighash caches across transactions
  • Prevent stale sighash cache state from leaking across transactions or remaining uninitialized
  • Avoid unnecessary memory allocation during assumevalid block connection
P3 · cleanup
  • P3 because it hardens sighash cache lifetime against misuse and invalid reuse across transactions
  • Saves an unnecessary vector allocation during assumevalid sync
Ready
  • Ready for review; author addressed feedback with a rework and CI passes
0
  • No review verdicts recorded
Neutral
  • Resolved objection against re-initialization by adopting construction-time initialization (sedited)
  • Awaiting follow-up review after the rework
34 + 48 tests
  • 34 lines added or modified outside tests
  • 48 lines added or modified in tests
  • 74 lines removed in total
  • 17 files, 4 commits
(+)#35511 hodlinator RFC: consensus: Make `CAmount` a class
  • Prevent accidental monetary bugs like invalid conversions or nonsensical math for developers
  • Catch uninitialized coin values and invalid operations at compile time across the codebase
P3 · type safety
  • P3 because it hardens monetary type definitions used throughout consensus checks
  • Alters no consensus rules or validity semantics and is not urgent for consensus correctness
Ready
  • Ready for review, the branch builds cleanly and passes CI
0
Disputed
  • Broad concept support for stronger monetary type safety
  • Concept approval without stated reasons (sedited)
  • Prefers incremental migration over taking the entire codebase transition at once (ryanofsky)
  • Changes requested: monolithic diff is too large and needs invariant clarification (l0rinc)
574 + 912 tests
  • 574 lines added or modified outside tests
  • 912 lines added or modified in tests
  • 1,258 lines removed in total
  • 184 files, 12 commits
(+)#35570 optout21 refactor: Change some validation.cpp methods to return BlockValidationState
  • Prevent subtle errors where validation outcome flags contradict internal validation state
  • Eliminate shared mutable error state across sequential block validation steps
P3 · cleanup
  • P3 because it is an internal cleanup that does not change consensus rules or validation speed
  • Benefit is modest, slightly reducing maintenance hazards when updating validation logic
Ready
  • Ready for review as the branch merges cleanly and passes all automated tests
0 (+1)Positive
  • Broad support across multiple contributors for simplifying validation return values
  • Full code approval following review of edge cases and test fixes (arejula27)
  • Nonblocking preference to land return-type improvements in #35646 first (hodlinator)
  • Concept approval without stated reasons (w0xlt, purpleKarrot, stringintech, yuvicc, nervana21)
227 + 36 tests
  • 227 lines added or modified outside tests
  • 36 lines added or modified in tests
  • 226 lines removed in total
  • 16 files, 14 commits
(+)#36066 optout21 validation: Separate check-only version of ConnectBlock
  • Clarify mutability guarantees when checking blocks without applying state updates
  • Eliminate boolean check flags and mutable dummy objects in validation tests
P3 · cleanup
  • P3 because it is a low-risk internal code cleanup with no performance or security impact
  • Improves const correctness for developers and aligns with work toward stateless validation
Ready
  • Ready for review
  • Latest update addressed review feedback and resolved a silent fuzz test conflict
0
Positive
  • Concept approval because separating the check-only path clarifies mutability (l0rinc)
  • Noted that internal chainstate mutations remain until later stateless validation work (purpleKarrot)
60 + 5 tests
  • 60 lines added or modified outside tests
  • 5 lines added or modified in tests
  • 20 lines removed in total
  • 4 files, 1 commits
(+)#35731 arejula27 Indexes: Harden the flush-error notification invariant
  • Ensure all block and undo file flush failures reliably trigger flush-error notifications by construction
  • Add dedicated unit tests to verify error notifications fire during simulated I/O failures
P3 · test coverage
  • P3 because this is defensive internal hardening that leaves current behavior unchanged
  • Adds targeted test coverage to prevent future regressions in fatal storage error handling
Review #35714 first
  • Review #35714 first
  • CI is currently failing
0
  • No review verdicts recorded
Crickets
  • No reviews or concept comments yet
  • Opened as a follow-up to PR 35714 with no community feedback so far
18 + 103 tests
  • 18 lines added or modified outside tests
  • 103 lines added or modified in tests
  • 10 lines removed in total
  • 5 files, 4 commits
(+)#35569 purpleKarrot Encapsulation for CTransaction
  • Decouple transaction internal storage representation from caller code
  • Lay the groundwork for future transaction memory optimizations
P3 · cleanup
  • P3 because it offers no immediate performance gains or bug fixes
  • It establishes the foundation for future block memory allocation improvements
  • Ranking pass: moved down: broad churn in consensus-critical code whose only payoff is speculative future work, and the concept itself is disputed
Ready
  • Ready to review
  • CI is passing and the mechanical migration is verified reproducible
2 -2
Disputed
  • Concept objection: massive churn in consensus code with no immediate benefit (ajtowns)
  • Approach objection: premature churn across call sites that should be split up (l0rinc)
  • Supports decoupling caller code from transaction internal layout (josibake, ryanofsky)
  • Verified the automated migration is reproducible and tests pass (alexanderwiederin)
407 + 203 tests
  • 407 lines added or modified outside tests
  • 203 lines added or modified in tests
  • 514 lines removed in total
  • 93 files, 7 commits
(+)#29843 ajtowns policy: Allow non-standard scripts with -acceptnonstdtxn=1 (test nets only)
  • Allow transactions with non-standard scripts into the mempool on test networks using -acceptnonstdtxn=1
  • Let developers test proposed soft forks on testnets without having to maintain custom node forks
P3 · cleanup
  • P3 because it hardens the distinction between consensus and mempool policy script checks
  • Enforces that consensus block script flags remain a strict subset of standard policy flags
Ready
  • Reviewable now; CI is passing and open review feedback is a minor design question rather than a rework
0Mild
  • Broad concept and approach support for enabling soft-fork testing on test networks
  • Helpful for experimenting with future soft-fork features on test networks (benthecarman)
  • Concept approval without stated reasons (1440000bytes, glozow, fjahr)
  • Nonblocking objection: goes beyond historical Knots behavior and should use another value (luke-jr)
  • Questioned whether a compile-time wrapper could be replaced with a unit test (sedited)
104 + 45 tests
  • 104 lines added or modified outside tests
  • 45 lines added or modified in tests
  • 55 lines removed in total
  • 6 files, 5 commits
(+)#35300 w0xlt mining: add precious option to IPC block submission
  • Let external mining software atomically submit and prefer a locally mined same-work block over IPC
  • Avoid race conditions from issuing a separate preciousblock RPC call
P3 · cleanup
  • P4 because the chain activation refactor only serves callers that already hold the chainstate lock
  • Internal adjustment that does not change consensus safety or validation throughput
Needs rebase
  • Needs rebase against current master due to merge conflicts
  • Author has been silent since July 2026
0
Mild
  • Concept approval for handling precious blocks directly over IPC (Sjors, pablomartin4btc)
  • Questions whether duplicate status should still be returned if precious is requested (Sjors)
  • Recommends splitting and reorganizing the oversized unit test (Sjors)
  • Considers the internal chain activation refactoring a clean prerequisite (pablomartin4btc)
125 + 431 tests
  • 125 lines added or modified outside tests
  • 431 lines added or modified in tests
  • 100 lines removed in total
  • 20 files, 6 commits
(+)#35071 pinheadmz Reindex: save progress to continue after interruption
  • Save reindex progress on interruption so restarts resume from the last block file
  • Avoids re-reading earlier block files and re-populating orphan maps after an interrupted reindex
P4 · speedup
  • P4 because the performance optimization is speculative and weakly justified
  • Master already skips block validation on restart leaving only quick sequential file reads
  • Persisting orphan maps in the block database adds complexity for marginal gains in an edge case
Author silent 132d
  • Author moved PR to draft to gather benchmarks and has been silent for 132 days
0
  • No review verdicts recorded
Mild
  • Reviewers doubted whether re-reading block files without re-validation is meaningfully slow
  • Pointed out master already skips validation on restart so scanning is very fast (mzumsande)
  • Asked for flame graphs or benchmarks demonstrating substantial restart overhead (maflcko)
  • Author moved PR to draft to measure real overhead but has not returned
69 + 59 tests
  • 69 lines added or modified outside tests
  • 59 lines added or modified in tests
  • 6 lines removed in total
  • 3 files, 2 commits
(+)#35620 l0rinc leveldb: move unused block-cache budget to write buffers
  • Stop reserving database cache budget for an unused block cache on 64-bit systems
  • Direct the unused cache budget toward database write buffers instead
P4 · cleanup
  • P4 because reindexing benchmarks showed no meaningful speedup on SSDs
  • Reindex benchmarks showed a slight slowdown on magnetic hard drives
  • Tuning internal cache ratios without a measurable performance win is marginal
Needs rebase
  • Wait for author update: the PR has merge conflicts and is drafted to investigate regressions
0
  • No review verdicts recorded
Mild
  • Questioned maintaining special-cased logic for 32-bit systems (sedited, fanquake)
  • Questioned whether giving indexes larger write buffers provides any benefit (sedited)
  • Author put the PR in draft to investigate hard drive regressions and cleaner options (l0rinc)
5
  • 5 lines added or modified outside tests
  • 0 lines added or modified in tests
  • 2 lines removed in total
  • 1 files, 2 commits
(+)#35581 ismaelsadeeq node: add block template manager and track waitNext fee inflow
  • Avoid assembling full block templates on every tick just to check for mempool fee changes
  • Reduce lock contention and CPU load during block generation for mining pools and template consumers
  • Consolidate block creation and template state management into a unified interface
P4 · cleanup
  • The validation impact is purely incidental plumbing for the new validation interface notification signal and passing height to removeForBlock.
Review #35675 first
0
Strong
  • Strong support for incremental fee inflow tracking and architectural cleanup
  • Suggested splitting out the base manager into a dedicated preparatory PR (Sjors)
  • Concept approval praising incremental snapshot tracking and bug discovery via fuzzing (pablomartin4btc)
  • Concept approval without stated reasons (w0xlt)
1,171 + 1,493 tests
  • 1,171 lines added or modified outside tests
  • 1,493 lines added or modified in tests
  • 587 lines removed in total
  • 51 files, 27 commits
(+)#35229 optout21 refactor: Use CBlockIndex parameters as reference
  • Prevent accidental null dereferences by enforcing non-null invariants at compile time
  • Protects developers from runtime null errors across chain and index logic
P4 · cleanup
  • P4 because it is a routine internal cleanup with no consensus bug fixes or performance gains
  • The benefit is limited to compile-time safety checks within internal chain state management
Author silent
  • Author has been silent for 113 days, exceeding the stale author threshold
  • Reviewing now may be unproductive until the author returns to address feedback
0
Strong
  • Concept approved with broad agreement and no objections raised
  • Support for compile-time safety and clearer non-null guarantees (musaHaruna)
  • Concept approval without stated reasons (stickies-v, w0xlt)
  • Suggested using reference wrappers for internal chain storage (maflcko)
71 + 7 tests
  • 71 lines added or modified outside tests
  • 7 lines added or modified in tests
  • 68 lines removed in total
  • 12 files, 7 commits
(+)#35271 tomt1664 Update CoinsView::NeedsUpgrade to add additional checks
  • Prevent false positives where nonstandard or downstream chainstates trigger legacy database upgrades
P4 · bug fix
  • P4 because legacy UTXO format was deprecated long ago and Core does not trigger this false positive
  • The benefit applies strictly to downstream projects rather than standard node operations
Author silent
  • Author is inactive with failing CI linter and an unanswered question whether to close
0
  • No review verdicts recorded
Neutral
  • No reviewers have endorsed merging this into Core
  • Reopened out of courtesy for downstream projects after initially closing it (sedited)
  • Questioned whether Bitcoin Core databases ever write keys that trigger this condition (l0rinc)
  • Asked whether the author is still working on this or if it should be closed (maflcko)
2
  • 2 lines added or modified outside tests
  • 0 lines added or modified in tests
  • 1 lines removed in total
  • 1 files, 1 commits
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.
Ranking pass (2026-09-17): all PRs here were compared with each other; 24 notes on review order, overlaps, and band changes.

Covers

Changes that substantively alter validation code: block and transaction validity rules and their implementation, chainstate and block-index management, the UTXO set and its cache and database (src/coins, src/txdb), the block tree database, block and undo file storage and pruning (src/node/blockstorage), the database wrapper and LevelDB (src/dbwrapper), reorg handling, initial block download and assumeutxo, and the tests that pin this behavior. These mandatory structures are validation even though some carry "index" or "db" in their names; the optional indexes under src/index/ are the separate indexes category. "Substantively" means the change alters what the node accepts, how chainstate is maintained, how validation performs, or how a validation invariant is enforced, and a reviewer needs to understand validation logic to review it.

Not validation:

A PR that is primarily a kernel or index change and *also* substantively changes validation logic is a red flag: it probably needs splitting so the validation part can get focused review. Say so in the rationale.

The maintainers' Validation, Consensus, and Block storage labels are a strong prior for membership; "UTXO Db and Indexes" is a prior when the PR touches the coins database rather than src/index/.

What matters here

Consensus correctness above everything: anything that could make the node accept an invalid block or reject a valid one, or diverge from the network. Then chainstate integrity: corruption handling, crash safety, flush and reorg correctness, database invariants. Then resource exhaustion and adversarial cost: validation-time DoS, memory ceilings during IBD and reorgs. Then IBD and block-connection performance, which users feel directly. Then work that makes validation safer to change or test in isolation.

Proposed soft forks (new opcodes, new consensus rules) are validation PRs. Their importance here is the importance of reaching a decision on them and of the code being correct if activated, not a judgment on whether the fork should happen.

Refactors count when they retire a hazard or unblock one of the above; renaming and restructuring for their own sake do not.

generated 2026-09-17 21:55 UTC