RB
← All projectsRust Bitcoin

rust-bitcoin

Rust library for Bitcoin data structures, serialization, consensus encoding, and scripts.

BitcoinCryptographic librariesNormal
Repository coverage

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

532security candidates511second-pass queue2206AI analyses
133commits · 30 days
267commits · 60 days
1103commits · 180 days
2024commits · 365 days
Backfill bands
Aug 5 → Feb 6787 seen32 candidatesComplete
Feb 6 → Jun 6878 seen53 candidatesComplete
Jun 6 → Jul 6211 seen15 candidatesComplete
Jul 6 → Aug 5184 seen2 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.

66/100 average clarity
510Strong · 80–100
1085Adequate · 60–79
567Thin · 40–59
151Opaque · 0–39
20security 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.
Andrew Poelstra23179157290
Mitchell Bagot649193645068
Tobin C. Harding41566410063
jrakibi944994068
Nick Johnson19121190060
Jamil Lambert, PhD11919116061
satsfy (Renato Britto)381527066
Fmt Bot331431045
Trevor Arjeski111111069
Shing Him Ng31731056
Martin Habovstiak30628068
Ismail Daif22622050
Analysis record

Published AI watches

Last scanned 59 minutes ago

Moderate 62 AI analysisMessage 100 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6954: units: serialize unsigned amounts as u64

This commit fixes a mismatch in how unsigned Bitcoin amounts were serialized versus deserialized when using certain compact binary formats. Previously, an unsigned amount (like 100 satoshis) was written as a signed number, which caused for…

Data integrity bug: serialized values decode to different numeric values in varint binary formatsRange-check failure: Amount::MAX and large values near the cap fail deserialization after round-tripSerde serialize/deserialize hint mismatch for unsigned amount types
295c9d8aby Andrew Poelstra+66−112 files
No security note in commit
Low 25 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6955: key_expression: preserve master-key invariants in Xpub Arbitrary

This change fixes a bug in test-only code that generates random fake Bitcoin extended public keys (xpubs). Previously, when generating a master xpub (depth 0), the code could pick random values for the parent fingerprint and child number, …

BIP32 master-key invariant violation in generated test dataEncode/decode round-trip failure for generated master xpubsFix aligns Xpub::arbitrary with existing Xpriv::arbitrary behavior
4116ecc6by Andrew Poelstra+35−31 file
No security note in commit
Informational 15 AI analysisMessage 96 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6947: build(deps): bump cargo-bins/cargo-binstall from 1.21.0 to 1.21.1

This commit updates the version of a helper tool (cargo-binstall) used only inside GitHub Actions automation. It is a routine dependency bump by Dependabot and does not change any code that ships to users. There is no indication of a secur…

c1be49cbby Andrew Poelstra+2−22 files
No security note in commit
High 70 AI analysisMessage 100 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6919: Sanitize serde size hints before allocating

This commit fixes a denial-of-service weakness in how the library deserializes lists of Bitcoin data (witnesses, amounts, fee rates) from untrusted input. Before the fix, a few bytes of attacker-controlled data could claim a list would con…

Untrusted serde size hint fed directly into Vec::with_capacityPotential memory exhaustion / OOM kill from small malicious inputDenial-of-service vector in deserialization paths
55ddbc0cby Andrew Poelstra+88−105 files
Vendor flagged security relevance
Moderate 60 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6945: bitcoin: handle OP_CODESEPARATOR in legacy

This commit fixes how the Rust Bitcoin library calculates old-style (legacy) transaction signatures when the spending script contains a special opcode called OP_CODESEPARATOR. Previously the library did not handle this opcode at all, which…

Protocol correctness fix for legacy sighash serializationOP_CODESEPARATOR handling added to match Bitcoin Core consensus behaviorPreviously omitted test vectors restored, indicating prior non-compliance
5b815281by Andrew Poelstra+600−3093 files
No security note in commit
Informational 15 AI analysisMessage 96 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6948: build(deps): bump taiki-e/install-action from 2.83.2 to 2.85.4

This is a routine update by Dependabot to the version of a third-party GitHub Action used in the project's automated testing workflows. The change only affects internal continuous integration (CI) scripts, not the actual Bitcoin library co…

d1431904by Andrew Poelstra+2−22 files
No security note in commit
Low 33 AI analysisMessage 100 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6946: Fix integer overflow in `get_array`

This commit fixes a small but real bug in a Rust helper that reads fixed-size chunks from a data slice. The helper was supposed to safely return 'nothing' when asked to read past the end of the data, but it accidentally added two numbers t…

Integer overflow in bounds-checking helperContract violation: method documented to return None on out-of-bounds access could panic insteadDebug-build panic (denial of service) possible
c6e80843by Andrew Poelstra+2−11 file
Vendor flagged security relevance
Moderate 62 AI analysisMessage 73 · Adequate
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Fix integer overflow in `get_array`

This commit fixes a bug in a Rust helper method called `get_array`, which is meant to safely read a fixed-size chunk from a slice and return nothing if the requested range is out of bounds. The bug was that the code added the caller's offs…

Integer overflow in bounds calculationPotential panic due to violated internal length expectationCaller-controlled arithmetic used for memory access bounds
56fb1287by Martin Habovstiak+2−11 file
Vendor flagged security relevance
High 71 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6915: primitives: Fix `Witness` handling of oversized items

This commit fixes a bug in how the Rust Bitcoin library counts and compares transaction witness data when a witness contains an oversized item. Previously, several functions relied on an iterator that silently skips oversized items, causin…

Inconsistent serialization/iterator behavior for oversized witness itemswtxid collision risk between transactions differing only in oversized witness bytesIncorrect witness equality for oversized single-item stacks
e1ed5884by Andrew Poelstra+106−273 files
Vendor flagged security relevance
Informational 19 AI analysisMessage 100 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6922: Use `try_fold` instead of `fold` in `Sum` impl

This is a code-quality and performance improvement, not a security fix. It changes how the library adds up lists of Bitcoin amounts so that it stops early once an overflow is detected, rather than continuing to process the rest of the list…

No security-relevant signal in commit message or diffRefactor preserves overflow-checking behavior (short-circuits instead of continuing)New API method `NumOpResult::from_result` is a pure inverse of existing `into_result`
86e4d5daby Andrew Poelstra+60−562 files
No security note in commit
Moderate 52 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6893: units: Reject malformed amount strings

This update fixes a bug in how the library reads Bitcoin amount strings like '1.5 BTC'. Previously, certain malformed inputs such as '.', '._', '1_', '1_.0', and '1._0' were incorrectly accepted and treated as valid amounts (often zero), i…

Input validation bypass in amount parserMalformed strings silently parsed as zero or ordinary amountsUnderscore separator placement not enforced
fcb14622by Andrew Poelstra+88−343 files
Vendor flagged security relevance
Low 48 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6921: units: fix div_by_fee_rate_ceil precision

This commit fixes a rounding bug in how the rust-bitcoin library calculates the minimum transaction weight needed to pay a given fee at a given fee rate. The old code rounded the fee rate up too early, which could produce a weight slightly…

Incorrect fee-weight calculation due to premature integer roundingPotential transaction fee shortfall when using div_by_fee_rate_ceilOverflow protection added for Amount::MAX * 4_000_000 intermediate value
b31212e0by Andrew Poelstra+38−82 files
No security note in commit
Informational 15 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6898: Release tracking PR: `consensus-encoding 1.3.0`

This is a routine release-management commit that bumps the version number of the `bitcoin-consensus-encoding` crate from 1.2.0 to 1.3.0 and updates lock files accordingly. It contains no code changes that fix or introduce a security issue.…

0cfc7908by Andrew Poelstra+37−349 files
No security note in commit
Informational 15 AI analysisMessage 96 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6909: build(deps): bump actions/labeler from 6.2.0 to 7.0.0

This commit updates a GitHub Actions automation tool (actions/labeler) used to automatically tag pull requests with labels. It is a routine dependency version bump from 6.2.0 to 7.0.0, with no indication of a security fix or vulnerability.…

4ed7c068by Andrew Poelstra+1−11 file
No security note in commit
Informational 15 AI analysisMessage 96 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6910: build(deps): bump actions/checkout from 7.0.0 to 7.0.1

This commit is a routine update to the GitHub Actions checkout tool used by the project's automated workflows. It only changes version numbers in configuration files and does not alter the actual Bitcoin library code that users run. There …

328c4ae9by Andrew Poelstra+37−3717 files
No security note in commit
Informational 15 AI analysisMessage 100 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6911: build(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0

This commit updates a GitHub Actions helper used to install a Python tool called uv, which runs the zizmor security scanner. The change only bumps the pinned version of the helper from 8.3.2 to 9.0.0. The new version's release notes mentio…

No security-relevant signals in commit or upstream release notesDependency bump in CI only, not in library codeNo CVE or advisory referenced
67600795by Andrew Poelstra+2−22 files
No security note in commit
Informational 15 AI analysisMessage 96 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6912: build(deps): bump github/codeql-action/upload-sarif from 4.37.0 to 4.37.3

This is a routine Dependabot update that changes the pinned version of GitHub's official CodeQL upload-sarif action from 4.37.0 to 4.37.3 in a single CI workflow. The action only uploads static analysis results to GitHub; it does not touch…

b51cec63by Andrew Poelstra+1−11 file
No security note in commit
Informational 15 AI analysisMessage 91 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6913: build(deps): bump dtolnay/rust-toolchain from 6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772 to 02cb101ec7c40f2c49e1d9714d64511d8e1b74de

This is a routine update to a GitHub Actions helper used to install Rust during automated testing. It only changes the pinned version of the dtolnay/rust-toolchain action in workflow files. There is no change to the actual rust-bitcoin lib…

90330d15by Andrew Poelstra+8−84 files
No security note in commit
Informational 20 AI analysisMessage 100 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

Merge rust-bitcoin/rust-bitcoin#6906: consensus_encoding, primitives: expose exact encoding size for block and transaction

This commit adds a way to ask, in advance, exactly how many bytes a Bitcoin block or transaction will take when serialized. It is a feature addition for the library's encoding system, not a fix for a vulnerability. There is no indication i…

No security-relevant signals in commit message or diffFeature addition: expose exact encoded sizeNo mention of vulnerability, CVE, bug bounty, or security report
1a365d53by Andrew Poelstra+129−1068 files
No security note in commit
Informational 15 AI analysisMessage 88 · Strong
RB Rust Bitcoinrust-bitcoin BitcoinCryptographic libraries

build(deps): bump dtolnay/rust-toolchain

This is a routine update by Dependabot that changes which version of a popular GitHub Action (dtolnay/rust-toolchain) is used to install Rust in automated CI workflows. The commit only updates pinned commit hashes in workflow files; it doe…

a31e0b0eby dependabot[bot]+8−84 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.

Security candidatehashes: Add optimized ARM SHA256d for 64-byte inputby jrakibi · c37ab856 · Mar 23, 2026 · 1 fileMessage 73 · AdequateInformational 16Details
Commit message · jrakibi

hashes: Add optimized ARM SHA256d for 64-byte input

Add the three transforms for sha256(sha256(64_bytes))

Transforms 1 & 2 compute the inner `sha256(64_bytes)`:

- Transform 1: 64 bytes already fill the first block (no
padding needed), so we apply 64 rounds of compression
normally.
After T1: state = state + initial_state

- Transform 2: the message schedule at this step is constant
and known in advance (64 bytes of padding), so
we precompute W[i]+K[i] into MIDS and apply 64 rounds (no
schedule expansion needed).
After T2: state = state + saved_T1_state
(state now contains sha256(64_bytes))

- Transform 3 computes sha256(output_of_T1_and_T2). The output
is 32 bytes, so the block contains 32 bytes and the rest is
known padding. we precompute the message
schedule for the known words (w8-w15) into FINS.
After T3: state = state + initial_state
(state now contains the sha256d result)

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
cryptography-sensitive path
AI analysis · Informational 16/100

This commit adds a new, highly optimized way to compute a double SHA-256 hash on 64-byte inputs for 64-bit ARM processors (aarch64) using special CPU instructions. It is a pure performance improvement and does not change any public APIs or fix any known bug. There is no indication in the commit that it addresses a security vulnerability.

Lower-prioritytest(p2p): Update deser tests for `AddrV2Payload`by rustaceanrob · cbfdb804 · Mar 23, 2026 · 1 fileMessage 67 · AdequateInformational 15Details
Commit message · rustaceanrob

test(p2p): Update deser tests for `AddrV2Payload`

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 only adds new unit tests for serializing and deserializing Bitcoin peer-to-peer address messages. It does not change any production code, fix a bug, or alter behavior. There is no security relevance.

Lower-priorityp2p: Implement `encoding` traits for `AddrV2Payload`by rustaceanrob · 514f36b0 · Mar 23, 2026 · 1 fileMessage 65 · AdequateInformational 17Details
Commit message · rustaceanrob

p2p: Implement `encoding` traits for `AddrV2Payload`

Vector counterpart of the previous commit.

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

This commit adds standard encoding and decoding support for a new P2P network message container (AddrV2Payload). It is a routine, vector-counterpart follow-up to a previous commit and does not appear to fix or introduce any security issue on its own.

Lower-priorityp2p: Implement `encoding` traits for `AddrV2Message`by rustaceanrob · 22b4c73f · Mar 23, 2026 · 1 fileMessage 81 · StrongLow 27Details
Commit message · rustaceanrob

p2p: Implement `encoding` traits for `AddrV2Message`

Member of `AddrV2Payload` which is ultimately apart of
`NetworkMessage`.

Some non-zero number of clients advertise services outside of 32 bits of
precision, which requires decoding arbitrarily large compact sizes. As
these integers do not represent collection lengths and will not be used
for allocation, this is acceptable.

ref: https://github.com/bitcoin/bitcoin/blob/4d7d5f6b79d4c11c47e7a828d81296918fd11d4d/src/protocol.h#L332
ref: https://github.com/bitcoin/bitcoin/issues/34768

81/100 · StrongMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Links an issue, advisory, or supporting reference
AI analysis · Low 27/100

This commit adds encoding and decoding support for a Bitcoin peer-to-peer network address message type (AddrV2Message). It changes how the 'services' field is decoded so it can accept very large numbers sent by some real Bitcoin nodes, instead of being limited to 32-bit values. The commit message says this is safe because the value is not used to allocate memory. There is no direct evidence in the commit that this fixes a security vulnerability, but handling unexpectedly large input values is a common place where bugs can occur.

Security candidatekey: Rename PrivateKey::public_key to to_public_keyby Mitchell Bagot · d97484c4 · Mar 23, 2026 · 3 filesMessage 73 · AdequateInformational 20Details
Commit message · Mitchell Bagot

key: Rename PrivateKey::public_key to to_public_key

The public_key function on PrivateKey converts the key into a matching
PublicKey. Since this function is not a getter but a conversion
function, it should use the {to_,as_,into_} naming scheme. In this
case, to_public_key matches the naming used for the equivalent function
on the Keypair type.

Rename PrivateKey::public_key function to to_public_key, deprecating
the old function name.

73/100 · AdequateMessage clarity
✓ Specific, descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
cryptography-sensitive pathsigning or wallet path
AI analysis · Informational 20/100

This commit is a routine API cleanup: it renames a method on the PrivateKey type from public_key to to_public_key and keeps the old name as a deprecated alias. It does not change what the code does, only how callers spell the function name. There is no security bug being fixed.

AI review queuedconsensus_encoding: Error on byte-less end for VecDecoderby Mitchell Bagot · 4d6e7554 · Mar 23, 2026 · 1 fileMessage 73 · AdequateModerate 51Details
Commit message · Mitchell Bagot

consensus_encoding: Error on byte-less end for VecDecoder

In the existing encoding, Vec<T> would error when attempting to decode
an empty byte slice (i.e. one without a length prefix). In the new
consensus_encoding crate, a VecDecoder successfully decodes a
completely empty byte slice as 0 length Vec<T>. This difference in
behaviour manifests in various decoders throughout the stack and thus
results in differences in decoding behaviour.

Throw Eof error in VecDecoder::end() if no length prefix has been
provided to the decoder.

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

This commit fixes a behavioral mismatch in a new Bitcoin data-decoding library. Previously, the new decoder would silently accept an empty byte slice as an empty list, while the older code rejected it because it lacked a length prefix. The change makes the new decoder reject empty inputs too, preventing subtle parsing differences that could affect how transactions or network messages are interpreted across versions.

AI review queuedprimitives: Update API filesby Mitchell Bagot · da3f0930 · Mar 23, 2026 · 3 filesMessage 35 · OpaqueInformational 15Details
Commit message · Mitchell Bagot

primitives: Update API files

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

This commit only updates generated API snapshot files that list what public types and functions exist in the rust-bitcoin 'primitives' crate. No actual source code was changed, and nothing in the commit message or diff suggests a security fix or vulnerability. It is a routine housekeeping change.

Lower-priorityUpdate api.rs test filesby Mitchell Bagot · 75aa7122 · Mar 23, 2026 · 2 filesMessage 83 · StrongInformational 15Details
Commit message · Mitchell Bagot

Update api.rs test files

In order to reduce the change of regressions, the presence of the
Default impl and new on all decoder types should be checked in the api
test files for units and primitives.

Update api.rs test files in primitives and units to verify the presence
of Default impl and new function on all decoders.

83/100 · StrongMessage clarity
✓ Subject identifies a change✓ Names a concrete action or component✓ Provides detailed explanatory context✓ Explains rationale or failure mode✓ Mentions testing or verification
AI analysis · Informational 15/100

This commit only adds new test code to check that certain 'decoder' types can be created with a default value and a `new()` function. It does not change any production code, fix a bug, or alter behavior. There is no security issue here.

AI review queuedprimitives: Add Default and new to all decodersby Mitchell Bagot · 9804591b · Mar 23, 2026 · 2 filesMessage 80 · StrongInformational 15Details
Commit message · Mitchell Bagot

primitives: Add Default and new to all decoders

In order to simplify composition of decoder types, the Default trait
and new() function should be provided for all decoder types.

Add Default and new to BlockDecoder, HeaderDecoder, TxInDecoder and
TxOutDecoder.

80/100 · StrongMessage clarity
✓ 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 · Informational 15/100

This commit adds convenient ways to create certain Bitcoin data decoders (Default and new()) in the rust-bitcoin library. It does not change how data is parsed or validated, and there is no indication it fixes or introduces a security problem.

Security candidatehashes: use Rust-like syntax in hash type macrosby Jamil Lambert, PhD · 8b91b42f · Mar 23, 2026 · 11 filesMessage 45 · ThinInformational 15Details
Commit message · Jamil Lambert, PhD

hashes: use Rust-like syntax in hash type macros

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

This commit is a purely cosmetic refactor of how hash types are declared in the rust-bitcoin library. It changes the internal macro syntax from a custom list of numbers and flags to something that looks more like ordinary Rust code. There is no change to the actual hashing behavior, output, or public API.

Security candidate2026-03-22 automated rustfmt nightlyby Fmt Bot · 508986dc · Mar 22, 2026 · 76 filesMessage 45 · ThinInformational 15Details
Commit message · Fmt Bot

2026-03-22 automated rustfmt nightly

45/100 · ThinMessage clarity
✓ Descriptive subject✓ Names a concrete action or component! No meaningful explanatory body
Why it was queued
cryptography-sensitive pathsigning or wallet pathparser or protocol path
AI analysis · Informational 15/100

This is a routine automated code-formatting commit. It only changes whitespace, import order, line wrapping, and other stylistic details produced by the rustfmt tool. There are no functional changes, bug fixes, or security-related modifications.

Lower-priorityp2p: Convert encoders to ExactSizeEncoderby Mitchell Bagot · 3f238239 · Mar 21, 2026 · 9 filesMessage 68 · AdequateInformational 15Details
Commit message · Mitchell Bagot

p2p: Convert encoders to ExactSizeEncoder

With the recent introduction of p2p encoder types, various new encoders
have been implemented with encoder_newtype. Since encoder_newtype_exact
provides a strict superset of functionality on the encoder type, it
should be preferred where possible.

Replace uses of encoder_newtype with encoder_newtype_exact where the
wrapped encoder type can be trivially determined as an exact size.

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 internal code cleanup in the rust-bitcoin peer-to-peer networking module. It swaps a general-purpose macro for a more specific one when building message encoders, because the newer macro can do everything the old one does and more. There is no user-facing behavior change and no security fix.

AI review queuedprimitives: Convert encoders to ExactSizeEncoderby Mitchell Bagot · 35c6e004 · Mar 21, 2026 · 3 filesMessage 68 · AdequateInformational 19Details
Commit message · Mitchell Bagot

primitives: Convert encoders to ExactSizeEncoder

For encoders, the use of the encoder_newtype_exact macro allows for the
implementation of the ExactSizeEncoder trait. This provides users with
the ability to determine the encoding length of types without needing
to perform the entire encoding process. The TxIn and TxOut encoders in
primitives can be made ExactSizeEncoders but are currently not.

Replace uses of encoder_newtype with encoder_newtype_exact for TxIn and
TxOut encoder types.

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: security-sensitive path
AI analysis · Informational 19/100

This is a routine library improvement that lets users ask 'how many bytes will this transaction input/output take up when encoded?' without actually encoding it. It adds a length method to two encoder types by switching to a macro that supports exact-size encoders. There is no security bug being fixed and no indication this change addresses any vulnerability.

Lower-priorityAutomated update to Github CI to rustc nightly-2026-03-20by Update Nightly Rustc Bot · e9524c66 · Mar 21, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Update Nightly Rustc Bot

Automated update to Github CI to rustc nightly-2026-03-20

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

This commit simply updates the version of the Rust nightly compiler used by the project's automated GitHub CI tests from one weekly nightly build to the next. It changes only a single version string in a configuration file. There is no code change, no bug fix, and no security-relevant behavior change.

Lower-priorityAutomated update to Github CI to cargo-semver-checks version-0.47.0by Update cargo-semver-checks Bot · 9a9a9f47 · Mar 21, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Update cargo-semver-checks Bot

Automated update to Github CI to cargo-semver-checks version-0.47.0

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 simply bumps the version number of a CI linting tool (cargo-semver-checks) used in GitHub Actions from 0.46.0 to 0.47.0. It changes one line in a workflow configuration file and has no effect on the actual Bitcoin library code, runtime behavior, or security.

AI review queuedinternals, hashes, primivties: clean up optional depsby Nick Johnson · cecf021c · Mar 20, 2026 · 3 filesMessage 85 · StrongInformational 15Details
Commit message · Nick Johnson

internals, hashes, primivties: clean up optional deps

If you use the `dep:OPTIONAL_DEP` syntax in a package's feature, then
the implicit feature flag for the optional dependency is disabled. No need
to tell end users to avoid it.

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
second-pass: broader security terminology
AI analysis · Informational 15/100

This commit is a routine cleanup of how optional dependencies are declared in three Rust package configuration files. It changes feature flags to use the modern `dep:` syntax and updates comments to be clearer. There is no change to actual program logic, no security fix, and no vulnerability.

Lower-priorityAutomated update to Github CI to rustc stable-1.94.0by Update Stable Rustc Bot · 918ef120 · Mar 20, 2026 · 1 fileMessage 50 · ThinInformational 15Details
Commit message · Update Stable Rustc Bot

Automated update to Github CI to rustc stable-1.94.0

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

This commit simply updates a single version number in a CI configuration file from Rust compiler version 1.93.1 to 1.94.0. It changes no application code, no cryptographic logic, and no user-facing behavior. There is no security relevance.

Lower-priorityUpdate the API text filesby Tobin C. Harding · 2a7b0168 · Mar 19, 2026 · 1 fileMessage 45 · ThinInformational 15Details
Commit message · Tobin C. Harding

Update the API text files

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 updates a generated text file that lists the public API surface of the crate. No actual source code, logic, or behavior changed. It is a documentation/tracking update, not a security fix or functional change.

Lower-priorityImplement serde functions in as_consensusby Tobin C. Harding · 129c7acf · Mar 19, 2026 · 5 filesMessage 80 · StrongInformational 17Details
Commit message · Tobin C. Harding

Implement serde functions in as_consensus

Add a module for serde stuff and add a sub-module that provides
implementations of the `serde` traits by way of consensus encoding.

Update the `serde` example in `bitcoin` to use the new logic instead
of the old consensus encoding stuff.

Note that the code in `bitcoin::consensus::serde` is a bit more
complicated than what is added here. I _think_ that is because of
having to handle the I/O error in the old consensus code.

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

This commit adds a new helper module that lets Rust Bitcoin types be serialized and deserialized using Bitcoin's standard binary encoding, exposed through the popular serde serialization framework. It is a feature/refactoring change: it introduces a cleaner way to get the same behavior that previously required more verbose code. There is no indication in the commit that it fixes a security bug or vulnerability.

Security candidateIntroduce WifKey for private keys with networkby Mitchell Bagot · 2f7b79b6 · Mar 19, 2026 · 8 filesMessage 68 · AdequateInformational 17Details
Commit message · Mitchell Bagot

Introduce WifKey for private keys with network

In bitcoin, the PrivateKey type holds a secp SecretKey, a
compressedness flag and a NetworkKind. The NetworkKind field is only
ever used when converting to/from a WIF key string. Since a PrivateKey
can (or will) be usable for functions beyond just WIF import/export, it
is necessary to remove the dependence on network for the key type.

Introduce WifKey which holds a PrivateKey and a NetworkKind.
Remove network field from PrivateKey.
Replace uses of PrivateKey involving WIF logic with WifKey.

68/100 · AdequateMessage clarity
✓ Descriptive subject✓ Names a concrete action or component✓ Provides detailed explanatory context
Why it was queued
secret or key materialcryptography-sensitive pathsigning or wallet path
AI analysis · Informational 17/100

This commit is a routine API refactor in the rust-bitcoin library. It splits the old PrivateKey type into two parts: a simpler PrivateKey that only stores the secret key and compression flag, and a new WifKey type that pairs a PrivateKey with a Bitcoin network for WIF import/export. The change removes the network field from PrivateKey and moves WIF-specific parsing, serialization, and formatting onto WifKey. There is no security fix here; it is a design cleanup to make the key types more general-purpose.

Security candidateRemove private key from create-p2wpkh-address exampleby Mitchell Bagot · d6b18416 · Mar 19, 2026 · 1 fileMessage 78 · AdequateInformational 15Details
Commit message · Mitchell Bagot

Remove private key from create-p2wpkh-address example

The create-p2wpkh-address example demonstrates how to construct a
P2WPKH address from a secp PublicKey, going through the
CompressedPublicKey type. Currently, it also logs out the private key
required to spend from that address. Since the example is to
demonstrate address construction, the private key is not needed.

Remove the private key logging from the create-p2wpk-address example.

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 material
AI analysis · Informational 15/100

This commit removes a line from a code example that printed a randomly-generated private key. The example now only prints the Bitcoin address. It is a documentation/example cleanup, not a fix for a software vulnerability in the library itself.

AI review queuedRe-export serde and arbitrary when they appear in public APIby Mitchell Bagot · e59a0040 · Mar 19, 2026 · 7 filesMessage 85 · StrongInformational 19Details
Commit message · Mitchell Bagot

Re-export serde and arbitrary when they appear in public API

In various crates, we have types from external crates in the public
APIs, such as serde's Serialize or arbitrary's Arbitrary. In order to
simplify dependency handling, we should re-export these crates which
have types appearing in the public API.

Add pub extern crate for serde and arbitrary in bitcoin, network, p2p,
units and primitives as needed.

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
second-pass: broader security terminology
AI analysis · Informational 19/100

This change makes two helper libraries (serde and arbitrary) publicly visible from several rust-bitcoin crates. It is a dependency-management convenience for downstream developers and does not fix or introduce any security vulnerability.

Lower-priorityprimitives: Replace double alloc in script formatting with iteratorsby Mitchell Bagot · 51267c03 · Mar 19, 2026 · 1 fileMessage 73 · AdequateInformational 15Details
Commit message · Mitchell Bagot

primitives: Replace double alloc in script formatting with iterators

In Script in primitives, the to_hex_string_prefixed function uses a
double allocation to first encode the script to a vector, before
converting it to a hex string. With the changes to EncodableByteIter,
the first vector allocation can be entirely bypassed in favour of the
iterator.

Replace vector allocation in to_hex_string_prefixed with
EncodableByteIter.

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

This is a routine performance cleanup, not a security fix. It removes an unnecessary intermediate memory allocation when converting a Bitcoin script to a hex string by using an iterator directly. There is no change to behavior, parsing, validation, or cryptographic handling.

Lower-priorityconsensus_encoding: Allow ?Sized for EncodableByteIterby Mitchell Bagot · a180da82 · Mar 19, 2026 · 4 filesMessage 73 · AdequateInformational 15Details
Commit message · Mitchell Bagot

consensus_encoding: Allow ?Sized for EncodableByteIter

The EncodableByteIter currently takes any Sized Encodable and yields
bytes in an iterator. While useful, the Sized bound makes this more
restrictive than the other helper functionality in consensus_encoding
like encode_to_vec, which all explicitly permit ?Sized encodables.

Loosen trait bound for EncodableByteIter generic to accept ?Sized
encodable types.

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

This change relaxes a Rust type-system restriction so a particular byte-iterator helper can work with trait objects and slices, not just fixed-size types. It is a routine API ergonomics improvement with no security relevance visible in the commit.

Lower-priorityExclude RFC7539 tests from chacha20_poly1305_fuzz buildsby Abeeujah · b8fe28bb · Mar 18, 2026 · 3 filesMessage 83 · StrongInformational 15Details
Commit message · Abeeujah

Exclude RFC7539 tests from chacha20_poly1305_fuzz builds

The rfc7539 and related tests `new_from_block` require the
implementation to be spec-compliant. However under the
`chacha20_poly1305_fuzz` cfg flag, the `apply_keystream` is a no-op
that leaves ciphertext unmodified.

This intentional deviation from the RFC causes these specific tests
to fail. Gating them prevents false positives in
`--cfg=chacha20_poly1305_fuzz` builds.

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
fuzzing or regression evidence
AI analysis · Informational 15/100

This commit only changes test code. It adds a configuration gate so that certain cryptography specification tests are skipped when the code is built with a special fuzzing flag. The fuzzing flag intentionally disables encryption to make fuzz testing easier, which naturally causes those spec-compliance tests to fail. There is no change to production code and no security vulnerability is being fixed.