posl docs
poslSecurity

Trusted setup

Groth16 proofs need keys made once, in a ceremony. The keys are safe if at least one participant destroyed their randomness.

Why a ceremony#

Each circuit has a proving key and a verifying key. Whoever knew all the randomness used to make them could forge proofs for that circuit. A multi-party ceremony splits that randomness between many people: the keys are safe as long as one of them threw theirs away.

Status#

CircuitKeys
transaction2 (spend, from Privacy Cash, unmodified)Privacy Cash's ceremony
lock, unlock, claimStake, claimVolumeDevelopment keys One local contribution. Test networks only.

The program marks the development keys (DEV-ONLY in posl_vk.rs) and tools/mainnet-check.sh refuses a mainnet build while they are there.

How it will run#

  1. Phase 1 is the public Perpetual Powers of Tau (ppot_0080_18.ptau, hash checked by the script).
  2. The coordinator starts phase 2 for the four circuits: ceremony.sh start r0, and publishes the hashes.
  3. Each participant, in turn, adds a contribution: ceremony.sh contribute rN rN+1 "name", and publishes their contribution hashes.
  4. Anyone can verify the whole chain at any time: ceremony.sh verify rN.
  5. A public random beacon, announced in advance (for example a future drand round), closes it, so the last participant cannot bias the result: ceremony.sh finalize rN <beacon>.
  6. The verifying keys are written into the program, the full test suite runs again, and the record (participants, hashes, beacon) is published.

At least five independent participants are planned, including people outside the project. A full rehearsal ran on 19/09/2026: two contributions, ZKey Ok! on all four circuits, beacon, keys regenerated.