BC
← All projectsBitcoin Core

Bitcoin Core

The Bitcoin network's reference node and wallet implementation.

BitcoinSupply chainNormal
Repository coverage

2914 commits in the local evidence base

Every captured commit receives deterministic security triage and a separate communication-quality score. Security candidates and broader second-pass signals receive full-patch Ollama analysis.

257security candidates612second-pass queue2889AI analyses
189commits · 30 days
473commits · 60 days
1490commits · 180 days
2879commits · 365 days
Backfill bands
Aug 5 → Feb 61351 seen45 candidatesComplete
Feb 6 → Jun 61033 seen63 candidatesComplete
Jun 6 → Jul 6281 seen11 candidatesComplete
Jul 6 → Aug 5207 seen5 candidatesComplete
Commit communication

Does the history explain itself?

Message quality measures whether a commit identifies its scope, purpose, rationale, testing, and supporting references. It does not change the security-severity score.

70/100 average clarity
950Strong · 80–100
1188Adequate · 60–79
688Thin · 40–59
88Opaque · 0–39
6security candidates with opaque commit messaging
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
Antoine Poinsot22422170
Ava Chow15950159064
MarcoFalke41021406074
Lőrinc17721177081
fanquake22819226057
Hennadii Stepanov21114208063
rkrux57957074
Sjors Provoost89889074
Sebastian Falbesoner33733073
merge-script32718088
David Gumberg55655072
Pieter Wuille95595066
Analysis record

Published AI watches

Last scanned 26 minutes ago

Informational 18 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35930: wallet: post-#35501 cleanups in CWalletTx

This is a follow-up cleanup and hardening patch for the Bitcoin Core wallet's handling of transactions that have multiple possible witness versions (same transaction ID but different witness data). It renames a variable, simplifies a helpe…

Added input-validation during wallet transaction deserializationNew unit test specifically exercises rejection of mismatched variant txidFollow-up to PR #35501 which introduced witness-variant tracking in the wallet
512dc9afby Ava Chow+68−315 files
No security note in commit
Informational 15 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35729: refactor: test: Unroll `&&` conditions in macros

This commit only changes Bitcoin Core's internal test code. It splits combined conditions inside test-check macros (like BOOST_CHECK(a && b)) into separate checks so that when a test fails, the test output points to the exact failing condi…

aa0e0f79by merge-script+196−9519 files
No security note in commit
Low 26 AI analysisMessage 100 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35493: wallet, descriptor: Fix MuSig private key completeness checks on `importdescriptors`

This commit fixes a bug in Bitcoin Core's wallet import logic for a new type of multi-signature setup called MuSig. Previously, when a user imported a MuSig descriptor that already contained all needed private keys, the wallet incorrectly …

False-positive warning in wallet import for fully-private MuSig descriptorsIncorrect private-key completeness check on synthetic aggregate public keyDescriptor logic now delegates completeness to `Descriptor::HavePrivateKeys()`
2c01832fby merge-script+76−374 files
No security note in commit
Informational 15 AI analysisMessage 81 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35943: doc: fix dead link in txrequest.h

This commit only fixes a broken web link in a code comment. It replaces an outdated URL to a research paper with a working URL to the same paper. There is no change to program logic, no security fix, and no vulnerability.

5d051c05by merge-script+1−11 file
No security note in commit
Informational 15 AI analysisMessage 100 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#33186: wallet, test: Ancient Wallet Migration from v0.14.3 (no-HD and Single Chain)

This commit only adds new automated tests for migrating very old Bitcoin Core wallets (version 0.14.3 from 2017) to the modern descriptor wallet format. It does not change any wallet production code, consensus rules, or network behavior. T…

757aa573by merge-script+246−124 files
No security note in commit
Low 28 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35925: wallet, rpc: Exclude non-owned addresses from listreceivedby*

This update fixes a wallet reporting bug. When a user asked their Bitcoin wallet to list every address that had received money, including empty ones, the result incorrectly included foreign addresses that the wallet merely knew about (for …

Information disclosure: wallet RPCs leaked existence/labels of foreign addressesIncorrect access-control boundary: non-owned addresses exposed in 'received' reportFix uses IsMine() rather than address purpose metadata, avoiding inconsistent purpose handling
e8cc21c5by Ava Chow+19−32 files
No security note in commit
Informational 15 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35937: test: Append print_suppressions=0 to LSAN_OPTIONS, and suppress bitcoin-qt

This commit only changes test configuration. It tells the LeakSanitizer tool used during automated testing to stop printing long lists of suppressed memory leaks, and it narrows the list of ignored leaks to the bitcoin-qt GUI test binary. …

5973e075by merge-script+3−42 files
No security note in commit
Informational 15 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35928: doc: mention -DWITH_ZMQ=ON in macOS build guide

This is a one-line documentation update to the macOS build guide. It adds a note telling users to pass a specific CMake option if they want ZeroMQ notification support. There is no code change and no security impact.

8397e09eby merge-script+1−11 file
No security note in commit
Informational 15 AI analysisMessage 100 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35482: fuzz: exercise the transaction-handling path in process_message(s)

This commit only changes Bitcoin Core's internal fuzz testing code. It makes the fuzz tests exercise more of the transaction-handling code path by toggling Initial Block Download mode and resetting the mempool between test runs. There is n…

No production code modifiedNo consensus, validation, net_processing, or wallet logic changedOnly fuzz test harnesses and test utilities affected
f11dc617by merge-script+105−798 files
No security note in commit
Informational 15 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35914: test, fuzz: Remove unused variables

This commit removes unused variables from Bitcoin Core's test and fuzzing code. It is a cleanup/refactoring change with no effect on the live network software or user funds. It does not fix or introduce any security vulnerability.

d36bf709by merge-script+1−138 files
No security note in commit
Informational 15 AI analysisMessage 93 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35896: refactor: Default uint256::operator==, add operator<=>

This commit is a routine code cleanup in Bitcoin Core. It switches the uint256 equality and comparison operators to use standard C++20 defaults, removes an old custom Compare() helper, and marks an internal assertion-failure function as ne…

ed2c59abby merge-script+99−245 files
No security note in commit
Moderate 62 AI analysisMessage 96 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35872: rpc: avoid descriptor range counter overflow

This update fixes a counting bug in several Bitcoin Core RPC commands that scan descriptors. When a user requested a descriptor range ending at the maximum allowed value (2,147,483,647), the internal counter used a smaller integer type and…

Signed integer overflow in descriptor expansion loopCrash/undefined behavior on maximum-range descriptor scansAuthenticated RPC surface affected (scantxoutset, scanblocks, getdescriptoractivity, utxoupdatepsbt, descriptorprocesspsbt)
b388674aby Ava Chow+3−12 files
Vendor flagged security relevance
Informational 19 AI analysisMessage 91 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35842: rpc: Properly make RPCResult::Type::ANY non-test-only

This is a small cleanup and documentation fix for Bitcoin Core's RPC help system. It removes a comment that incorrectly said a certain output type was 'for testing only' and makes the help text properly display those outputs. There is no d…

No memory safety, cryptography, consensus, or authorization changes observedChange is confined to RPC help/schema metadata generationComment-only/type-label change from 'for testing only' to general use
c36ffd87by merge-script+42−364 files
No security note in commit
Informational 15 AI analysisMessage 93 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35895: refactor: Enable clang-tidy rule to reject anon namespace in header

This is a code cleanup change that turns on a static-analysis rule to prevent a specific C++ coding pattern (anonymous namespaces in header files) and updates two headers to comply. It does not change how Bitcoin Core behaves at runtime an…

No security-relevant code changeNo memory safety, cryptography, consensus, or network changesTooling-only refactor (clang-tidy configuration)
c4fbd3c7by merge-script+9−123 files
No security note in commit
Informational 15 AI analysisMessage 100 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35630: test: Add importdescriptors rpc error test coverage

This commit only adds new test cases to Bitcoin Core's functional test suite. It does not change any production wallet, node, or RPC code. The tests verify that the importdescriptors RPC reports errors in the right order, rejects bad times…

465196d0by merge-script+77−11 file
No security note in commit
Informational 15 AI analysisMessage 81 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35180: coins: group private cache helpers

This change is purely a code cleanup: it moves two internal helper functions of a Bitcoin Core cache class into the private section of the class and removes a duplicate 'private:' label. There is no change to what the code does, no bug fix…

c940fd75by merge-script+13−141 file
No security note in commit
Low 29 AI analysisMessage 81 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

Merge bitcoin/bitcoin#35582: rpc: reject null for optional parameters

This Bitcoin Core change tightens how three RPC commands (scantxoutset, scanblocks, deriveaddresses) handle the value null when it is passed for optional parameters. Previously, explicitly passing null could be treated differently from sim…

RPC parameter validation changeNull value handling changeAddition of explicit error checks for missing required contextual parameters
3db96eb5by merge-script+18−75 files
No security note in commit
Informational 15 AI analysisMessage 57 · Thin
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

refactor: Enable misc-definitions-in-headers

This commit is a code cleanup: it turns on a clang-tidy style check called 'misc-definitions-in-headers' and suppresses that check around a large inline implementation block in a benchmark header. There is no change to Bitcoin's runtime be…

fa93132dby MarcoFalke+3−02 files
No security note in commit
Informational 15 AI analysisMessage 85 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

refactor: Enable clang-tidy rule to reject anon namespace in header

This commit only changes a linting configuration file for the project's code style checker. It enables a rule that prevents anonymous namespaces from being used in header files, which is a code-quality and build-hygiene practice. There is …

No security-relevant signals in the diff or commit message.Change is purely a static-analysis/linting configuration update.
fa5ca877by MarcoFalke+2−11 file
No security note in commit
Repository ledger

Explore captured commits

Expand any commit for its author, full message, clarity score, changed files, triage signals, analysis, and source link.

Lower-priorityqa: Require `--exclude` for each excluded testby Hennadii Stepanov · c5825d4b · Jan 2, 2026 · 4 filesMessage 70 · AdequateInformational 15Details
Commit message · Hennadii Stepanov

qa: Require `--exclude` for each excluded test

Co-authored-by: Lőrinc <pap.lorinc@gmail.com>

70/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit is a quality-assurance cleanup for Bitcoin Core's test runner. It changes how tests are excluded from a comma-separated list to one test per `--exclude` flag. There is no security relevance: it does not touch consensus code, networking, wallet handling, or any production behavior. It only affects internal test tooling and CI scripts.

Lower-prioritytest: Run bench sanity checks in parallel with functional testsby MarcoFalke · fa65bc0e · Jan 1, 2026 · 4 filesMessage 72 · AdequateInformational 15Details
Commit message · MarcoFalke

test: Run bench sanity checks in parallel with functional tests

72/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 15/100

This commit reorganizes how Bitcoin Core runs its benchmark sanity checks. Previously, the bench_bitcoin -sanity-check command was run as a separate CI step and as a CMake test. Now, it is run as part of the functional test suite, with each individual benchmark sanity check executed in parallel alongside other functional tests. There is no change to production code, consensus logic, wallet handling, or network behavior. It is purely a testing infrastructure change.

Lower-prioritytest: Pass bench exe into test framework utilsby MarcoFalke · fa9fdbce · Jan 1, 2026 · 5 filesMessage 82 · StrongInformational 15Details
Commit message · MarcoFalke

test: Pass bench exe into test framework utils

This teaches the test framework about the bench executable, which is
required for the next commit.

82/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only adds plumbing so the Bitcoin Core test framework can locate and run the existing bench_bitcoin benchmark executable during tests. It does not change any network, wallet, consensus, or cryptographic code, and it introduces no user-facing behavior.

Lower-prioritydoc: fix double-word typos in commentsby bensig · 08ed802b · Dec 30, 2025 · 5 filesMessage 45 · ThinInformational 15Details
Commit message · bensig

doc: fix double-word typos in comments

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 15/100

This commit only fixes five instances of accidental repeated words (like 'the the' or 'for for') inside code comments and documentation strings. No actual program logic was changed, so it cannot affect how the software runs or introduce any security issue.

Lower-prioritydoc: Update OpenBSD Build Guideby Hennadii Stepanov · 84d8c526 · Dec 30, 2025 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · Hennadii Stepanov

doc: Update OpenBSD Build Guide

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This is a routine documentation update for building Bitcoin Core on OpenBSD. It changes the recommended OpenBSD version from 7.6 to 7.8 and replaces instructions to build Cap'n Proto from source with a simpler command to install it via the OpenBSD package manager. There is no code change and no security relevance.

Lower-prioritychange test_runner.py to be cwd independent by calling subprocess.run with cwd arg.by Robin David · 77c9b3c0 · Dec 30, 2025 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Robin David

change test_runner.py to be cwd independent by calling subprocess.run with cwd arg.

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 15/100

This is a small developer-tooling fix for Bitcoin Core's fuzzing test runner. It changes how a Python script calls Git so the script works correctly no matter which folder you run it from. There is no security vulnerability or user-facing risk.

Lower-prioritypolicy: remove constant parameter from `IsWellFormedPackage`by Lőrinc · 658d3810 · Dec 29, 2025 · 4 filesMessage 91 · StrongInformational 15Details
Commit message · Lőrinc

policy: remove constant parameter from `IsWellFormedPackage`

`IsWellFormedPackage()` already claims: "parents must appear before children."
In practice the `require_sorted` argument was always passed as `true`, making the false-path dead code.
It was introduced that way from the beginning in https://github.com/bitcoin/bitcoin/pull/28758/files#diff-f30090b30c9489972ee3f1181c302cf3a484bb890bade0fd7c9ca92ea8d347f6R79.

Remove the unused parameter, updating callers/tests.

91/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
AI analysis · Informational 15/100

This is a small code cleanup change in Bitcoin Core. It removes an unused option from a function that checks whether a group of transactions (a 'package') is properly ordered. The option was always set to 'true' everywhere it was used, so the code path for 'false' was never reachable. The change simplifies the function and its tests but does not alter actual behavior or fix any security issue.

AI review queueddoc: update copyright yearby fanquake · b23b9013 · Dec 29, 2025 · 3 filesMessage 35 · OpaqueInformational 15Details
Commit message · fanquake

doc: update copyright year

35/100 · OpaqueMessage clarity
✓ Descriptive subject! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit only updates the copyright year from 2025 to 2026 in three documentation/legal files. It does not change any executable code, build logic, or network behavior, and has no security relevance.

Lower-prioritytest: change low fee parents to 0-feeby Greg Sanders · 25e84d37 · Dec 29, 2025 · 1 fileMessage 90 · StrongInformational 15Details
Commit message · Greg Sanders

test: change low fee parents to 0-fee

The test is harder to read, and had an explicit 1sat/vbyte
floor assumption in a single place which is incorrect. Using
0-fee makes the test more future proof.

90/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only changes a single test file. It simplifies how test transactions are created by using zero-fee parent transactions instead of carefully calculated low-but-nonzero fees. There is no change to Bitcoin Core's actual network, consensus, or wallet code, so it cannot affect real users or funds.

Lower-prioritytest: ensure clean orphanage before continuingby Greg Sanders · 95ef0fc5 · Dec 29, 2025 · 1 fileMessage 98 · StrongInformational 15Details
Commit message · Greg Sanders

test: ensure clean orphanage before continuing

The tests were written assuming transaction orphans would
persist for a time beyond the test peer's disconnection.
After #31829 this no longer holds, so as a minimal fix we
modify the test to wait until the orphans are removed before
continuing with the final transaction submissions.

98/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
AI analysis · Informational 15/100

This is a test-only change in Bitcoin Core's functional test suite. It adjusts a test to wait for orphan transactions to be cleared after a peer disconnects, because a previous code change made orphans disappear faster than the test originally expected. There is no change to production code, no vulnerability, and no security risk to users.

Lower-priorityRemove stale rationale paragraphby flack · 337b4a23 · Dec 27, 2025 · 1 fileMessage 58 · ThinInformational 15Details
Commit message · flack

Remove stale rationale paragraph

It belonged to the note removed in #33892

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides an explanatory body✓ Links an issue, advisory, or supporting reference
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This commit only removes an outdated explanatory paragraph from a documentation file. No code, logic, or behavior of the Bitcoin Core software is changed. It is purely a cleanup of stale text that referenced a note removed in an earlier pull request.

AI review queuedtest: Enable ruff E713 lintby MarcoFalke · fab300b3 · Dec 26, 2025 · 10 filesMessage 67 · AdequateInformational 15Details
Commit message · MarcoFalke

test: Enable ruff E713 lint

67/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit only turns on a Python style lint rule (E713) that prefers 'not in' over 'not ... in'. It updates test scripts and helper tools to match the style, with no changes to the Bitcoin Core software that users run. There is no security issue here.

AI review queuedscripted-diff: refactor: wallet: Delete IsCryptedby David Gumberg · 11ce5cf7 · Dec 24, 2025 · 7 filesMessage 78 · AdequateInformational 15Details
Commit message · David Gumberg

scripted-diff: refactor: wallet: Delete IsCrypted

This function is a duplicate of HasEncryptionKeys().

-BEGIN VERIFY SCRIPT-
sed -i '/bool IsCrypted() const;/d' src/wallet/wallet.h
sed -i '/^bool CWallet::IsCrypted() const$/,/^}$/{/^}$/N;d;}' src/wallet/wallet.cpp
sed -i --regexp-extended 's/IsCrypted\(\)/HasEncryptionKeys()/g' $(git ls-files '*.cpp' '*.h')
-END VERIFY SCRIPT-

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit is a simple code cleanup: it removes a duplicate function named IsCrypted() and replaces every use of it with an already-existing identical function named HasEncryptionKeys(). There is no change in behavior, no bug fix, and no security issue introduced or fixed.

Lower-prioritytest: Add unit test for SCRIPT_ERR_NUMEQUALVERIFYby billymcbip · b7625387 · Dec 24, 2025 · 1 fileMessage 67 · AdequateInformational 15Details
Commit message · billymcbip

test: Add unit test for SCRIPT_ERR_NUMEQUALVERIFY

67/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 15/100

This commit adds a single new test case to Bitcoin Core's script test suite. It checks that when two unequal numbers are compared with the NUMEQUALVERIFY opcode, the script correctly fails with the expected error code. There is no change to production code, no bug fix, and no security-relevant behavior change.

Lower-priority[kernel] Expose reusable PrecomputedTransactionData in script validby Josh Doman · 44e006d4 · Dec 23, 2025 · 4 filesMessage 50 · ThinInformational 19Details
Commit message · Josh Doman

[kernel] Expose reusable PrecomputedTransactionData in script valid

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 19/100

This commit refactors the Bitcoin Core kernel library's script verification API so that callers can create and reuse a 'PrecomputedTransactionData' object across multiple input checks for the same transaction. Previously, the API accepted the raw spent outputs each time and internally recomputed transaction hashes. The change is a performance and API-cleanliness improvement; it does not appear to fix a security bug, but it does slightly alter how taproot spent-output requirements are enforced.

Lower-prioritytest: Avoid hard time.sleep(1) in feature_init.pyby MarcoFalke · fa727e3e · Dec 23, 2025 · 1 fileMessage 67 · AdequateInformational 15Details
Commit message · MarcoFalke

test: Avoid hard time.sleep(1) in feature_init.py

67/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
AI analysis · Informational 15/100

This commit changes only a test file in Bitcoin Core. It replaces a fixed one-second sleep with a smarter wait that pauses until a specific RPC command is actually running. There is no change to production code, no security fix, and no vulnerability.

AI review queuedvalidation: pre-reserve leaves to prevent reallocs with odd vtx countby Lőrinc · 3dd815f0 · Dec 23, 2025 · 3 filesMessage 93 · StrongInformational 20Details
Commit message · Lőrinc

validation: pre-reserve leaves to prevent reallocs with odd vtx count

`ComputeMerkleRoot` duplicates the last hash when the input size is odd. If the caller provides a `std::vector` whose capacity equals its size, that extra `push_back` forces a reallocation, doubling its capacity (allocating 3x the necessary memory).

This affects roughly half of the created blocks (those with odd transaction counts), causing unnecessary memory fragmentation during every block validation.

Fix this by pre-reserving the vector capacity to account for the odd-count duplication. The expression `(size + 1) & ~1ULL` adds 1 to the size and clears the last bit, effectively rounding up to the next even number. This syntax produces optimal assembly across x86/ARM and 32/64-bit platforms for gcc/clang, see https://godbolt.org/z/xzscoq7nv.

Also switch from `resize` to `reserve` + `push_back` to eliminate the default construction of `uint256` objects that are immediately overwritten.

> ./build/bin/bench_bitcoin -filter='MerkleRoot.*' -min-time=1000

| ns/leaf | leaf/s | err% | total | benchmark
|--------------------:|--------------------:|--------:|----------:|:----------
| 43.73 | 22,867,350.51 | 0.0% | 1.10 | `MerkleRoot`
| 44.17 | 22,640,349.14 | 0.0% | 1.10 | `MerkleRootWithMutation`

Massif memory measurements after show 0.8 MB peak memory usage

KB
801.4^ #
| #
| #
| #
| #
| #
| #
| # :::::@:::::@:
| #:::@@@::@:::::::::::::::@::@:@:::@@:::::::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
| #:::@ @: @:::::::::::::::@::@:@:::@ :::: ::::@::::::@:::::@::::@:::::@:
0 +----------------------------------------------------------------------->s
0 227.5

and the stacks don't show reallocs anymore:
96.37% (790,809B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->35.10% (288,064B) 0x2234AF: allocate (new_allocator.h:151)
| ->35.10% (288,064B) 0x2234AF: allocate (allocator.h:203)
| ->35.10% (288,064B) 0x2234AF: allocate (alloc_traits.h:614)
| ->35.10% (288,064B) 0x2234AF: _M_allocate (stl_vector.h:387)
| ->35.10% (288,064B) 0x2234AF: reserve (vector.tcc:79)
| ->35.10% (288,064B) 0x2234AF: ToMerkleLeaves<std::vector<uint256>, MerkleRoot(ankerl::nanobench::Bench&)::<lambda()>::<lambda(bool, const auto:46&)> > (merkle.h:19)
| ->35.10% (288,064B) 0x2234AF: operator() (merkle_root.cpp:25)
| ->35.10% (288,064B) 0x2234AF: ankerl::nanobench::Bench& ankerl::nanobench::Bench::run<MerkleRoot(ankerl::nanobench::Bench&)::{lambda()

Co-authored-by: optout21 <13562139+optout21@users.noreply.github.com>
Co-authored-by: Hodlinator <172445034+hodlinator@users.noreply.github.com>

93/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Links an issue, advisory, or supporting reference
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 20/100

This commit is a performance and memory-efficiency improvement, not a security fix. It changes how Bitcoin Core builds the list of transaction hashes before computing a Merkle root. Previously, when a block contained an odd number of transactions, the internal duplicate-hash step could force an extra memory reallocation, wasting memory and causing fragmentation. The patch pre-allocates exactly the needed capacity and avoids default-constructing unused objects. There is no vulnerability or exploit here.

Lower-prioritybench: make `MerkleRoot` benchmark more representativeby Lőrinc · 7fd47e0e · Dec 23, 2025 · 1 fileMessage 85 · StrongInformational 15Details
Commit message · Lőrinc

bench: make `MerkleRoot` benchmark more representative

Two versions are run now, one with the mutation calculations, the other without.
To avoid unwanted compiler optimizations, we assert the expected hash, which should inhibit aggressive optimization.

To make the benchmark more similar to production `ComputeMerkleRoot` call sites, the input leaves-copying is made explicit before each run.

> ./build/bin/bench_bitcoin -filter='MerkleRoot.*' -min-time=1000

| ns/leaf | leaf/s | err% | total | benchmark
|--------------------:|--------------------:|--------:|----------:|:----------
| 44.18 | 22,634,858.70 | 0.0% | 1.10 | `MerkleRoot`
| 44.66 | 22,390,601.03 | 0.0% | 1.10 | `MerkleRootWithMutation`

Massif memory measurements show the excessive memory reservations:

MB
1.332^ :
| # :
| # :
| # :
| # :
| # @ :
| # @ :
| # @ :
| # @ :
| # @ :
| # @ :
| # @ :
| # @ :
| #::::@::::::::::::::::::::::::::::::::::::::::::::::::::::::@:::::@::::
| #: ::@::::: :::::::: :: ::: :::::: : : :: ::: ::: : : : ::::@:::::@::::
| #: ::@::::: :::::::: :: ::: :::::: : : :: ::: ::: : : : ::::@:::::@::::
| #: ::@::::: :::::::: :: ::: :::::: : : :: ::: ::: : : : ::::@:::::@::::
| #: ::@::::: :::::::: :: ::: :::::: : : :: ::: ::: : : : ::::@:::::@::::
| #: ::@::::: :::::::: :: ::: :::::: : : :: ::: ::: : : : ::::@:::::@::::
| #: ::@::::: :::::::: :: ::: :::::: : : :: ::: ::: : : : ::::@:::::@::::
0 +----------------------------------------------------------------------->s
0 226.2

showing the reallocations clearly in the stacks:
97.87% (1,366,841B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->41.25% (576,064B) 0x969717: allocate (new_allocator.h:151)
| ->41.25% (576,064B) 0x969717: allocate (allocator.h:203)
| ->41.25% (576,064B) 0x969717: allocate (alloc_traits.h:614)
| ->41.25% (576,064B) 0x969717: _M_allocate (stl_vector.h:387)
| ->41.25% (576,064B) 0x969717: _M_realloc_append<const uint256&> (vector.tcc:572)
| ->41.25% (576,064B) 0x969717: push_back (stl_vector.h:1427)
| ->41.25% (576,064B) 0x969717: ComputeMerkleRoot(std::vector<uint256, std::allocator<uint256> >, bool*) (merkle.cpp:55)
| ->41.25% (576,064B) 0x2235A7: operator() (merkle_root.cpp:31)
| ->41.25% (576,064B) 0x2235A7: ankerl::nanobench::Bench& ankerl::nanobench::Bench::run<MerkleRoot(ankerl::nanobench::Bench&)::{lambda()

Co-authored-by: Hodlinator <172445034+hodlinator@users.noreply.github.com>

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Informational 15/100

This change only updates an internal performance benchmark for the Merkle root calculation. It does not alter the actual Bitcoin consensus or networking code that runs on nodes, so it cannot directly affect security, funds, or network behavior.

Security candidatetest: Allow mempool_updatefromblock.py to run on 32-bitby MarcoFalke · fac5a1b1 · Dec 22, 2025 · 2 filesMessage 72 · AdequateInformational 15Details
Commit message · MarcoFalke

test: Allow mempool_updatefromblock.py to run on 32-bit

72/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Mentions testing or verification! No meaningful explanatory body
Why it was queued
boot or update path
AI analysis · Informational 15/100

This commit only changes a test script and a CI configuration file. It makes a functional test more tolerant of minor differences on 32-bit ARM systems and enables functional tests to run in the ARM CI environment. There is no change to the actual Bitcoin node software that users run, so it cannot affect live funds, network consensus, or node security.

AI review queuedrpc: [wallet] Use unsigned type for tx version in sendallby MarcoFalke · fafbc70d · Dec 22, 2025 · 1 fileMessage 50 · ThinInformational 18Details
Commit message · MarcoFalke

rpc: [wallet] Use unsigned type for tx version in sendall

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 18/100

This is a tiny type-cleanup in the wallet's 'sendall' RPC command. It changes how the transaction version number is read from a signed integer to an unsigned integer matching the field's actual type. There is no direct evidence in the commit that this fixes an exploitable bug, but using the wrong signed type could in principle allow a user to pass a negative value that gets misinterpreted as a very large positive version number, which might then be rejected or handled unexpectedly.

Lower-priority[qt] Set peer version and subversion to N/A when not available or detectingby WakeTrainDev · b261100e · Dec 21, 2025 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · WakeTrainDev

[qt] Set peer version and subversion to N/A when not available or detecting

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
AI analysis · Informational 15/100

This is a tiny user-interface fix in Bitcoin Core's Qt wallet. When viewing details about a connected network peer, the version and subversion fields now show 'N/A' if the information isn't available, instead of leaving the field blank. It does not change network behavior, consensus rules, or security-sensitive logic.

Lower-prioritykernel: Move BlockInfo to a kernel fileby TheCharlatan · d3a479cb · Dec 21, 2025 · 5 filesMessage 68 · AdequateInformational 15Details
Commit message · TheCharlatan

kernel: Move BlockInfo to a kernel file

This should avoid having to include interfaces/chain.h from a kernel
module. interfaces/chain.h in turn includes a bunch of non-kernel
headers, that break the desired library topology and might introduce
entanglement regressions.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This is a routine code reorganization change. It moves a data structure called BlockInfo from one internal header file to another so that lower-level 'kernel' modules do not need to include a higher-level interface header. There is no user-facing behavior change and no security fix.

AI review queuedkernel: Remove some unnecessary non-kernel includesby TheCharlatan · d69a582e · Dec 21, 2025 · 8 filesMessage 73 · AdequateInformational 15Details
Commit message · TheCharlatan

kernel: Remove some unnecessary non-kernel includes

Specifically gets rid of batchpriority, chainparams, script/sign.h and
system includes.

Also take the opportunity of cleaning up the headers for the effected
files and adding them to the iwyu-enforced set.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This is a routine code cleanup commit for the Bitcoin Core project. It removes unused or unnecessary header file includes from several source files related to the 'kernel' module and adds those files to an automated check that enforces correct include usage. There is no functional change to the program's behavior and no security issue is present.

Lower-priorityadd release note about supporing non-TRUC <minrelay txnsby Greg Sanders · e44dec02 · Dec 19, 2025 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Greg Sanders

add release note about supporing non-TRUC <minrelay txns

50/100 · ThinMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This commit only adds a release note describing a previously implemented policy change. It does not change any code, configuration, or behavior. There is no security issue in the commit itself.

Security candidatedoc: Use multipath descriptors in descriptors.md and linked testby Anurag chavan · 552bc82b · Dec 19, 2025 · 2 filesMessage 91 · StrongInformational 15Details
Commit message · Anurag chavan

doc: Use multipath descriptors in descriptors.md and linked test

Updates documentation and wallet_miniscript_decaying_multisig_descriptor_psbt.py
to use single multipath descriptors with <0;1> syntax instead of separate
external/internal descriptors.

Changes:
- doc/descriptors.md: Update examples to use /<0;1>/* multipath syntax with /0 and /1 notation
- doc/descriptors.md: Update Basic Multisig Example instructions
- test: Refactor to use single multipath descriptor pattern, matching wallet_multisig_descriptor_psbt.py

Implementation:
- _get_xpub() extracts external descriptor and converts to multipath format
- create_multisig() builds descriptor string, gets checksum, imports descriptor#checksum
- Multipath descriptor properly expands to external and internal/change descriptors

Fixes #34086

91/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
signing boundarysigning or wallet path
AI analysis · Informational 15/100

This commit is a documentation and test-code cleanup only. It updates Bitcoin Core's descriptor documentation and one functional test to use the newer 'multipath' descriptor syntax (/<0;1>/*) so a single descriptor can describe both receiving and change addresses, instead of maintaining two separate descriptors. There is no change to production wallet, consensus, or networking code, and no security fix or vulnerability is present.