Recorded fork experiment / isolated regtest

BLAKE2b fork rehearsal

One shared history, two validators, and the signature that separates their spending rules.

Published by HabibitcoinEvidence verified: 2026-09-11T23:41:45.652ZMethod: automated byte and node checksP2WPKH only
This is a recorded, isolated regtest experiment. It is not default Signet, a live network replay, or a service for splitting mainnet coins.

Observed acceptance matrix

Exact recorded transactionSighashBitcoin Core 29.0.0Bitcoin Knots 29.4.1
Core ordinary signature replayed on Knots0x01AcceptedAccepted
Knots -walletoldsigs ordinary signature replayed on Core0x01AcceptedAccepted
Ordinary signature on the unified comparison outpoint0x01AcceptedAccepted
Knots ALL|UNIFIED signature offered to Core0x21RejectedAccepted
Opt-in byte added without re-signing0x21RejectedRejected
Opt-in byte removed without re-signing0x01RejectedRejected

The selector replays recorded responses; it does not submit a transaction to a node.

Knots ALL|UNIFIED signature offered to Core

Bitcoin Core

Rejected: signature does not authorize this spend under Core's rules.

Bitcoin Knots

Accepted under the activated fork rules.

020000000112555420ab19c088b6c38204211be098c79818d74f8d376b5da9d7eae3f359be0200000000fdffffff01b882010000000000160014751e76e8199196d454941c45d1b3a323f1433bd600000000

The recorded fork

Shared tipHeight 104
Same pre-fork output100,000 sats
Core / SHA256d branchOriginal output unspent
Knots / BLAKE2b branchUnified spend confirmed
  1. Height 0: Two fresh regtest validators, networking disabled
  2. Height 102: Three 100,000-sat P2WPKH outputs created in shared history
  3. Height 104: Identical shared tip and unspent outpoints verified on both nodes
  4. Height 105: Core SHA256d and Knots BLAKE2b branches diverge
  5. Height 105: Ordinary replay succeeds in both directions; unified signature accepted only by Knots
  6. Height 106: Unified spend confirmed by Knots; original outpoint remains unspent on Core

The verifier fed the same pre-fork blocks to both nodes and checked their shared tip and unspent outputs. It then activated the Knots test fork at height 105. The unified spend was confirmed on Knots at height 106, while the original output remained unspent on Core.

Same transaction, different witness

The ordinary and unified comparison spends have identical non-witness transaction bytes and the same txid. Their signatures and witness transaction identifiers differ. Bitcoin Core and the activated Knots implementation calculate different signed messages for the unified case.

SignatureHash constructionRecorded digest
ALL, 0x01SHA256dc20de8428f5c92c65f2748b47736e0305a99a28a4a5a3311dc0dad09bac7c853
ALL | UNIFIED, 0x21Tagged SHA256, UnifiedSighash16e8390a1d7e9623ef8485aeb25fb7ee6d511bea4b661661fa77f1f59e9ac080

The fork's proof-of-work change and its signature-message change are separate mechanisms. The unified signature uses tagged SHA256 here, not BLAKE2b. Merely editing the flag byte does not produce a valid new signature: both flag-tampering cases were rejected by both validators.

Ordinary transaction bytes
0200000000010112555420ab19c088b6c38204211be098c79818d74f8d376b5da9d7eae3f359be0200000000fdffffff01b882010000000000160014751e76e8199196d454941c45d1b3a323f1433bd60247304402206c5ae81c6f5a58ce7739a04f8ddc870150755208ddca068ede6ffd74c9f473ee022032f68e0c0b928cfd8870fd436299d186258d3d18f6108c31fcbcfe57787c467c01210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179800000000
Unified transaction bytes
0200000000010112555420ab19c088b6c38204211be098c79818d74f8d376b5da9d7eae3f359be0200000000fdffffff01b882010000000000160014751e76e8199196d454941c45d1b3a323f1433bd602473044022022268ff8842bad8fb4244534484b9c7552c8dddd2ea3a0b236f2688a77b9690a022041c47289b04205d99b26aa7c215e7f2b1022b52b23b16a11bd905d34e5b994c421210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179800000000

Policy is not activation

The test found an important boundary: Knots admitted the unified transaction to its mempool while activation was scheduled, but rejected an explicit block containing it before the activation height. Mempool policy and block validity must be recorded separately.

Unified signature accepted at height 103 because activation is scheduled. Explicit block containing the unified signature rejected at candidate height 104.

Reproduce this run

node scripts/verify-fork.mjs
node scripts/verify-fork.mjs --check

The source bundle includes the verifier and its public records. The verifier downloads pinned official macOS ARM64 archives, checks their SHA-256 hashes, creates fresh regtest datadirs with peer networking disabled, and stops and removes them afterward. Node.js and Python 3 are required. Release PGP signatures were not independently authenticated.

Source and test bundle · Recorded results · Exact transactions, blocks, and RPC evidence

Limits

  • Only the exact recorded P2WPKH test transactions were exercised.
  • No real chain sync, P2P relay, default Signet, mainnet, or wallet coin-splitting service was tested.
  • Regtest activation height, headline and RDTS expiry are explicit test overrides, not mainnet parameters.
  • Fixed public demo key 1 is unsafe for any real funds. No user keys or existing wallets are read.
  • Official HTTPS archive checksums are pinned; release PGP signatures were not independently authenticated.
  • The verifier currently pins macOS arm64 binaries and requires Node.js plus Python 3.

Primary sources