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.
| Signature | Hash construction | Recorded digest |
|---|---|---|
ALL, 0x01 | SHA256d | c20de8428f5c92c65f2748b47736e0305a99a28a4a5a3311dc0dad09bac7c853 |
ALL | UNIFIED, 0x21 | Tagged SHA256, UnifiedSighash | 16e8390a1d7e9623ef8485aeb25fb7ee6d511bea4b661661fa77f1f59e9ac080 |
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.