For the complete documentation index, see llms.txt. This page is also available as Markdown.

Understanding ProofPack

What a ProofPack actually is, structurally: a Merkle tree, wrapped in an attestation reference, wrapped in a signed JWS envelope — and why it's built that way.

What Is a ProofPack?

A ProofPack is a JSON file that lets you share specific facts from a larger record — a passport, a bank statement, a signed contract — while proving those facts are genuine, without handing over the whole document or calling back to whoever issued it.

It solves a problem most data sharing today doesn't: you either share everything, or you share nothing. Proving you're over 18 usually means uploading your whole passport to a website that only needed one fact. ProofPack lets you reveal just that one fact, with cryptographic proof it's real.

Not the same as a Zero-Knowledge Proof. A ZKP proves a statement is true ("this person is over 18") without ever revealing the underlying data. ProofPack instead reveals the actual data you choose ("date of birth: 1990-01-01"), with proof it's authentic — more like a redacted document than a mathematical proof of a claim.

The Three Layers

A ProofPack is built as three layers, each wrapping the one before it:

  1. Merkle Exchange Document — the innermost layer. Your data is split into individual fields ("leaves"), each hashed and salted, and combined into a Merkle tree. This is what makes selective disclosure possible: you can reveal one leaf and its proof path without exposing the others. See Understanding Merkle Trees and Proofs.

  2. Attested Merkle Exchange Document — wraps the tree with a reference to an on-chain attestation (via the Ethereum Attestation Service), plus a timestamp and nonce to prevent replay. This is what ties the data to a verifiable, tamper-evident record on the blockchain. See Crypto & Blockchain Basics.

  3. JWS Envelope — the outermost layer, a cryptographic signature over everything inside it. This is what a recipient checks first, and can be verified entirely offline. See Understanding JWT and JWS.

Because each layer can be checked independently, a verifier doesn't need to trust whoever's handing them the file — they can check the signature, recompute the Merkle root from the revealed leaves, and look up the attestation on-chain, all without a single call back to the issuer. zipwire.io/verify-proof does exactly this in the browser if you just want to check a file without writing any code.

Why This Shape, Specifically

  • Selective disclosure without re-verification. Because the underlying data is a Merkle tree, redacting most of it doesn't invalidate the rest — the root hash still checks out against the revealed leaves and their proof paths.

  • Portable and static. A ProofPack is just a downloadable file. Once issued, it can be stored, emailed, or re-shared with even fewer fields revealed, without contacting the original issuer again.

  • Self-describing. Because it's built on standard formats (JSON, Merkle trees, JWS), tools that have never heard of ProofPack — including general-purpose AI models — can parse and reason about one cold, with no custom integration.

Where You'll See This in Zipwire

ProofPacks are the proof format behind most of Zipwire's attestation features:

Proof VerificationData Portability and ProofsSign It Once, Prove It ForeverProofPack & Agent Delegation

Last updated