v0.1.0 · 7 tests · 6 pre-built circuits

Prove without revealing.

A cell is also a statement. "My balance is at least $X" — proved without showing the balance. "I voted" — proved without showing how. Click around. See what the verifier learns, and what it doesn't.

Pick a circuit

value_at_least
Prove value ≥ threshold
value_in_set
Prove value is in a set
sum_equals
Prove sum equals total
group_membership
Prove group membership
P prover (you)
— no proof yet —
V verifier (bank / doctor / anyone)

The verifier runs the same predicate on the witness and public inputs. If it holds, the proof is valid. The verifier learns the statement, but NOT the witness.

— waiting for proof —
verifier learned:
verifier did NOT learn:
What just happened

What you just did

const proof = CIRCUITS.VALUE_AT_LEAST.prove( { value: 75_000 }, // private witness { threshold: 50_000 } // public input ); // The proof is a tuple of (publicInputs, witness, holds). // A real ZK proof is a tuple of field elements — no witness. // The verifier can't extract the witness from the proof. proof.verify(CIRCUITS.VALUE_AT_LEAST); // true

In a real ZK system, the witness never leaves your device. The proof is small (a few hundred bytes). Anyone can verify it. The verifier learns the truth of the statement, not the underlying data.

The real backend is coming.

This is a sketch. The real implementation will use Noir (TypeScript-friendly ZK DSL) compiled to R1CS, proved with Halo2 or Plonky2, verified in any browser. The cell shape is the same.

View source → See all 11 repos