Verification by recomputation without a trusted signer
Every OpenChainGraph artifact carries a SHA-256 execution_hash. The hash covers exactly two members, policy_parameters and output_payload, serialized in canonical JSON form. Paste any artifact below and this page recomputes the hash the same way the worker does, then shows you the bytes: what canonicalization changed, where the preimage boundary sits, and how the artifact chains to its parents through parent_hashes.
๐ All inputs are processed locally in your browser. No data is transmitted. Do not enter real personal data โ use synthetic or anonymised inputs only.
Step 1 ยท Load an artifact
Paste an OpenChainGraph artifact
Paste any OCG artifact JSON, load one from a local file, or start from the bundled teaching fixture and its one-byte tampered twin. Nothing leaves your browser.
Idle. Load an artifact or paste one above.
View 1 ยท Raw versus canonical
What canonical JSON did to the bytes
The hash is never taken over the artifact as you pasted it. Canonicalization (RFC 8785 JCS over the I-JSON subset) sorts object member names by code unit, keeps array order, and emits minimal whitespace. Left: the two hashed members exactly as they appear in the artifact. Right: the canonical string the hash actually sees.
Raw (as written in the artifact)
Canonical (what is hashed)
View 2 ยท The preimage boundary
Exactly which bytes are hashed
The execution_hash preimage is {policy_parameters, output_payload} and nothing else. Members that describe, sign, or chain the artifact sit outside the boundary: they can change without moving the hash, which is why signatures and anchors cover the hash itself rather than duplicating it.
Inside the preimage (hashed)
Outside the preimage (not hashed)
Canonical preimage bytes (UTF-8) fed to SHA-256
Recomputed SHA-256 (lowercase hex)
View 3 ยท The parent_hashes walk
Where this artifact sits in the chain
An artifact names its inputs by hash. Each entry in parent_hashes is the execution_hash of a parent artifact, and chain_depth counts links back to the root. Walking the chain is walking hashes all the way down, each step recomputable the same way you just saw.
The boundary of this page
The hash, not the signature
This is the teaching surface for the hash alone. It recomputes and compares execution_hash values; it does not verify Ed25519 signatures, RFC 6962 Merkle inclusion, or batch receipts. Those live in the estate's receipt verifier, which recomputes this same hash on its way to signature and inclusion checks. The worker applies the identical recomputation server-side: same preimage, same canonicalizer, same answer.
What this page is: a mirror of the estate's verify_execution_hash utility, run in your browser over the same two members with the same canonical serializer line the tools estate carries inline. The bundled fixtures are synthetic teaching data generated from this exact algorithm; the tampered twin differs from the golden artifact by a single byte in output_payload and therefore must not match.