BC
← All projectsBitcoin Core

Bitcoin Core

The Bitcoin network's reference node and wallet implementation.

BitcoinSupply chainNormal
Repository coverage

2902 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.

254security candidates607second-pass queue2881AI analyses
195commits · 30 days
494commits · 60 days
1518commits · 180 days
2876commits · 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
939Strong · 80–100
1188Adequate · 60–79
687Thin · 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 Chow15750157064
MarcoFalke41021406074
Lőrinc17721177081
fanquake22719226057
Hennadii Stepanov20914208063
rkrux57957074
Sjors Provoost89889074
Sebastian Falbesoner33733073
David Gumberg55655072
Pieter Wuille95595066
Hodlinator66566076
Analysis record

Published AI watches

Last scanned 25 minutes ago

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
Informational 15 AI analysisMessage 62 · Adequate
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

refactor: Use C++20 std::identity over IntIdentity

This commit is a straightforward code cleanup: it replaces a small custom helper named IntIdentity with the standard C++20 std::identity from the <functional> header. The behavior of the ConvertBits function is unchanged; only the implemen…

fafe5042by MarcoFalke+4−111 file
No security note in commit
Informational 15 AI analysisMessage 87 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

test: test the result order of a multiple import request is correct

This commit only adds a new automated test to Bitcoin Core. It checks that when a user asks the wallet to import multiple descriptors at once, the list of results comes back in the same order as the original request, including any error me…

3ac8b806by Pol Espinasa+40−01 file
No security note in commit
Informational 15 AI analysisMessage 87 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

test: test invalid or missing timestamp throws importdescriptors

This commit only adds new automated tests for the Bitcoin Core wallet's importdescriptors RPC. It checks that the command correctly rejects requests with a missing or invalid timestamp. No production wallet code is changed, so this cannot …

No changes to consensus, networking, wallet logic, or cryptographyOnly functional test code is modifiedAdded assertions are for expected error handling paths
e4732bf0by Pol Espinasa+28−11 file
No security note in commit
Informational 15 AI analysisMessage 80 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

refactor: Remove unused #include in common/system

This is a minor code cleanup that removes one unused header file include and swaps another for a more specific one. It does not change any program behavior or fix any security issue.

fa7304f3by MarcoFalke+1−22 files
No security note in commit
Informational 15 AI analysisMessage 50 · Thin
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

iwyu: Fix warnings in `src/consensus` and treat them as errors

This commit is a routine code cleanup: it adjusts which C++ header files are included in several consensus-related source files and turns on a stricter compiler hygiene check (Include What You Use, or IWYU) for the src/consensus directory.…

13b53f8bby Hennadii Stepanov+42−79 files
No security note in commit
Informational 15 AI analysisMessage 55 · Thin
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

fuzz: don't connman.ReceiveMsgFrom oversized msg

This is a small fix to a Bitcoin Core fuzz test (an automated internal testing harness), not to the live network code. The fuzzer was sometimes creating fake P2P messages larger than the real protocol allows and passing them into a test he…

Test-only fuzz harness hardeningOversized message guard added before ReceiveMsgFrom() in fuzz targetNo change to production P2P message acceptance logic
bb19f1daby Greg Sanders+5−01 file
No security note in commit
Informational 15 AI analysisMessage 97 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

ci: Temporarily remove riscv32 config from GHA matrix

This commit simply removes one failing test configuration (RISC-V 32-bit bare metal) from the project's GitHub Actions CI matrix because it was failing. It is a routine CI maintenance change with no security implications.

fa06ea42by MarcoFalke+0−61 file
No security note in commit
Low 47 AI analysisMessage 90 · Strong
BC Bitcoin CoreBitcoin Core BitcoinSupply chain

ci: verify cross-build SDK archives

This change adds checksum verification to the build system's downloads of Apple, FreeBSD, NetBSD, and OpenBSD software development kits (SDKs). Before this patch, those SDK archives were downloaded at build time and extracted without confi…

Adds cryptographic digest verification for downloaded SDK archivesRemoves unchecked extraction of remote SDK archives in CIHardens CI supply chain for macOS/BSD cross-builds
873550beby Lőrinc+25−126 files
Vendor flagged security relevance
Repository ledger

Explore captured commits

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

Lower-prioritylint: pass args from lint.py to cargo run in containerby will · 5aeaa71c · Jan 27, 2026 · 3 filesMessage 50 · ThinInformational 15Details
Commit message · will

lint: pass args from lint.py to cargo run in container

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

This commit is a minor developer-tooling improvement. It changes the lint helper scripts so that command-line arguments typed by a developer (for example, `--help` or `--lint=py_lint`) are forwarded through the container entrypoint into the Rust lint test runner. There is no change to Bitcoin Core's network, wallet, consensus, or cryptographic code, and nothing in the diff suggests a security bug or fix.

Lower-prioritylint: upgrade lint scripts for worktreesby will · c17a2adb · Jan 27, 2026 · 4 filesMessage 68 · AdequateInformational 15Details
Commit message · will

lint: upgrade lint scripts for worktrees

Add a ci/lint.py script to run the linter both locally or inside the CI
(replacing .github/ci-lint-exec.py) which supports running from a
worktree.

Determines whether we are in a worktree, and mounts the real `.git`
directory as a read-only volume if we are.

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

This commit is a routine developer tooling change. It replaces one Python script that runs code-quality checks in a Docker container with another script that does the same thing but also works correctly with Git worktrees. There is no change to Bitcoin's network code, wallet code, consensus rules, or anything end users interact with. It does not fix or introduce a security vulnerability.

Lower-prioritylog: Print warning about privacy-sensitive log info unconditionallyby MarcoFalke · fa9c92d7 · Jan 27, 2026 · 1 fileMessage 65 · AdequateLow 27Details
Commit message · MarcoFalke

log: Print warning about privacy-sensitive log info unconditionally

Also, fix whitespace in this function, while touching it. Can be
reviewed via the git option
--ignore-all-space

65/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body
AI analysis · Low 27/100

This commit changes when Bitcoin Core prints a privacy warning about log files. Previously, the warning only appeared when extra 'debug' logging was turned on. Now it prints every time the node starts, because ordinary logs can also contain sensitive details. It is a privacy-awareness improvement, not a fix for an active security flaw.

Security candidateSquashed 'src/secp256k1/' changes from d543c0d917..14e56970cbby fanquake · 2fccbea3 · Jan 27, 2026 · 37 filesMessage 100 · StrongLow 29Details
Commit message · fanquake

Squashed 'src/secp256k1/' changes from d543c0d917..14e56970cb

14e56970cb Merge bitcoin-core/secp256k1#1794: ecmult: Use size_t for array indices
c7a52400d6 Merge bitcoin-core/secp256k1#1809: release cleanup: bump version after 0.7.1
ae7eb729c0 release cleanup: bump version after 0.7.1
1a53f4961f Merge bitcoin-core/secp256k1#1808: Prepare for 0.7.1
20a209f11c release: prepare for 0.7.1
c4b6a81a60 changelog: update in preparation for the v0.7.1 release
ebb35882da Merge bitcoin-core/secp256k1#1796: bench: fail early if user inputs invalid value for SECP256K1_BENCH_ITERS
c09215f7af bench: fail early if user inputs invalid value for SECP256K1_BENCH_ITERS
471e3a130d Merge bitcoin-core/secp256k1#1800: sage: verify Eisenstein integer connection for GLV constants
29ac4d8491 sage: verify Eisenstein integer connection for GLV constants
4721e077b4 Merge bitcoin-core/secp256k1#1793: doc/bench: added help text for SECP256K1_BENCH_ITERS env var for bench_ecmult
bd5ced1fe1 doc/bench: added help text for SECP256K1_BENCH_ITERS env var for bench_ecmult
47eb70959a ecmult: Use size_t for array indices in _odd_multiplies_table
bb1d199de5 ecmult: Use size_t for array indices into tables
2d9137ce9d Merge bitcoin-core/secp256k1#1764: group: Avoid using infinity field directly in other modules
f9a944ff2d Merge bitcoin-core/secp256k1#1790: doc: include arg -DSECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS=ON for cmake
0406cfc4d1 doc: include arg -DUSE_EXTERNAL_DEFAULT_CALLBACKS=1 for cmake
8d445730ec Merge bitcoin-core/secp256k1#1783: Add VERIFY_CHECKs and documentation that flags must be 0 or 1
aa2a39c1a7 Merge bitcoin-core/secp256k1#1778: doc/bench: Added cmake build options to bench error messages
540fec8ae9 Merge bitcoin-core/secp256k1#1788: test: split monolithic ellswift test into independent cases
d822b29021 test: split monolithic ellswift test into independent cases
ae00c552df Add VERIFY_CHECKs that flags are 0 or 1
5c75183344 Merge bitcoin-core/secp256k1#1784: refactor: remove ret from secp256k1_ec_pubkey_serialize
be5e4f02fd Merge bitcoin-core/secp256k1#1779: Add ARG_CHECKs to ensure "array of pointers" elements are non-NULL
3daab83a60 refactor: remove ret from secp256k1_ec_pubkey_serialize
8bcda186d2 test: Add non-NULL checks for "pointer of array" API functions
5a08c1bcdc Add ARG_CHECKs to ensure "array of pointers" elements are non-NULL
3b5b03f301 doc/bench: Added cmake build options to bench error messages
e7f7083b53 Merge bitcoin-core/secp256k1#1774: refactor: split up internal pubkey serialization function into compressed/uncompressed variants
b6c2a3cd77 Merge bitcoin-core/secp256k1#1761: ecmult_multi: reduce strauss memory usage by 30%
f5e815f430 remove secp256k1_eckey_pubkey_serialize function
0d3659c547 use new `_eckey_pubkey_serialize{33,65}` functions in modules (ellswift,musig)
adb76f82ea use new `_eckey_pubkey_serialize{33,65}` functions in public API
fc7458ca3e introduce `secp256k1_eckey_pubkey_serialize{33,65}` functions
c8206b1ce6 Merge bitcoin-core/secp256k1#1771: ci: Use Python virtual environment in "x86_64-macos-native" job
f252da7e6e ci: Use Python virtual environment in "x86_64-macos-native" job
115b135fe8 Merge bitcoin-core/secp256k1#1763: bench: Use `ALIGNMENT` macro instead of hardcoded value
2f73e5281d group: Avoid using infinity field directly in other modules
153eea20c2 bench: Use `ALIGNMENT` macro instead of hardcoded value
26166c4f5f ecmult_multi: reduce strauss memory usage by 30%
7a2fff85e8 Merge bitcoin-core/secp256k1#1758: ci: Drop workaround for Valgrind older than 3.20.0
43e7b115f7 Merge bitcoin-core/secp256k1#1759: ci: Switch to macOS 15 Sequoia Intel-based image
8bc50b72ff ci: Switch to macOS 15 Sequoia Intel-based image
c09519f0e3 ci: Drop workaround for Valgrind older than 3.20.0

git-subtree-dir: src/secp256k1
git-subtree-split: 14e56970cba37ffe4ee992c1e08707a16e22e345

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification✓ Links an issue, advisory, or supporting reference
Why it was queued
cryptography-sensitive path
AI analysis · Low 29/100

This is a routine subtree update that pulls in the latest libsecp256k1 maintenance release (0.7.1 → 0.7.2 development). The bundled changes are mostly cleanups: stricter input validation (rejecting NULL pointers in arrays), safer internal serialization helpers, documentation and benchmark fixes, CI updates, and a build fix for x86_64 assembly detection. The vendor's own changelog explicitly lists these as non-security bug fixes and ABI-compatible improvements. There is no evidence in the commit of an undisclosed vulnerability, exploit, or attacker-relevant flaw.

Lower-prioritybuild: Remove outdated comment about -ffile-prefix-mapby MarcoFalke · fa2e1b85 · Jan 26, 2026 · 1 fileMessage 100 · StrongInformational 15Details
Commit message · MarcoFalke

build: Remove outdated comment about -ffile-prefix-map

The -ffile-prefix-map option is no longer used and it seems fine to
remove the warning about it possibly breaking coverage builds.

If this needs documentation, the dev notes seem like a better place,
because it also affects other places, such as depends. C.f. commit
407062f2ac93624f350e9e8a4f641c882a2aaf2f

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This commit simply deletes an outdated comment from a build configuration file. No code, compiler flags, or security behavior is changed. It is a documentation cleanup with no security relevance.

Lower-prioritydoc: Remove outdated -fdebug-prefix-map section in dev notesby MarcoFalke · fa06cd4b · Jan 26, 2026 · 1 fileMessage 83 · StrongInformational 15Details
Commit message · MarcoFalke

doc: Remove outdated -fdebug-prefix-map section in dev notes

The section claims to be for ccache builds, however those are already
fixed after commit 1cc58d3a0c653ac30df04d1010a3cf84c6bc307a.

If there are still any build or debug problems after that commit,
dedicated instructions can be added back, along with exact steps to
reproduce and test.

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
documentation-only discount
AI analysis · Informational 15/100

This commit simply deletes an outdated documentation section from the developer notes. It removes instructions about debugging source paths when using ccache, because a previous code change already fixed the underlying issue. There is no code change, no security fix, and no vulnerability introduced or addressed.

Lower-priorityguix: documented shasum gathering commandby janb84 · ab649ce4 · Jan 26, 2026 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · janb84

guix: documented shasum gathering command

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 commit only adds documentation to a README file explaining how developers can collect SHA-256 checksums of build outputs. It is a pure documentation change with no code modifications and no security relevance.

Lower-prioritytest: use ModuleNotFoundError in interface_ipc.pyby fanquake · 905dfdee · Jan 26, 2026 · 1 fileMessage 98 · StrongInformational 15Details
Commit message · fanquake

test: use ModuleNotFoundError in interface_ipc.py

Change this so we catch the case where the capnp shared libs have been
updated, and can no-longer be loaded by the Python module, resulting in
a skipped test, even though pycapnp is installed. i.e:
```bash
stderr:
Traceback (most recent call last):
File "/root/ci_scratch/build/test/functional/interface_ipc.py", line 20, in <module>
import capnp # type: ignore[import] # noqa: F401
^^^^^^^^^^^^
File "/usr/local/lib64/python3.14/site-packages/capnp/__init__.py", line 36, in <module>
from .version import version as __version__
File "/usr/local/lib64/python3.14/site-packages/capnp/version.py", line 1, in <module>
from .lib.capnp import _CAPNP_VERSION_MAJOR as LIBCAPNP_VERSION_MAJOR # noqa: F401
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: libcapnpc.so.1.0.1: cannot open shared object file: No such file or directory
```

Failing in this way should make it clear that `pycapnp` needs to be
reinstalled/rebuilt.

If `pycapnp` is not installed, the test still skips as expected:
```bash
Remaining jobs: [interface_ipc.py]
1/1 - interface_ipc.py skipped (capnp module not available.)

TEST | STATUS | DURATION

interface_ipc.py | ○ Skipped | 0 s
```

Fixes: #34016.

Co-authored-by: Ryan Ofsky <ryan@ofsky.org>

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 tiny change to a single Bitcoin Core test file. It makes the test skip cleanly when the optional capnp Python library is broken or missing, instead of crashing with a confusing error. It does not affect normal Bitcoin node operation, wallets, consensus, networking, or any user-facing security behavior.

AI review queuedwallet: fix removeprunedfunds bug with conflicting transactionsby Martin Zumsande · 1f60ca36 · Jan 26, 2026 · 2 filesMessage 85 · StrongModerate 60Details
Commit message · Martin Zumsande

wallet: fix removeprunedfunds bug with conflicting transactions

removeprunedfunds removes all entries from mapTxSpends for the
inputs of the pruned tx. However, this is incorrect, because there could be
multiple entries from conflicting transactions (that shouldn't be
removed as well). This could lead to the wallet creating invalid
transactions, trying to double spend utxos.
The bug persists when the conflicting tx was mined, because
the wallet trusts its internal accounting instead of calling
AddToSpends again.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Moderate 60/100

This commit fixes a bug in Bitcoin Core's wallet where removing a pruned transaction could accidentally delete records of other conflicting transactions that spend the same coin. As a result, the wallet might mistakenly believe a coin was still available and create an invalid double-spend transaction. The fix ensures only the specific pruned transaction's spend records are removed, leaving conflicting transactions intact.

Lower-prioritytest: Verify peer usage after assumeutxo validation completesby stringintech · 7d9e1a81 · Jan 24, 2026 · 1 fileMessage 100 · StrongInformational 15Details
Commit message · stringintech

test: Verify peer usage after assumeutxo validation completes

Add test coverage to ensure peers without the snapshot block in their chain can be used for block downloads after background validation completes. The test fails without the fix in the previous commit.

100/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only adds a new automated test to Bitcoin Core. It does not change any production code, network rules, or wallet behavior. The test verifies that a node using the assumeutxo snapshot feature can later switch to a different chain with more proof-of-work once background validation finishes. There is no security vulnerability introduced here.

Lower-priorityrefactor: use transparent comparator for setBlockIndexCandidates lookupsby joaonevess · 3bd98b45 · Jan 24, 2026 · 2 filesMessage 85 · StrongInformational 15Details
Commit message · joaonevess

refactor: use transparent comparator for setBlockIndexCandidates lookups

This allows checking for existence in setBlockIndexCandidates using a const CBlockIndex* without casting away constness, replacing a legacy const_cast check in validation.cpp.

85/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This is a small code cleanup (refactor) in Bitcoin Core. It removes three uses of const_cast in a consistency-checking function by teaching the block index comparator to accept lookups with const pointers. There is no change to program logic, no bug fix, and no security-relevant behavior change.

AI review queueddoc: fix invalid arg name hints for bugprone validationby Lőrinc · a73a3ec5 · Jan 23, 2026 · 12 filesMessage 81 · StrongInformational 15Details
Commit message · Lőrinc

doc: fix invalid arg name hints for bugprone validation

The extra leading `=` or missing trailing `=` prevented clang-tidy's `bugprone-argument-comment` check from validating the parameter name, as it only matches comments formatted strictly as `/*arg=*/` (see https://clang.llvm.org/extra/clang-tidy/checks/bugprone/argument-comment.html).

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

This commit only fixes the formatting of code comments that label function arguments (for example, changing /*check_pow=*/ to the correct /*check_pow=*/ form). These comments are ignored by the running program and have no effect on Bitcoin's behavior, network protocol, or security. The change enables a static-analysis tool (clang-tidy) to verify that the labels match the actual parameter names, which helps prevent future coding mistakes but does not fix any active vulnerability.

Lower-priorityfuzz: Return chrono point from ConsumeTime(), Add ConsumeDuration()by MarcoFalke · eeee3755 · Jan 23, 2026 · 4 filesMessage 75 · AdequateInformational 15Details
Commit message · MarcoFalke

fuzz: Return chrono point from ConsumeTime(), Add ConsumeDuration()

A chrono time point is a bit more type-safe than a raw i64.

Also, add a dedicated helper for plain chrono durations.

75/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Mentions testing or verification
Why it was queued
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit is a small internal cleanup of Bitcoin Core's fuzz-testing helpers. It changes a test-only function so it returns a strongly-typed time value instead of a plain integer, and adds a separate helper for time durations. It does not change any production code, network behavior, or wallet logic, and it is not a security fix.

AI review queuedtest: verify node state after restart in assumeutxoby Yash Bhutwala · 5cd57943 · Jan 23, 2026 · 1 fileMessage 100 · StrongInformational 15Details
Commit message · Yash Bhutwala

test: verify node state after restart in assumeutxo

Replace the TODO comment in wallet_assumeutxo.py with actual test
assertions that verify node and wallet behavior after a restart
during assumeutxo background sync.

The new tests verify:
- Two chainstates exist (background validation not complete)
- Background chainstate is still at START_HEIGHT
- Snapshot chainstate has synced to at least PAUSE_HEIGHT
- Wallets cannot be loaded after restart (expected behavior during
background sync because blocks before snapshot are unavailable
for rescanning)
- Wallet backup from before snapshot height cannot be restored

This documents the expected behavior that wallets cannot be loaded
after a node restart during assumeutxo background sync, which is
an important edge case for users to be aware of.

refs #28648

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

This commit only adds new test code to Bitcoin Core's functional test suite. It does not change any production wallet, node, or consensus logic. The new tests document an existing limitation: if a node is restarted while it is still doing the background validation for an assumeutxo snapshot, wallets that need older blocks cannot be loaded until the background sync finishes. This is a test-only change that records expected behavior, not a fix for a security bug.

Lower-prioritysubprocess: Fix `-Wunused-private-field` for `Child` class on Windowsby Hennadii Stepanov · 1b36bf0c · Jan 23, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Hennadii Stepanov

subprocess: Fix `-Wunused-private-field` for `Child` class on Windows

When compiling with clang-cl on Windows, `src/util/subprocess.h` emits
`-Wunused-private-field` warnings about unused private fields in the
`Child` class.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a straightforward compiler warning fix. It wraps a Windows-only unused class and its friend declaration in conditional compilation so that clang-cl on Windows stops complaining about private fields that are never used. There is no functional change to how the program behaves.

Lower-prioritysubprocess: Fix `-Wunused-private-field` for `Popen` class on Windowsby Hennadii Stepanov · 9f2b338b · Jan 23, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Hennadii Stepanov

subprocess: Fix `-Wunused-private-field` for `Popen` class on Windows

When compiling with clang-cl on Windows, `src/util/subprocess.h` emits
`-Wunused-private-field` warnings about unused private fields in the
`Popen` class.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
AI analysis · Informational 15/100

This commit is a minor compiler warning fix. It moves a private class field inside a non-Windows-only section of code so that the Windows compiler no longer complains about an unused variable. There is no functional change and no security relevance.

Lower-prioritydoc: Explain that low-effort pull requests may be closedby MarcoFalke · fa15a8d2 · Jan 23, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · MarcoFalke

doc: Explain that low-effort pull requests may be closed

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 updates the project's contribution guidelines (CONTRIBUTING.md). It adds text telling contributors they must understand and test their own changes, and that low-effort or untested pull requests may be closed. There are no code changes and no security relevance.

Lower-prioritytest: allow overriding tar in get_previous_releasesby fanquake · be2b48b9 · Jan 23, 2026 · 1 fileMessage 87 · StrongInformational 17Details
Commit message · fanquake

test: allow overriding tar in get_previous_releases

Facilitate use on distros that might have 'tar' as something else, such
as 'gtar', i.e Chimera.

87/100 · StrongMessage clarity
✓ Specific, 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 17/100

This is a tiny test-only change that lets developers choose a different 'tar' program (for example 'gtar') via an environment variable when running test setup scripts. It does not touch Bitcoin's network code, wallet, consensus rules, or any production software. There is no security issue here.

AI review queuedwallet, test: update `gethdkeys` functional testby rkrux · 43c528ab · Jan 23, 2026 · 1 fileMessage 78 · AdequateInformational 15Details
Commit message · rkrux

wallet, test: update `gethdkeys` functional test

Update the `test_ranged_multisig` test case to verify the partial
xprv fix in the `gethdkeys` RPC. Also, update some existing variable
names.

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 only changes a test file. It updates an existing functional test for the gethdkeys RPC to verify a previously fixed bug where private extended keys (xprv) were incorrectly returned for keys that did not belong to the wallet. There are no changes to production wallet code, so this does not introduce or fix a live security issue on its own.

Security candidatewallet: fix `gethdkeys` RPC for descriptors with partial xprvsby rkrux · 6e3a0afc · Jan 23, 2026 · 1 fileMessage 78 · AdequateLow 33Details
Commit message · rkrux

wallet: fix `gethdkeys` RPC for descriptors with partial xprvs

A non-watch-only wallet allows to import descriptors with partial
private keys, eg: a multisig descriptor with one private key and
one public key. In case an xpub is imported in any such descriptors
whose private key the wallet doesn't have, then the `gethdkeys` RPC
throws an unhandled error like below when the private keys are
requested.

This fix ensures that such calls are properly handled by conditionally
finding the corresponding xprv. Some related documentation of this RPC
is also updated.

```
➜ bitcoincli -named gethdkeys private=true
error code: -1
error message:
map::at: key not found
```

78/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Names security-relevant behavior explicitly
Why it was queued
secret or key materialsigning or wallet path
AI analysis · Low 33/100

This commit fixes a bug in Bitcoin Core's `gethdkeys` RPC command. The command can crash with an unhandled 'key not found' error when a user requests private key information for a wallet that contains descriptors where some extended public keys (xpubs) do not have corresponding private keys in the wallet. The fix prevents the crash by only trying to return the private key when the wallet actually has it, and it updates the related documentation to clarify that the descriptor string shown is the public version.

AI review queuedRemove unused epochguard.hby Suhas Daftuar · 40735450 · Jan 23, 2026 · 1 fileMessage 35 · OpaqueInformational 15Details
Commit message · Suhas Daftuar

Remove unused epochguard.h

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 simply deletes an unused header file, epochguard.h, from the Bitcoin Core source code. The file provided a helper class for tracking graph traversal 'epochs' in the memory pool, but nothing in the codebase was using it anymore. Removing dead code does not change any running behavior and is not a security fix.

Lower-priorityRework CTxMemPool::GetChildren() to not use epochsby Suhas Daftuar · 1a8494d1 · Jan 23, 2026 · 3 filesMessage 83 · StrongInformational 18Details
Commit message · Suhas Daftuar

Rework CTxMemPool::GetChildren() to not use epochs

This is likely slightly slower, but this was the last place we were using
epochs instead of sets to deduplicate, and this is only used by the RPC code
and in tests, and should not be CPU-performance critical. Eliminating this
allows us to save 8 bytes in CTxMemPoolEntry.

Co-Authored-By: Pieter Wuille <bitcoin-dev@wuille.net>

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 18/100

This commit is a small internal cleanup in Bitcoin Core's memory pool (mempool) code. It replaces a fast but complex deduplication trick ('epochs') with a simpler, slightly slower approach using sorting. The change saves 8 bytes per mempool entry and removes unused code. There is no indication this fixes a security bug; it appears to be ordinary maintenance/refactoring.

AI review queuedscripted-diff: refactor: CWallet::Create() -> CreateNew()by David Gumberg · db2effac · Jan 22, 2026 · 4 filesMessage 83 · StrongInformational 15Details
Commit message · David Gumberg

scripted-diff: refactor: CWallet::Create() -> CreateNew()

Aside from being more legible, changing the name of `CWallet::Create()`
also validates that every instance where a new wallet is `Create()`'ed
is handled in this branch.

-BEGIN VERIFY SCRIPT-
sed -i 's|\bCreate(|CreateNew(|g' src/wallet/wallet.cpp src/wallet/wallet.h src/wallet/test/util.cpp src/wallet/test/wallet_tests.cpp
-END VERIFY SCRIPT-

83/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
Why it was queued
defensive validationsigning or wallet pathsecond-pass: near security thresholdsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This commit is a simple rename of a wallet creation function from CWallet::Create() to CWallet::CreateNew(). It does not change what the code does, only its name. There is no security issue here.

AI review queuedrefactor: Wallet stats logging in its own functionby David Gumberg · bc690704 · Jan 22, 2026 · 2 filesMessage 77 · AdequateInformational 15Details
Commit message · David Gumberg

refactor: Wallet stats logging in its own function

This will avoid repetition when wallet creation and loading are
separated.

77/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides an explanatory body
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 moves three existing wallet logging lines into a new helper function called LogStats(). There is no change to what is logged, no change to security behavior, and no bug fix.

AI review queuedrefactor: Split out wallet argument loadingby David Gumberg · b15a94a6 · Jan 22, 2026 · 2 filesMessage 80 · StrongInformational 15Details
Commit message · David Gumberg

refactor: Split out wallet argument loading

This section is necessarily repetitive, makes CWallet::Create() easier
to read, and splits out functionality that will be useful when wallet
creation and loading are separated.

Review with `-color-moved=dimmed-zebra`

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope✓ Provides detailed explanatory context
Why it was queued
signing or wallet pathsecond-pass: security-sensitive path
AI analysis · Informational 15/100

This is a code cleanup change that moves wallet command-line argument parsing into a separate helper function. It does not change what arguments are accepted, how they are validated, or any wallet behavior. There is no security issue visible in the change.