diff options
| author | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-05 22:46:52 +0000 |
|---|---|---|
| committer | bitflash-maintainer <noreply@bitflash.invalid> | 2026-09-05 22:46:52 +0000 |
| commit | ceae3d076b5ad11ee84729ae43f14e9312896646 (patch) | |
| tree | 7e9132aa871fdc01cb95268d2f5ea3bb11853ddf /docs/release-verification.md | |
| parent | be63e83d79e7e00e6b8ca889a70e6a19886aa1d8 (diff) | |
| parent | 66e0b9158d050c46b1ff2509faeee3f4573cac1c (diff) | |
Bring main onto the line this project actually ships
main had drifted to a history with no ancestor in common with the tree we
build and deploy. It sat at be63e83 (2026-08-09) with 28 commits; the shipped
line, deploy/soak-2026-08-21, had 383. The two shared nothing -- git
merge-base returns no result at all -- so anyone cloning this repository
landed on a default branch that was neither current nor related to the
running node.
The 28 commits on main were audited before this merge: every one is already
present in the tree by content, including the two that are hardest to see
because they were rewritten afterwards -- the payout reorg-safety work
(PayoutBlockStillOnChain, since evolved to re-check on every retry rather
than once at maturity) and the nostr relay certificate verification
(SSL_set1_host, now with a Windows root-store path). Nothing on main is lost
by this merge.
Recorded as a merge rather than a force-push: main only ever moves forward,
its old history stays reachable as the first parent, and this is revertible.
The tree is taken wholesale from the merged branch, so main's content is now
exactly what was built and tested.
What this brings onto main:
- compactblock: BIP152-style compact block relay ported from upstream 1.2.23,
primitives and unit test only, with the RAND_bytes failure path closed and
the reconstruction allocation bounded.
- upstream/main 17741d9: isolated testnet parameters and genesis, optional
2 MB large pages for RandomX. Mainnet genesis verified byte-identical
through upstream's BuildGenesisBlock() refactor.
- deploy: every image built on bookworm so binaries run on Debian 12, and the
container build now honours the RandomX and libsecp256k1 pins it had been
silently ignoring since before 1.2.15.
Gates at this tree: 15/15 selftests, compactblock's 17 checks, consensus
constants unchanged against e4f898c apart from the pre-existing
MAX_BLOCK_SIZE_GEN, mainnet genesis intact, money-log check ok.
Diffstat (limited to 'docs/release-verification.md')
| -rw-r--r-- | docs/release-verification.md | 94 |
1 files changed, 67 insertions, 27 deletions
diff --git a/docs/release-verification.md b/docs/release-verification.md index ecacd5f..b8eaf5e 100644 --- a/docs/release-verification.md +++ b/docs/release-verification.md | |||
| @@ -3,60 +3,100 @@ | |||
| 3 | Bitflash releases publish binaries and a `SHA256SUMS` file. The checksum file | 3 | Bitflash releases publish binaries and a `SHA256SUMS` file. The checksum file |
| 4 | proves that the file you downloaded matches the file the release page names. | 4 | proves that the file you downloaded matches the file the release page names. |
| 5 | A detached signature, `SHA256SUMS.asc`, proves that the checksum file itself was | 5 | A detached signature, `SHA256SUMS.asc`, proves that the checksum file itself was |
| 6 | signed by a trusted release key. | 6 | signed by the Bitflash release key. |
| 7 | 7 | ||
| 8 | That gives users two separate checks: | 8 | That gives users two separate checks: |
| 9 | 9 | ||
| 10 | 1. `gpg --verify SHA256SUMS.asc SHA256SUMS` checks who signed the checksums. | 10 | 1. `gpg --verify SHA256SUMS.asc SHA256SUMS` — who signed the checksums. |
| 11 | 2. `sha256sum -c SHA256SUMS` checks the binaries against those checksums. | 11 | 2. `sha256sum -c SHA256SUMS` — the binaries against those checksums. |
| 12 | 12 | ||
| 13 | ## User Check | 13 | But the first check is only worth something if you require a **specific** key. |
| 14 | A good signature by *some* key proves nothing; anyone can make one. | ||
| 14 | 15 | ||
| 15 | From a shell with `curl` or `wget` and `sha256sum`: | 16 | ## The release signing key |
| 17 | |||
| 18 | ```text | ||
| 19 | fingerprint 910A 2B4C CA87 9E81 FB4B 2AEA 1D4A 53D3 B78A A4B8 | ||
| 20 | uid Bitflash Releases (bitflash.network release signing) | ||
| 21 | <releases@bitflash.network> | ||
| 22 | ``` | ||
| 23 | |||
| 24 | The public key is published at | ||
| 25 | `https://releases.bitflash.network/bitflash-release-key.asc` and embedded in | ||
| 26 | `scripts/verify-release.sh`, so the tool's trust anchor lives in this | ||
| 27 | repository rather than on the server it verifies. | ||
| 28 | |||
| 29 | ## User check | ||
| 30 | |||
| 31 | From a shell with `curl` or `wget`, `sha256sum` and `gpg`: | ||
| 16 | 32 | ||
| 17 | ```bash | 33 | ```bash |
| 18 | scripts/verify-release.sh latest | 34 | scripts/verify-release.sh latest |
| 19 | ``` | 35 | ``` |
| 20 | 36 | ||
| 21 | For a specific release: | 37 | The public release host should expose latest-file aliases for convenience: |
| 22 | 38 | ||
| 23 | ```bash | 39 | ```text |
| 24 | scripts/verify-release.sh v1.2.13 | 40 | https://releases.bitflash.network/SHA256SUMS |
| 41 | https://releases.bitflash.network/SHA256SUMS.asc | ||
| 25 | ``` | 42 | ``` |
| 26 | 43 | ||
| 27 | For release audits, require the signature: | 44 | Those aliases must point at the current versioned directory. They do not replace |
| 45 | signature verification; they only make the common manual path shorter. | ||
| 46 | |||
| 47 | For a specific release: | ||
| 28 | 48 | ||
| 29 | ```bash | 49 | ```bash |
| 30 | scripts/verify-release.sh v1.2.13 --require-signature | 50 | scripts/verify-release.sh v1.2.15 |
| 31 | ``` | 51 | ``` |
| 32 | 52 | ||
| 33 | Older releases may not have `SHA256SUMS.asc`. In that case the script warns and | 53 | The script downloads the release, imports the pinned key into a throwaway |
| 34 | still checks file integrity. New release audits should use `--require-signature`. | 54 | keyring, and **refuses anything that is not a valid signature by the key above** |
| 35 | 55 | before checking the hashes. Releases from before signing was introduced ship | |
| 36 | ## Maintainer Flow | 56 | only `SHA256SUMS`; without `--require-signature` those are checked for integrity |
| 57 | and reported as unsigned. | ||
| 37 | 58 | ||
| 38 | After building release assets in the repository root: | 59 | By hand, if you would rather not run the script: |
| 39 | 60 | ||
| 40 | ```bash | 61 | ```bash |
| 41 | scripts/make-release-checksums.sh --sign --local-user RELEASE_KEY_ID | 62 | curl -O https://releases.bitflash.network/bitflash-release-key.asc |
| 63 | gpg --import bitflash-release-key.asc | ||
| 64 | gpg --verify SHA256SUMS.asc SHA256SUMS # must name the fingerprint above | ||
| 65 | sha256sum -c SHA256SUMS | ||
| 42 | ``` | 66 | ``` |
| 43 | 67 | ||
| 44 | Upload all built assets plus: | 68 | ## Maintainer flow |
| 45 | 69 | ||
| 46 | ```text | 70 | The signing key lives on a dedicated location, not in the build tree. After |
| 47 | SHA256SUMS | 71 | building the release assets in the repository root, write and sign the |
| 48 | SHA256SUMS.asc | 72 | checksums: |
| 73 | |||
| 74 | ```bash | ||
| 75 | sha256sum Bitflash-*.zip Bitflash-*.AppImage bitflash-node-* > SHA256SUMS | ||
| 76 | gpg --armor --detach-sign --output SHA256SUMS.asc SHA256SUMS | ||
| 49 | ``` | 77 | ``` |
| 50 | 78 | ||
| 51 | Keep the private signing key offline or on a dedicated release machine. Publish | 79 | Publish, alongside the assets, `SHA256SUMS` and `SHA256SUMS.asc`, and update |
| 52 | the public key fingerprint in the release notes and keep using the same key for | 80 | `latest.txt` on the releases host to the new tag. Keep using the same key; if it |
| 53 | future releases unless there is a clearly announced rotation. | 81 | is ever rotated, announce the new fingerprint clearly and update the embedded |
| 82 | key in `verify-release.sh`. | ||
| 83 | |||
| 84 | For Windows releases with managed Tor built in, run `make windows-tor`. It | ||
| 85 | creates `Bitflash-*-windows-with-tor.zip` by downloading the Tor Expert Bundle, | ||
| 86 | checking the pinned SHA256 in `scripts/package-windows-tor.sh`, optionally | ||
| 87 | verifying the Tor Project `.asc` signature, and placing `tor/tor.exe` next to | ||
| 88 | `Bitflash.exe`. For release builds, run `TOR_VERIFY_GPG=required make | ||
| 89 | windows-tor` so the signature check is mandatory. Include that zip in | ||
| 90 | `SHA256SUMS` like any other release asset. | ||
| 54 | 91 | ||
| 55 | ## Why This Matters | 92 | ## Why this matters |
| 56 | 93 | ||
| 57 | `SHA256SUMS` alone protects against a broken download, but not against someone | 94 | `SHA256SUMS` alone protects against a broken download, but not against someone |
| 58 | replacing both a binary and the checksum file. Signing `SHA256SUMS` means an | 95 | replacing both a binary and the checksum file. Signing `SHA256SUMS`, and |
| 59 | attacker must also have the release signing key to make the replacement verify. | 96 | requiring a pinned key, means an attacker must also hold the release signing key |
| 97 | to make the replacement verify. Serving from bitflash.network makes this the | ||
| 98 | guarantee that matters: without a pinned key, "trust the site" is the only | ||
| 99 | thing standing behind a download. | ||
| 60 | 100 | ||
| 61 | This is not reproducible builds yet. It is the smaller, immediate step that | 101 | This is not reproducible builds yet. It is the smaller, immediate step that |
| 62 | makes every release asset auditable by users before they run it. | 102 | makes every release asset auditable before anyone runs it. |