Inside the MuHash proof

The blockhash-to-MuHash proof, abbreviated BHTM in the project docs, is deliberately narrow. It is not a Bitcoin node, and it does not rebuild the UTXO set from scratch. It receives compact stripped block deltas prepared by a Bitcoin Core-side data source, then proves the MuHash transition over that stream.

What the runner checks for every block

Header hash

Recompute SHA256d(80-byte header) and compare it with the claimed block hash.

Height and previous link

Check height == previous_height + 1 and verify that the header points to the previous block hash.

Transaction commitment

Recompute the txid Merkle root from stripped transaction bytes and compare it with the header's Merkle root.

MuHash update

Apply supplied Bitcoin Core-style coin additions and removals to the accumulator, then append height || block_hash || MuHash.

Why it stays small

The proof runner is streaming and low-storage. It does not store full blocks, keep a Rust HashMap UTXO set, or call Bitcoin Core RPC from inside the guest. The heavy state stays on the data source machine, where Bitcoin Core block data, chainstate, and undo data already live.

curl | tee(hash fifo) | zstd -dc | blockhash-to-muhash job-teed -

The reusable SEV-SNP image receives a canonical job.json at runtime. The attestation binds job_sha256, so public verifiers can pin one image measurement while accepting different Bitcoin chunk jobs. Proof artifacts are uploaded only after the compressed stream hash matches the runtime job.