Getting started
Quick start
Check a real Zcash testnet proof three ways: in the browser, with the CLI, and on Solana devnet. Then make a proof of your own with the demo ledger. No wallet and no ZEC needed.
#In the browser
Open the verifier
Go to /verify. The verifier is the same Rust code as the CLI, compiled to WASM and run in a Web Worker; it checks the proof in your tab and sends it nowhere.
Pick “A real Zcash testnet proof”
It holds at least 1 TAZ, from a real testnet wallet as of block 4,410,000, valid until 26 January 2027. The six checks run in order and the verdict is Valid, with a note that TAZ has no monetary value.
Read what it reveals
Under the verdict, the page lists what the proof shows (the claim, the block, the audience, the expiry) and what it does not (the balance, which notes, how many, any address).
Break it
Try the tampered, forged, expired, revoked and re-addressed presets. Each is refused at the check that catches it, and says why. The dormancy presets show “unmoved since” passing and failing.
#With the CLI
Download pof-verify from the latest release (Linux x86-64, macOS on Apple silicon, Windows; a SHA-256 beside every archive), then fetch the public anchor table, the revocation list and the proof:
curl -fL https://github.com/SATISH-JALAN/Vouch/releases/latest/download/vouch-linux-x86_64.tar.gz | tar xz
curl -s https://vouch-zcash.vercel.app/api/anchors > anchors.json
curl -s https://vouch-zcash.vercel.app/api/revocations > revocations.json
curl -sO https://vouch-zcash.vercel.app/proofs/testnet-valid.pof
pof-verify check testnet-valid.pof --audience vouch:testnet-demo \
--anchors anchors.json --revocations revocations.jsonValid · 1.00000000 TAZ at least · anchor 4410000 (testnet)
NOTE: Zcash testnet. A real proof over real testnet notes, but TAZ has no monetary value: it says nothing about mainnet funds.
format pass POF1 · version 1 · 11,884 bytes · checksum ok
expiry pass Valid until 2027-01-26 19:07 UTC — 107 days left.
revocation pass Tag 704960c1… is not on the revocation list (2 revoked).
audience pass blake2b("vouch:testnet-demo") matches the audience field.
anchor pass Block 4,410,000 (testnet): note-commitment root and nullifier-set root both match.
proof pass Halo2 proof and spend-authorisation signature verify for this exact statement.The exit code is the verdict: 0 valid, 1 invalid, 2 expired, 3 malformed, 4 could not run. Ask as someone else and it is refused before any cryptography runs:
pof-verify check testnet-valid.pof --audience someone-else --anchors anchors.json
# Invalid · made for a different verifier (exit 1)The dormancy proof adds one requirement, the block the notes must be unmoved since:
curl -sO https://vouch-zcash.vercel.app/proofs/testnet-dormant.pof
pof-verify check testnet-dormant.pof --audience vouch:testnet-demo --anchors anchors.json --dormant-since 4410000
# Valid · 1.00000000 TAZ at least · anchor 4459000 (testnet) · unmoved since block 4410000#Make a proof without ZEC
The demo ledger is a published, synthetic Ironwood tree with five real notes under a real key: 4,018.2 ZEC. Proofs against it are real proofs; their anchor is labelled demo everywhere. Build a request at /request (or use the one below), then:
git clone https://github.com/SATISH-JALAN/Vouch && cd Vouch/backend
cargo run --release -p pof-prove -- demo prove --world ../fixtures/demo-world.json \
--request '<the link from /request>' --out proof.pof
cargo run --release -p pof-verify -- check proof.pof --audience pof-credit:usdc-pool-1 \
--anchors ../fixtures/anchors.demo.json
# Valid · 500.00000000 ZEC at least · anchor 3491040 (demo)On a 12-core laptop the demo proof takes about 1.4 s. The same demo holder answers the “Prove as the demo holder” button on /prove when the hosted attestor has CPU to spare.
#On Solana devnet
Open /demo and press Run all. A real proof is checked in your browser, the attestor signs the verdict, pof-gate records a receipt on devnet, and pof-credit opens a 25,000 dUSDC credit line you can draw 1,000 dUSDC from. Every account links to the explorer. The toggles on the left break it on purpose: a flipped proof byte, a flipped attestation byte, an attestor outage.
The hosted attestor runs on a free host that sleeps when idle. The first visit can take up to a minute while it wakes; the page says so and starts live once it answers.