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.
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.
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.
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