BT
← All projectsbtcsuite

btcd

Alternative full-node Bitcoin implementation written in Go.

BitcoinNode implementationsNormal
Repository coverage

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

46security candidates22second-pass queue203AI analyses
10commits · 30 days
10commits · 60 days
147commits · 180 days
204commits · 365 days
Backfill bands
Aug 5 → Feb 621 seen1 candidatesComplete
Feb 6 → Jun 6112 seen7 candidatesComplete
Jun 6 → Jul 634 seen13 candidatesComplete
Jul 6 → Aug 530 seen7 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.

68/100 average clarity
64Strong · 80–100
80Adequate · 60–79
60Thin · 40–59
5Opaque · 0–39
Read the scoring rubric →
Developer activity

Who is changing the project?

Public Git author strings; identities are not independently verified.

DeveloperCommitsCandidatesAnalyzedHigh riskMessage avg.
Boris Nagaev461546160
Olaoluwa Osuntokun651461173
Lrifton92434186
Erick Cestari818177
Or Aharonee404184
Oliver Gugger13413047
MPins333079
Drake Thomsen222091
Eric Grill313086
Jacob Schuler111088
Julio Cesar111045
Kim111045
Analysis record

Published AI watches

Last scanned 28 minutes ago

Informational 12 AI analysisMessage 86 · Strong
BT btcsuitebtcd BitcoinNode implementations

rpcserver: test null getblock verbosity

This commit only adds a new integration test that sends a null value for the optional verbosity parameter of the getblock RPC and checks that the server returns a normal verbose block response. It does not change any production code. The t…

Regression test for a prior RPC server panic (#2600)No production code changes; defensive test coverage only
c130f0bfby Olaoluwa Osuntokun+36−01 file
No security note in commit
Moderate 65 AI analysisMessage 73 · Adequate
BT btcsuitebtcd BitcoinNode implementations

Merge pull request #2600 from allocz/fix_issue_2597

This patch fixes a server crash in btcd's JSON-RPC 'getblock' command. When a caller did not provide an optional 'verbosity' parameter, the code later dereferenced a nil pointer, causing the entire btcd process to panic. The fix supplies a…

nil-pointer dereference panic in RPC handlerdenial-of-service via crafted JSON-RPC requestserver process crash (availability impact)
a3f20384by Olaoluwa Osuntokun+5−11 file
No security note in commit
Moderate 59 AI analysisMessage 58 · Thin
BT btcsuitebtcd BitcoinNode implementations

Merge pull request #2601 from vbrekher/fix/psbt-multi-a-finalizer

This change fixes how btcd finalizes a specific type of Bitcoin Taproot smart contract called multi_a. Previously, the finalizer simply stacked signatures in the order they appeared in the PSBT file. For multi_a contracts, signatures must …

Incorrect witness ordering for multi_a tapscripts could produce invalid Bitcoin transactionsNew parser enforces standard multi_a template and rejects unsupported CHECKSIGADD constructionsDuplicate and non-matching signatures now return ErrInvalidPsbtFormat
ca0bb02cby Olaoluwa Osuntokun+366−93 files
No security note in commit
Informational 12 AI analysisMessage 95 · Strong
BT btcsuitebtcd BitcoinNode implementations

psbt: test multi_a excess signature handling

This commit only adds a new unit test for the PSBT finalizer. It checks that when a Bitcoin Taproot multi-signature (multi_a) input has more valid signatures than required, the finalizer picks exactly the required number and leaves the ext…

26ee1cc8by Olaoluwa Osuntokun+33−01 file
No security note in commit
Informational 12 AI analysisMessage 95 · Strong
BT btcsuitebtcd BitcoinNode implementations

psbt: test multi_a signature input ordering

This commit only adds a new test case to the project's test suite. It does not change any production code. The test verifies that a PSBT (Partially Signed Bitcoin Transaction) finalizer correctly orders signatures for a specific type of Ta…

Regression test for Taproot multi_a signature orderingNo production code changesDefensive guard against incorrect finalizer implementations
709069b9by Olaoluwa Osuntokun+36−131 file
No security note in commit
Informational 15 AI analysisMessage 58 · Thin
BT btcsuitebtcd BitcoinNode implementations

Merge pull request #2580 from Roasbeef/version-bump-v0.26.2

This commit only changes the software version number from v0.26.1-beta.rc1 to v0.26.2-beta. It does not modify any security-related code, network behavior, or user-facing functionality. There is no security issue here.

05585e03by Olaoluwa Osuntokun+2−21 file
No security note in commit
Informational 15 AI analysisMessage 80 · Strong
BT btcsuitebtcd BitcoinNode implementations

build: bump version to v0.26.2-beta

This commit only changes the software version number from v0.26.1-beta.rc1 to v0.26.2-beta. It does not modify any program logic, network code, or security behavior. There is no security issue here.

d9948c49by Olaoluwa Osuntokun+2−21 file
No security note in commit
Informational 15 AI analysisMessage 80 · Strong
BT btcsuitebtcd BitcoinNode implementations

build: bump version to v0.26.1-beta.rc1

This commit only changes the reported software version number from v0.26.0-beta to v0.26.1-beta.rc1. It does not alter any program logic, network behavior, or security-sensitive code. There is no security issue here.

3fa0a65cby Olaoluwa Osuntokun+2−21 file
No security note in commit
Informational 18 AI analysisMessage 78 · Adequate
BT btcsuitebtcd BitcoinNode implementations

version: preserve semantic version separators

This commit fixes a small bug in how the btcd Bitcoin node software cleans up version strings. Previously, dots in pre-release version labels like 'beta.rc1' were accidentally removed, turning them into 'betarc1'. The change adds dots to t…

No security-relevant signals in commit message or diffChange is a string-normalization correctness fixNo input from untrusted network sources is processed by this code path
65db4939by Olaoluwa Osuntokun+20−12 files
No security note in commit
Informational 15 AI analysisMessage 85 · Strong
BT btcsuitebtcd BitcoinNode implementations

build: pin tagged submodules and remove local replacements

This commit is a routine build housekeeping change. It updates two internal Go module dependencies to newly published tagged versions and removes local directory overrides so that everyone builds with the same published code. There is no i…

3d3b5e8aby Olaoluwa Osuntokun+8−82 files
No security note in commit
Informational 15 AI analysisMessage 88 · Strong
BT btcsuitebtcd BitcoinNode implementations

build: bump v2transport to v1.1.0

This commit only updates a dependency version number in the project's Go module file. It bumps the v2transport package from version 1.0.1 to 1.1.0 so that downstream projects building btcd as a module can access new handshake admission API…

8d902916by Olaoluwa Osuntokun+1−11 file
No security note in commit
Informational 12 AI analysisMessage 83 · Strong
BT btcsuitebtcd BitcoinNode implementations

rpcclient: harden DisableAuth transport tests

This commit only changes tests and clarifies a public comment. It does not alter the actual authentication behavior of the btcd RPC client. The code already only suppresses the internally generated Basic auth header when DisableAuth is tru…

No functional code change; only tests and commentsComment clarification that DisableAuth only suppresses generated Basic auth, not caller-provided Authorization headersTests now cover WebSocket handshake, cookie bypass, and caller-provided headers
52d2fadeby Olaoluwa Osuntokun+186−1272 files
No security note in commit
Informational 15 AI analysisMessage 78 · Adequate
BT btcsuitebtcd BitcoinNode implementations

rpcclient: wrap DisableAuth tests to 80 columns

This commit only reformats an existing test file. It wraps long lines to 80 columns, splits nested code into separate variables, and adjusts whitespace. No production code was changed, and no security behavior is altered.

fe84a0e1by Olaoluwa Osuntokun+83−521 file
No security note in commit
Informational 15 AI analysisMessage 96 · Strong
BT btcsuitebtcd BitcoinNode implementations

rpcclient: add tests for DisableAuth header behavior

This commit only adds new unit tests for an existing feature. It does not change any production code, so it cannot introduce a security vulnerability or fix one directly. The tests verify that an existing option called DisableAuth correctl…

9b849c17by Drake Thomsen+109−01 file
No security note in commit
Informational 21 AI analysisMessage 86 · Strong
BT btcsuitebtcd BitcoinNode implementations

rpcclient: make HTTP Basic Auth optional via DisableAuth

This change adds a new optional setting called DisableAuth to the btcd RPC client. When a user turns it on, the client will not send username/password credentials automatically. This is meant to let users connect to external Bitcoin API se…

New opt-in configuration flag that disables authentication headersDefault behavior unchanged; authentication still required unless user explicitly disables itNo validation added to ensure alternative authentication is present when DisableAuth is true
5d22b395by Drake Thomsen+25−131 file
No security note in commit
Informational 14 AI analysisMessage 83 · Strong
BT btcsuitebtcd BitcoinNode implementations

integration: stabilize pre-verack disconnect cycles

This change only modifies an integration test file. It makes a test more reliable by waiting for a version response and retrying connection attempts, rather than changing any production code that handles real Bitcoin peer connections. Ther…

76ba8842by Olaoluwa Osuntokun+58−191 file
No security note in commit
Low 27 AI analysisMessage 83 · Strong
BT btcsuitebtcd BitcoinNode implementations

server+connmgr: make outbound startup deterministic

This commit fixes a scheduling bug in how a Bitcoin node decides how many automatic outbound peers to connect to at startup. Previously, if a user had configured permanent peers, those permanent peers could grab internal connection IDs bef…

Non-deterministic outbound peer count at startupPermanent peers could consume connection request IDs before automatic counter sampledPotential for fewer automatic outbound peers than configured, reducing network diversity
58ee9ef6by Olaoluwa Osuntokun+157−224 files
No security note in commit
Low 26 AI analysisMessage 68 · Adequate
BT btcsuitebtcd BitcoinNode implementations

config: reject non-positive maxpeers

This commit fixes a configuration bug in btcd, a Bitcoin node implementation. Previously, setting maxpeers=0 caused the node to enter a tight loop: it would repeatedly try to connect to outbound peers and immediately reject them. The chang…

Denial-of-service-like resource exhaustion via tight reconnect loop triggered by a configuration valueInput validation added for a previously unbounded configuration parameterNo memory corruption, authentication bypass, or remote code execution signals present
7e9414faby Olaoluwa Osuntokun+42−23 files
No security note in commit
Informational 12 AI analysisMessage 83 · Strong
BT btcsuitebtcd BitcoinNode implementations

integration: synchronize p2p lifecycle stress batches

This commit changes only test code. It tightens up an integration test that simulates many fake Bitcoin peers connecting and disconnecting from a node, and makes a small cleanup in a unit test for closing network pipes. There is no change …

No production code changedTest-only synchronization improvementsNo authentication, cryptography, consensus, or network handling logic modified
5a2c5063by Olaoluwa Osuntokun+217−202 files
No security note in commit
Low 48 AI analysisMessage 78 · Adequate
BT btcsuitebtcd BitcoinNode implementations

v2transport: restore responder handshake progress

This commit fixes a deadlock risk in btcd's new Bitcoin v2 transport handshake. Previously, the responder waited until it had received the initiator's full 64-byte key before doing any work, which could cause both sides to sit waiting for …

BIP324 handshake deadlock avoidanceCPU admission lease split to prevent resource exhaustion / lock holding across network I/OResponder now sends key material before full initiator key is received
09717871by Olaoluwa Osuntokun+231−862 files
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-priorityblockchain: add bestHeader to BlockChainby Calvin Kim · 5f25cf0d · Feb 25, 2026 · 2 filesMessage 80 · StrongInformational 15Details
Commit message · Calvin Kim

blockchain: add bestHeader to BlockChain

We add a chainview of bestHeaders so that we'll be able to keep track of
headers separately from the bestChain. This is needed as we're getting
headers for new block annoucements instead of invs.

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

This commit adds a new internal bookkeeping structure called bestHeader to btcd's blockchain tracking. It mirrors the existing bestChain view but is intended to track headers separately from full blocks. There is no visible security fix or vulnerability being patched; it appears to be preparatory refactoring for a later change in how new blocks are announced.

Lower-priorityblockchain: add statusHeaderStored for blockNode statusby Calvin Kim · b60c2c30 · Feb 25, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Calvin Kim

blockchain: add statusHeaderStored for blockNode status

Since we may now have blockNodes with just the block header stored
without the data, we add a new status to account for this.

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

This commit simply adds a new bookkeeping flag and a helper method to track whether a block header has been stored on disk. It does not change any security-sensitive behavior, fix a bug, or alter how data is validated. There is no indication this is a security patch.

Lower-priorityblockchain: add maybeAcceptHeaderby Calvin Kim · fd16786b · Feb 25, 2026 · 1 fileMessage 58 · ThinInformational 12Details
Commit message · Calvin Kim

blockchain: add maybeAcceptHeader

maybeAcceptHeader performs checks to accept block headers into the
header chain. This function allows for a true headers-first download
where we only accept block headers for downloading new blocks.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
AI analysis · Informational 12/100

This commit adds a new internal function to btcd that accepts block headers into a separate 'header chain' before downloading full blocks. It is a feature/refactoring change for a 'headers-first' download mode. There is no indication in the commit that it fixes a security bug or introduces a vulnerability; it appears to be normal protocol implementation work.

Lower-priorityblockchain: add ErrKnownInvalidBlock error codeby Calvin Kim · 743d0a2c · Feb 25, 2026 · 2 filesMessage 72 · AdequateInformational 15Details
Commit message · Calvin Kim

blockchain: add ErrKnownInvalidBlock error code

Distinguish between a block that has itself failed validation
versus one that is only invalid due to an ancestor.

72/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides an explanatory body✓ Explains rationale or failure mode
AI analysis · Informational 15/100

This commit only adds a new error code constant and its string mapping in the blockchain package. It does not change any validation logic, network behavior, or how blocks are accepted or rejected. By itself, it cannot introduce or fix a security issue.

Lower-priorityserver: address review feedback on peer lifecycle handlingby Or Aharonee · f6d69f7a · Feb 18, 2026 · 1 fileMessage 85 · StrongLow 40Details
Commit message · Or Aharonee

server: address review feedback on peer lifecycle handling

Prioritize verAckCh in peerLifecycleHandler select to avoid
nondeterministic peerAdd skipping when both channels are ready.

Guard OnVerAck against double-close by checking the channel before
closing, logging an error instead of panicking.

Adjust peerLifecycleEvent comment to reflect that peerAdd may be
skipped when the peer disconnects before or concurrently with verack.

Fix verAckCh field comment formatting.

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

This commit fixes two internal timing bugs in how btcd manages peer connections during the Bitcoin handshake. It prevents a peer-registration step from being accidentally skipped when handshake messages arrive at the same time as a disconnect, and it stops the server from crashing if a peer somehow sends its final handshake acknowledgment twice. These are robustness fixes rather than obvious remote-attack paths, but they remove conditions that could destabilize a node.

Lower-priorityserver: serialize peer lifecycle via single goroutineby Or Aharonee · ce913598 · Feb 16, 2026 · 3 filesMessage 83 · StrongModerate 69Details
Commit message · Or Aharonee

server: serialize peer lifecycle via single goroutine

Address review feedback on the peer add/done race fix:

- Make peerLifecycleHandler (renamed from peerDoneHandler) the sole
sender of both peerAdd and peerDone events for each peer. OnVerAck
now closes a signal channel (verAckCh) instead of sending directly,
and peerLifecycleHandler selects on verAckCh vs peer.Done() to
decide whether to send peerAdd before peerDone. This guarantees
ordering by construction: a single goroutine sends both events
sequentially, eliminating the negotiateTimeout race window.

- Add Done() method to peer.Peer exposing the quit channel read-only,
enabling select-based disconnect detection from server code.

- Remove the now-unused AddPeer method.

- Address style feedback: 80-char line limit, empty lines between
switch cases, break long function calls, use require.GreaterOrEqualf
instead of if+Fatalf, bump syncRaceConcurrency to 300 for
backpressure testing, add TestPreVerackDisconnect for disconnect
prior to verack.

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

This commit is a follow-up fix for a race condition in how btcd adds and removes peers. The previous fix tried to ensure that when a peer connects and quickly disconnects, the 'peer added' and 'peer done' notifications are always seen in the right order by the sync manager. This commit makes that guarantee stronger by having a single goroutine handle both events, instead of two separate code paths. It also adds tests that demonstrate the bug could corrupt sync manager state and prevent the node from syncing.

Lower-priorityserver: fix peer add/done race between peerHandler and syncManagerby Or Aharonee · 091b7901 · Feb 16, 2026 · 2 filesMessage 85 · StrongHigh 73Details
Commit message · Or Aharonee

server: fix peer add/done race between peerHandler and syncManager

peerDoneHandler ran as a separate goroutine per peer and independently
notified both peerHandler (via donePeers channel) and the sync manager
(via syncManager.DonePeer) about a peer disconnect. Because these two
sends were unsynchronized, the sync manager could observe DonePeer
before NewPeer when a peer connected and disconnected quickly. This
caused the sync manager to log "unknown peer", then later register the
already-dead peer as a sync candidate that was never cleaned up,
potentially leaving it stuck with a dead sync peer.

Two structural changes eliminate the race:

1. Merge the newPeers and donePeers channels into a single
peerLifecycle channel. Since OnVerAck (add) always fires before
WaitForDisconnect returns (done), a single FIFO channel guarantees
peerHandler always processes add before done for a given peer,
removing the select-ambiguity where Go could pick done first.

2. Move the syncManager.DonePeer call and orphan eviction from
peerDoneHandler into handleDonePeerMsg, which runs inside
peerHandler. All sync manager peer lifecycle notifications now
originate from the single peerHandler goroutine and flow into
sm.msgChan in guaranteed add-before-done order.

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

This commit fixes a race condition in btcd, a Bitcoin node implementation. When a peer connected and disconnected very quickly, the node could tell its block-syncing component that the peer left before it ever told it the peer arrived. That left the syncer believing a dead peer was still its active sync partner, so the node could stop syncing new blocks from real peers. The fix funnels all peer add/remove events through one ordered channel so the syncer always sees arrival before departure. A new integration test demonstrates the bug by bombarding a node with handshake-then-disconnect connections and then checking whether it still syncs blocks.

AI review queuedbtcec/schnorr: fix nonce generation commentsby Erick Cestari · 3a0df885 · Jan 15, 2026 · 1 fileMessage 68 · AdequateInformational 15Details
Commit message · Erick Cestari

btcec/schnorr: fix nonce generation comments

The comments in schnorrSign and Sign incorrectly stated that CustomNonce
triggers RFC6979 nonce generation. The actual behavior is the opposite:

- With CustomNonce: BIP-340 compliant nonce derivation (steps 6-8)
- Without CustomNonce (default): RFC6979 deterministic nonce generation

Also fixes typo "set 14" -> "step 14".

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

This commit only fixes documentation comments in the code. It corrects a description about which nonce-generation method is used when a custom nonce option is provided. No actual signing logic or behavior was changed, so there is no security risk from this patch itself.

Lower-prioritybuild: bump version of Go container for release buildsby Olaoluwa Osuntokun · 7d4da229 · Jan 13, 2026 · 1 fileMessage 62 · AdequateInformational 15Details
Commit message · Olaoluwa Osuntokun

build: bump version of Go container for release builds

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

This commit simply updates the version of the Go programming language used to build release binaries inside a Docker container, from Go 1.22.11 to Go 1.23. There is no code change, no bug fix, and no security patch visible in the diff. It is a routine build-maintenance change.

AI review queuedfix spelling errorby Jameson Lopp · d3615dcc · Dec 25, 2025 · 1 fileMessage 28 · OpaqueInformational 15Details
Commit message · Jameson Lopp

fix spelling error

28/100 · OpaqueMessage clarity
✓ Subject identifies a change! No meaningful explanatory body
Why it was queued
second-pass: opaque commit message
AI analysis · Informational 15/100

This commit fixes a typo in a log message only: 'alloacting' is corrected to 'allocating'. There is no functional code change, no security fix, and no behavior change.

Lower-priorityregtest: align activations with Bitcoin Coreby Boris Nagaev · cd4e5426 · Dec 25, 2025 · 8 filesMessage 90 · StrongLow 28Details
Commit message · Boris Nagaev

regtest: align activations with Bitcoin Core

Set regtest buried heights to match Core: BIP34/65/66 at height 1 and make
CSV/SegWit/Taproot always active. Added regtest coverage for header version
floors, coinbase height enforcement, and deployment state to ensure we now
reject the blocks Core rejects and accept the ones Core accepts.

Updated package fullblocktests to generate BIP34-compliant blocks.

Test helpers now set prev block height to 0 (not the default -1) so generated
blocks start at height 1 and satisfy coinbase height rules.

90/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
AI analysis · Low 28/100

This commit changes btcd's regression test network (regtest) rules so they match Bitcoin Core's behavior. It makes several Bitcoin protocol upgrades active from block 1 instead of being delayed or inactive. The change is primarily about test-network compatibility and does not appear to be a security fix for main Bitcoin production networks. It adds tests to confirm regtest now rejects old-style blocks and accepts modern ones, just like Core does.

Lower-priorityblockchain: make BIP30 enforcement logic testableby Boris Nagaev · 29d105bb · Dec 24, 2025 · 2 filesMessage 78 · AdequateInformational 14Details
Commit message · Boris Nagaev

blockchain: make BIP30 enforcement logic testable

Upcoming commits tweak the conditions under which the expensive BIP30
duplicate-coinbase check should run. To unit-test those changes, this
commit moves the decision logic out of BlockChain.checkConnectBlock and
into a dedicated helper, bip0030CheckNeeded. The behaviour is unchanged;
the new helper is covered by tests in bip30_test.go.

78/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Mentions testing or verification
AI analysis · Informational 14/100

This commit is a pure code cleanup and test-addition change. It moves an existing decision about when to run an expensive Bitcoin rule check into a new helper function, without changing when the check runs. It also adds unit tests for that helper. There is no security fix or behavior change.

Lower-priorityblockchain: fix overly eager BIP30 bypassby Boris Nagaev · 6803c625 · Dec 24, 2025 · 2 filesMessage 86 · StrongModerate 59Details
Commit message · Boris Nagaev

blockchain: fix overly eager BIP30 bypass

Bitcoin Core PR https://github.com/bitcoin/bitcoin/pull/12204 tightened BIP30
handling: re-enable the check once height 1,983,702 is reached.

This change ports that logic into btcd and adds a regression test.

86/100 · StrongMessage clarity
✓ 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
fuzzing or regression evidence
AI analysis · Moderate 59/100

This update fixes a rule in btcd (a Bitcoin implementation) that was skipping an expensive duplicate-check too early. The change re-enables that duplicate check once the blockchain reaches height 1,983,702, matching a safeguard already added to Bitcoin Core. Without the fix, a carefully crafted block could potentially reuse an old coinbase transaction ID after BIP34 is active, which could cause nodes to disagree on the state of coins. The patch includes a regression test.

Lower-priorityblockchain: run BIP30 if we are on non-BIP34 forkby Boris Nagaev · 5baa6387 · Dec 24, 2025 · 3 filesMessage 76 · AdequateHigh 72Details
Commit message · Boris Nagaev

blockchain: run BIP30 if we are on non-BIP34 fork

Mirror BIP34-aware BIP30 skip logic from Bitcoin Core.

PR https://github.com/bitcoin/bitcoin/pull/6931 in Bitcoin Core introduced
an optimization that skips the expensive BIP30 duplicate coinbase check once
BIP34 is active *and* the chain actually contains the recorded activation block.
See the comment in that PR "//Only continue to enforce if we're below BIP34
activation height or the block hash at that height doesn't correspond."

btcd used to drop the check purely based on height. On a fork that lacks the
BIP34 activation block, that difference lets a duplicate coinbase slip through
consensus. This patch ports the missing pieces: we store the activation hash in
chain parameters and only disable BIP30 after we see that block on-chain.

76/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI analysis · High 72/100

This commit fixes a subtle consensus bug in btcd, a Bitcoin implementation. BIP30 prevents two blocks from having the same special 'coinbase' transaction ID, and BIP34 makes duplicate coinbase IDs practically impossible once it activates. btcd was skipping the BIP30 check based only on block height, but on an alternate chain that has not actually activated BIP34 at that height, a duplicate coinbase could slip through. The fix mirrors Bitcoin Core by also checking that the known BIP34 activation block hash is present on the current chain before disabling BIP30.

Lower-priorityblockchain: run BIP30 check at BIP0034Heightby Boris Nagaev · f7dd09f5 · Dec 24, 2025 · 2 filesMessage 76 · AdequateModerate 60Details
Commit message · Boris Nagaev

blockchain: run BIP30 check at BIP0034Height

Sync the behaviour with Bitcoin Core.

See https://github.com/bitcoin/bitcoin/pull/6931

In Core, the BIP30 flag is cleared only if the previous block's ancestor chain
already contains the BIP34 activation block. For the activation block itself
(height = BIP0034Height), pindex->pprev->GetAncestor(BIP34Height) returns
nullptr, so the flag stays on and BIP30 is still enforced. In other words, Core
enforces BIP30 for the activation block and skips it starting with the following
block.

76/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI analysis · Moderate 60/100

This commit fixes a subtle off-by-one bug in btcd's blockchain validation. BIP30 is a rule that prevents duplicate coinbase transactions, which could otherwise allow an attacker to overwrite existing Bitcoin funds. BIP34 later made duplicate coinbases impossible by requiring unique block heights in coinbase data. btcd was skipping the BIP30 duplicate check starting exactly at the BIP34 activation block, but Bitcoin Core still runs the BIP30 check for that one activation block. The change aligns btcd with Core by moving the skip point one block later, so the duplicate-coinbase check is still enforced at the BIP34 activation height.

Lower-prioritytreap, ffldb: change Put() to take in multiple key-value pairsby Calvin Kim · e0091247 · Nov 14, 2025 · 4 filesMessage 85 · StrongInformational 18Details
Commit message · Calvin Kim

treap, ffldb: change Put() to take in multiple key-value pairs

Previously, the Put() function took in a single key-value pair,
resulting in memory allocation overhead as the intermediary treapNodes
got allocated and immediately garbage collected, resulting in
performance loss due to the garbage collection overhead.

We're able to recycle the intermediary treapNodes allocated by taking in
multiple key-value pairs. This results in better performance of the
node especially during UTXO cache flushes.

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 18/100

This commit is a performance optimization, not a security fix. It changes the database cache's treap (a type of search tree) so that it can insert many key-value pairs in one batch instead of one at a time. The goal is to reduce memory allocation and garbage collection overhead when flushing the UTXO cache. There is no indication in the commit message or diff that this fixes a security vulnerability.

Lower-prioritytreap: add recycle() method on treapNodeby Calvin Kim · 0e95ae38 · Oct 30, 2025 · 1 fileMessage 60 · AdequateInformational 15Details
Commit message · Calvin Kim

treap: add recycle() method on treapNode

The recycle method resets and puts the treapNode into the treapNodePool
to be recycled at a future date.

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

This commit adds a small helper method that clears a data structure node and returns it to an internal memory pool for reuse. It is a routine performance/memory-management change with no visible security implications.

Lower-prioritytreap: return newly created treapNodes in put()by Calvin Kim · 65d39687 · Oct 30, 2025 · 1 fileMessage 80 · StrongInformational 14Details
Commit message · Calvin Kim

treap: return newly created treapNodes in put()

The newly created treapNodes in put() are now returned so that the
caller has access to them. This is done so that the caller can put back
some of the treapNodes to sync.Pool.

For multiple put operations, an immutable treap will allocate many
treapNodes that will immediately be garbage collected. Let's say
there's 3 key-value pairs that are going to be inserted:

key 1: 50
key 2: 10
key 3: 4

Then the insertion is like so:

1: allocate 50.

50

2: clone 50, allocate 10.

50
/ \
10

3: clone 50, clone 10, allocate 4

50
/ \
10
/
4

In this example, only the nodes allocated during insertion of (3) is
going to be used. The rest is going to be garbage collected and they
can be safely be put in the sync.Pool if there's a guarantee that the
previous copies are not being accessed. This is true if the put
operations are going to be called in batches.

By returning the pointers of these allocated treapNodes, we allow the
caller to make such optimizations.

80/100 · StrongMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode
AI analysis · Informational 14/100

This commit is a performance optimization for an internal data structure (a treap, a type of tree used in btcd's database). It changes the private put() function to return pointers to newly created nodes so that future callers can recycle them through a sync.Pool, reducing memory allocations. The public Put() method ignores these returned nodes, so behavior is unchanged. There is no security fix or vulnerability patch here.

Lower-priorityrpcclient: ensure http dial respects timeoutby Matt Leon · 582b999f · Oct 29, 2025 · 1 fileMessage 68 · AdequateLow 37Details
Commit message · Matt Leon

rpcclient: ensure http dial respects timeout

Ensure that the dial phase of rpcclient's HTTP posts respects the http.Client's Timeout. It was instead falling back to the OS settings.

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

This commit fixes a bug in btcd's RPC client where network connection attempts ignored the configured timeout and could hang for a very long time (relying on the operating system's default limits). The fix makes the dial operation respect the context and timeout that the HTTP client already carries. It is a reliability and availability improvement rather than a direct theft-of-funds bug, but long-hanging connections can be abused to exhaust client resources or stall dependent services.

Lower-prioritybuild: bump version to v0.25by Olaoluwa Osuntokun · 798b4ed4 · Oct 27, 2025 · 1 fileMessage 57 · ThinInformational 15Details
Commit message · Olaoluwa Osuntokun

build: bump version to v0.25

57/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope! No meaningful explanatory body
AI analysis · Informational 15/100

This commit simply changes a version label from 'beta.rc1' to 'beta' in a single source file. It is a routine release-version bump with no security relevance.

AI review queuedmusig2: add combinedNonce getterby sputn1ck · 21eb99e3 · Oct 13, 2025 · 2 filesMessage 35 · OpaqueInformational 15Details
Commit message · sputn1ck

musig2: add combinedNonce getter

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 adds a new public getter method called CombinedNonce to the MuSig2 signing session in btcd. It simply lets callers read the already-computed combined public nonce, returning an error if it isn't ready yet. There is no change to cryptographic logic, no bug fix, and no security-relevant behavior.

AI review queuedmusig2: add Session.RegisterCombinedNonceby sputn1ck · 8f54cc6e · Oct 13, 2025 · 2 filesMessage 58 · ThinInformational 17Details
Commit message · sputn1ck

musig2: add Session.RegisterCombinedNonce

This commit adds a new function to musig2.Session, which allows the caller
to add an external aggregated nonce to the session.

58/100 · ThinMessage clarity
✓ Descriptive subject✓ Provides detailed explanatory context
Why it was queued
second-pass: broader security terminology
AI analysis · Informational 17/100

This commit adds a new public method called RegisterCombinedNonce to the MuSig2 multi-signature code in btcd. It lets a signing session accept an already-aggregated public nonce from an external coordinator, instead of requiring each signer to collect every individual nonce itself. The change is a feature addition with explicit safety checks: it rejects registering a combined nonce twice, rejects mixing combined-nonce and individual-nonce registration on the same session, validates the nonce parses as two valid public keys, and preserves the existing one-sign-per-session nonce-reuse guard. Nothing in the commit message or diff suggests a security bug is being fixed; it appears to be a normal API enhancement for coordinator-based signing workflows.

Lower-prioritybuild: bump version to v0.25.0-beta.rc1by Olaoluwa Osuntokun · 31a762b3 · Sep 25, 2025 · 1 fileMessage 57 · ThinInformational 15Details
Commit message · Olaoluwa Osuntokun

build: bump version to v0.25.0-beta.rc1

57/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Uses a recognizable type or scope! No meaningful explanatory body
AI analysis · Informational 15/100

This commit only changes the software version number from v0.24.2-beta to v0.25.0-beta.rc1. It does not modify any program logic, fix bugs, or change security behavior. There is no security relevance in this change.

Lower-prioritytreap: add treapNodePool and fetch from it for cloneTreapNode and newTreapNodeby Calvin Kim · e3d237d3 · Sep 20, 2025 · 2 filesMessage 73 · AdequateInformational 12Details
Commit message · Calvin Kim

treap: add treapNodePool and fetch from it for cloneTreapNode and
newTreapNode

The treapNodePool will allow for less memory allocations during
immutable treap operations. We first change the cloneTreapNode and
newTreapNode to allocate a treapNode from the sync.Pool.

The allocated treapNodes will be put back into the sync.Pool in later
commits.

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

This commit is a routine performance optimization for an internal data structure used in the btcd Bitcoin node. It introduces a memory pool (sync.Pool) to reuse small treapNode objects instead of repeatedly allocating new ones from the garbage collector. There is no security-relevant change here; it only reduces memory pressure and allocation overhead during database operations.

Lower-prioritytreap: refactor the Put() code into exported and unexported versionsby Calvin Kim · 26ef499a · Sep 20, 2025 · 1 fileMessage 65 · AdequateInformational 15Details
Commit message · Calvin Kim

treap: refactor the Put() code into exported and unexported versions

We do this to later add batch put logic into the exported Put()
function.

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

This commit is a simple internal code cleanup. It splits the existing Put() function into a public wrapper and a private helper, with no change to behavior. There is no security issue here.