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.