Skip to content
Back to skills

Release Engineering

ASecurity

Bitcoin Core release engineering: Guix reproducible builds, signed release tarballs, deterministic outputs, code-signing keys, the release process, security disclosure. USE WHEN: building Bitcoin Core from source for verification, understanding release security, contributing to consensus-critical code.

  • 31 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 8, 2026
ai-agentsrustgobashnodegitsecurity

Security analysis

A100/100

Scanned September 22, 2026

npx -y skills add claude-dev-suite/claude-dev-suite --skill release-engineering --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Release Engineering?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Release Engineering
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/claude-dev-suite-release-engineering/badge)](https://www.skillsdirectory.com/skills/claude-dev-suite-release-engineering)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: bitcoin-core-release-engineering
disable-model-invocation: true
description: |
  Bitcoin Core release engineering: Guix reproducible builds, signed
  release tarballs, deterministic outputs, code-signing keys, the
  release process, security disclosure.
  USE WHEN: building Bitcoin Core from source for verification,
  understanding release security, contributing to consensus-critical code.
allowed-tools: Read, Grep, Glob
---

# Bitcoin Core Release Engineering

Bitcoin Core ships **reproducible builds**: anyone with the source
+ Guix can produce byte-identical binaries to the official release.
This protects against supply-chain attacks targeting the build server.

## Guix reproducible builds

[GNU Guix](https://guix.gnu.org/) is the deterministic build environment.

```bash
# In bitcoin/ source directory
./contrib/guix/guix-build
```

Outputs:
- `guix-build-<version>/output/x86_64-linux-gnu/bitcoin-<version>-x86_64-linux-gnu.tar.gz`
- (and per other platforms via cross-compile)

The hash of these tarballs is what gets signed by maintainers.

## guix.sigs

Repository: `github.com/bitcoin-core/guix.sigs`. The Guix build runs in
two stages and each stage gets its own attestation, so after each
release trusted builders publish two signed hash files:
```
<version>/<builder-name>/noncodesigned.SHA256SUMS      # stage 1: built from source
<version>/<builder-name>/noncodesigned.SHA256SUMS.asc
<version>/<builder-name>/all.SHA256SUMS                # stage 2: + code signatures
<version>/<builder-name>/all.SHA256SUMS.asc
```

Stage 2 attaches the Windows/macOS detached code signatures distributed
from `bitcoin-core/bitcoin-detached-sigs`. `all.SHA256SUMS` covers every
binary uploaded to the website and is what release downloads should be
checked against (guix.sigs README, as of September 2026).

Verifying a release: download official binaries, compute SHA256,
compare to entries from N independent builders. If they all match,
no single builder could have introduced malware.

## Release signing keys

As of Bitcoin Core v22.0 releases are signed by a set of builder keys
published in the **guix.sigs** repository, one file per signer:
```
github.com/bitcoin-core/guix.sigs → builder-keys/<signer>.gpg
```

The old `contrib/builder-keys/keys.txt` in `bitcoin/bitcoin` is gone —
it shipped through v24.0 and was removed in November 2022 (commit
`e6864fa1`, "contrib: remove builder keys"). The path 404s on `master`
and on every tag from v25.0 onward (checked September 2026).

Publication does have thresholds. `doc/release-process.md` (as of
September 2026) gates the upload step on "6 or more people [having]
guix-built and their results match", and the Windows/macOS detached
code signatures are only produced "once the Windows and macOS builds
each have 3 matching signatures". Those numbers bind the release
managers. They are not a verification rule for you — downstream you
still pick which builder keys to trust and how many matching
signatures to demand.

Core ships the supported one-command path, `contrib/verify-binaries/verify.py`:
```bash
# download SHA256SUMS(.asc) + binaries, check sigs then hashes
./contrib/verify-binaries/verify.py pub 31.1

# fetch unrecognised builder keys automatically
./contrib/verify-binaries/verify.py --import-keys pub 31.1

# demand more attestations than the default of 3
./contrib/verify-binaries/verify.py --min-good-sigs 10 pub 31.1
```

Builders rotate keys and the signer set changes between releases; read
`builder-keys/` as of the version you are verifying, not an old copy.

## Release process (high level)

1. **Feature freeze** — typically ~1 month before scheduled release.
2. **Release branch** — `NN.x` branched off `master` (e.g. `31.x`).
3. **Release candidates** (`rc1`, `rc2`, ...).
4. **Backports** — bug fixes flow from master to release branches.
5. **Final tag** — signed git tag.
6. **Guix builds** — multiple builders produce binaries.
7. **guix.sigs PR** — builders publish signed hashes.
8. **Release announcement** — per `doc/release-process.md` (as of
   September 2026): the bitcoin-dev and bitcoin-core-dev mailing lists,
   the Bitcoin Core announcements list
   (<https://bitcoincore.org/en/list/announcements/join/>) and the
   project's social account. A bitcoincore.org blog post and the
   maintained-versions table are updated in the same pass.

## Source verification

To verify a downloaded tarball before building:
```bash
# Get GPG keys
gpg --keyserver hkps://keys.openpgp.org --recv-keys <maintainer-fingerprint>

# Verify
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS
```

## Code-signing for binaries

- macOS: signed via Apple's developer cert (so Gatekeeper accepts it).
- Windows: code-signed with EV certificate.
- These signatures are **separate** from the GPG signatures and
  protect against OS-level "untrusted publisher" warnings, not
  against tampering of the source tarball itself.

For Linux: no platform-level signing (rely on Guix + GPG).

## Hash verification on first run

`bitcoind` does NOT self-verify on each run. The integrity check is
done at install time:
```bash
sha256sum bitcoin-31.1-x86_64-linux-gnu.tar.gz
# compare to entries in SHA256SUMS
```

## Security disclosure

`security@bitcoincore.org` for security issues.
Embargoed disclosures: maintainers coordinate fixes across exchanges,
miners, services before public release.

Process documented in `SECURITY.md` of the repo.

Medium- and High-severity advisories are published about two weeks
after the last affected version goes EOL, so the public CVE list lags
the fix by a long way (Low severity is disclosed two weeks after the
fixed major ships; Critical is handled ad hoc). Policy as of September
2026 — see <https://bitcoincore.org/en/security-advisories/>.
CVE-2024-52911 (High; use-after-free — a background script-check thread
could read the precomputed transaction data after it was destroyed;
affects 0.14.0 through 28.x) was reported 2024-11-02, fixed in 29.0
(April 2025) and disclosed 2026-05-05, just over two weeks after 28.x
went EOL on 2026-04-19. So "no advisory against this major" is not
evidence it is safe. For the resulting version floor see
[operations/SKILL.md](../operations/SKILL.md),
"Security advisories and minimum safe version".

## Vulnerability scoring

Bitcoin uses ad-hoc severity classification:
- **Critical**: consensus split, theft, DoS that crashes nodes.
- **High**: privacy leak, low-cost DoS.
- **Medium / Low**: bugs without immediate fund impact.

Past vulnerabilities like CVE-2018-17144 (inflation bug) → fixed
silently before public disclosure.

## Branch policy

- `master` — current development.
- `NN.x` — one maintenance branch per major version.
- Backport criteria: bugfix only, no features. Documented exception:
  consensus rule changes ship first in a maintenance release (22.2,
  23.1, …) so the changeset stays small and reviewable.
- Maintenance window: the latest **three** major versions. When a new
  major is released the oldest falls out and becomes End of Life; EOL
  lines do not generally receive security fixes. Majors are targeted
  every 6 months, so a line is maintained for roughly 18 months — not a
  fixed calendar period.
- As of September 2026: latest release **31.1 (2026-07-08)**, with
  maintenance releases 30.3 and 29.4 (both 2026-07-10). Maintained lines
  are **29.x, 30.x and 31.x**; 28.x (EOL 2026-04-19) and older are not.
  `32.x` is branched for the in-flight v32.0 (`v32.0rc1` tagged
  2026-09-14); when v32.0 ships, 29.x goes EOL.
- The schedule moves every ~6 months — read it from
  <https://bitcoincore.org/en/lifecycle/> rather than trusting the list
  above.

## Common confusions

- "Bitcoin Core" vs "Bitcoin" — Bitcoin Core is one implementation.
  Others (Bitcoin Knots, btcd) exist but Bitcoin Core is the
  reference and runs on ~81–83% of public nodes (Coin Dance 82.9%,
  21,361 of 25,766; Bitnodes ~81%, 21,497 of 26,556; both 2026-09-16) —
  a large majority, not the whole network. See
  [knots/SKILL.md](../knots/SKILL.md) for the split.
- **Pre-release builds** from PRs are NOT trusted; only tagged
  releases.
- Guix builds for **non-reproducible** components (system libraries
  like libc) require Guix to be set up correctly; cross-platform
  reproducibility is maintained via Guix's bootstrap chain.

## See also

- [rpc/SKILL.md](../rpc/SKILL.md)
- [knots/SKILL.md](../knots/SKILL.md)
- [operations/SKILL.md](../operations/SKILL.md)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…