Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Public Verify

How an external developer follows a public verification path: open clients, contracts, and reproducible checks—without private lab runbooks.

Goals of a public verify path

  1. Anyone can fetch client / contract artifacts (checksums, Wasm, circuit blobs).
  2. Anyone can re-run verification against published public inputs and proofs (or against chain state).
  3. Operators document RPC / LCD endpoints and light-client checksums in public channels.

Layers you can verify

LayerWhat to checkHow
Circuit blob integrityDual SHA-256 in footercheck_circuit / load APIs; recompute checksums
On-chain proofproof_instance_verify resultSubmit or simulate tx calling the contract
Light clientClient not frozen; height advancesQuery 08-wasm client state; compare to source tip
Vote ceremony (if used)Published tallies / nullifiersvote-sdk / app APIs and chain queries
Bounties public modeDTO redactionCall public list/detail; assert no private fields

Minimal contract-side pattern

#![allow(unused)]
fn main() {
// Pseudocode — wire to your ExecuteMsg
let code = deps.api.proof_instance_verify(zkid, proof, instances)?;
ensure!(code == 0, ContractError::InvalidProof {});
// then mutate state that is safe only after a valid proof
}

Ensure zkid is already registered on the target network; publish the circuit key / checksum next to your contract address in release notes.

What not to rely on for “public”

  • Private agent boards, lab SSH, or unpublished .env secrets
  • Unpinned “latest” Wasm without checksum
  • Proofs without public inputs and circuit id

For program desk and forum links, see Public surfaces.