The ZK Field Manual
A practical reference for the four decisions every zero-knowledge project has to make: which proof system to build on, which framework to write circuits in, how to get the result audited, and whether — and how — to run a trusted setup ceremony. This page exists for printing and archiving; every part of it also has its own page.
Choosing a proof system
A proof system in practice is not one choice but three semi-independent ones: an arithmetisation, an interactive protocol, and a commitment scheme. Most of the properties engineers actually care about — proof size, on-chain gas, prover memory, field constraints, post-quantum posture — are set by the commitment layer and the field, not by the name of the SNARK. Getting this decision right first is what makes the rest of the project tractable; getting it wrong is what makes teams rewrite circuits a year in.
Think of the stack as arithmetisation (R1CS, PLONKish, AIR, CCS, multilinear) → protocol (polynomial IOP, sumcheck/GKR, folding) → commitment (KZG, FRI, IPA, Merkle plus linear code). Teams argue about the middle layer and are then surprised by consequences that came from the bottom one. If you want to predict proof size, verifier cost and post-quantum posture, look at the commitment scheme and the field first.
Pairing-based systems over BN254 still dominate final on-chain verification, because Ethereum has had a cheap pairing precompile for that curve since 2017 and every deployed verifier targets it; BLS12-381 precompiles (EIP-2537) have been live since the 2025 Pectra upgrade, so a 128-bit-security pairing curve is now also affordable on-chain, but the tooling and the deployed base have not moved yet. Hash-based small-field systems dominate bulk proving. Most production systems therefore use both: prove with a transparent hash-based system, then wrap the result in a pairing-based proof for settlement. Recognise this early — it means "we chose a transparent system" and "we need a trusted setup" are routinely both true. See §04.
This document does not reproduce benchmark numbers, because they change monthly and depend on hardware, security parameters and workload. It does say where the live ones are. For zkVMs, ethproofs.org publishes per-prover proving time, cost and cluster size on real Ethereum blocks, continuously and with the parameters stated — it is the closest thing to a neutral scoreboard the field has. For fixed programs across zkVMs, the a16z zkVM benchmark harness and the Delendum benchmarking suite compare implementations on identical workloads. Read every figure with its security level, field, hardware, and whether it includes the recursion and wrapping step. The prover-profile table below says, per family, where credible measurements exist and who maintains the implementations.
First, hash-based systems are configurable across soundness regimes, and vendors routinely ship 96–100 bits rather than 128 — a deliberate, documented performance tradeoff that is easy to miss in a benchmark table. Second, the aggressive "up-to-capacity" proximity-gap conjectures that justified the most optimistic FRI parameters were disproved in late 2025 — with an important qualification: the published counterexamples need fields exponentially large relative to blocklength, and the authors state the results do not apply to the small fields actually used in deployed systems. The practical effect is therefore not that deployed parameters are broken, but that a conjecture people were relying on turned out to be false as stated, and the corrected version costs something. Always demand a written parameter statement rather than a bit count.
Decision criteria · 10
Where the proof is finally verified, and what that costs
This is the hardest constraint in the whole document and it eliminates most of the design space immediately. On a gas-metered chain, verifier cost is dominated by which precompiles the verifier can use; hash-based verifiers get none, so a native FRI verifier on-chain is impractical.
Setup trust model
A circuit-specific setup must be re-run for every circuit change. A universal, updatable SRS is generated once per size bound and reused. A transparent system needs none. This single property determines whether §04 is a workstream or a paragraph.
Proof size and verifier work
Proof size drives calldata and data-availability cost, mobile bandwidth, and whether a proof can be gossiped or embedded in another message. The spread across systems is roughly three orders of magnitude.
Prover time, memory, and the hardware envelope
Client-side proving — browser, phone, wallet — is usually memory-bound before it is time-bound. A prover needing an SRS proportional to circuit size resident in RAM cannot run where a small-field hash-based prover can.
Recursion and aggregation strategy
Nearly every production system is recursive somewhere: to compress a large proof for settlement, to aggregate many proofs, or to make proving incremental. Recursion friendliness reduces to whether the verifier is cheap to express in the prover's own field.
Field and curve constraints imposed by the statement
If the statement verifies existing signatures or commitments, that arithmetic is non-native in almost every proof system and will dominate cost. If the statement is hashing or bit manipulation, small prime or binary fields with strong lookup support win decisively.
Statement shape: uniform, non-uniform, lookups and memory
A zkVM proving arbitrary execution has different needs from a fixed membership circuit. Heavy table lookups — bit operations, range checks, instruction decoding — often dominate prover time more than the choice of headline proof system does.
Post-quantum posture, and how much you actually need it
Pairing- and discrete-log-based systems fall to a cryptographically relevant quantum computer; hash-based systems are plausibly post-quantum. But the urgency differs sharply depending on which property you need to survive.
Soundness regime and the actual security parameter
Benchmarks are routinely published at different security levels, and hash-based systems can be configured in provable or conjectural regimes. The conjectural regime buys meaningful performance, and the conjectures are not all still standing.
Maturity, audit surface and independent implementations
Cryptographic elegance does not survive contact with an underconstrained circuit. The dominant real-world failure mode is not a broken proof system but a broken circuit, transcript or deployment — and mature systems are the ones where those mistakes have already been made and documented.
Selection matrix · 17
Proof system selection matrix
| Family | Setup | Proof size | On-chain verification | PQ | Recursion | Maturity |
|---|---|---|---|---|---|---|
| Groth16 | Circuit-specific | 3 group elements: 128 B compressed, 256 B as EVM calldata | Cheapest deployed option | No | Via curve cycles; awkward | Production since 2016 |
| PLONK family | Universal, updatable | Sub-kilobyte | Practical; above Groth16 | No | Well-exercised | Production; most common deployed family |
| fflonk | Universal | ~768 B as deployed | Fewer verifier group ops than PLONK | No | As PLONK | Was production in one stack, since retired |
| Marlin / Varuna | Universal, updatable | Constant, above Groth16 | Practical | No | Limited | Production in one ecosystem; little greenfield use |
| Halo2 + IPA | None | Logarithmic | Impractical — verifier linear in circuit size | No | Native, via accumulation on a curve cycle | Years in production; gadget-layer bug in 2026 |
| Halo2 + KZG | Universal, updatable | Constant | Practical | No | Supported | Production; central maintenance declining |
| FRI-based STARKs | None | Tens to hundreds of KB | Impractical directly — wrapper is standard | Plausibly | Well-exercised | Heavily production |
| STIR / WHIR | None | Markedly smaller than FRI at equal security | Impractical directly | Plausibly | Inherits FRI approaches | Research maturing into implementation |
| Binius (binary fields) | None | Hash-based scale | Impractical directly | Plausibly | Developing | Early production; fast-moving codebase |
| Ligero / Brakedown | None | Square-root — large | Not viable | Plausibly | Used as an inner layer | Established; mostly used as a component |
| Basefold | None | Between Brakedown and FRI | Impractical directly | Plausibly | As a commitment layer | Research-to-production transition |
| Spartan | None (commitment-dependent) | Depends on commitment | Not a settlement candidate alone | Commitment-dependent | Used inside larger systems | Established construction, widely built upon |
| GKR / sumcheck systems | None (commitment-dependent) | Grows with circuit depth | Wrapper needed | Commitment-dependent | Developing | Production via at least one major zkVM |
| HyperPlonk | Commitment-dependent | Larger than univariate PLONK with KZG | More expensive than PLONK | Commitment-dependent | Supported | Influential; fewer deployments under its own name |
| Nova / folding schemes | None in the folding layer | Accumulator, not a proof — needs final compression | Via the compressing SNARK only | No | This is the whole point | Research to early production |
| Bulletproofs | None | Logarithmic; small for ranges | Linear in circuit size — not succinct | No | Poor | Production for range proofs since 2018 |
| LatticeFold | None | Research-stage | Research-stage | Yes (lattice) | Designed for it | Research only — not a 2026 production choice |
These are structural properties of each design, not benchmark results — implementation performance depends on hardware, circuit shape and optimisation effort and goes stale within months. Proof sizes are order-of-magnitude and assume typical deployed parameters; for hash-based systems size is a dial traded against security, so treat any figure without its parameters as indicative only. "PQ" means the design rests only on hash assumptions, and it is forfeited if you wrap the proof in a pairing-based SNARK.
Prover profile · 17
Prover profile, implementations and benchmarks
| Family | Prover cost profile | Peak prover memory | Off-chain verifier | Implementations and maintainers | Where it is measured |
|---|---|---|---|---|---|
| Groth16 | 256-bit-field MSMs and FFTs; roughly linear in constraints with a high constant. Mature GPU provers exist. | Proving key resident in RAM, growing with circuit size — the usual browser and mobile limit | Milliseconds: three pairings | snarkjs and rapidsnark (iden3), gnark (Consensys), arkworks, bellman (Zcash lineage), ICICLE GPU backends (Ingonyama) | Delendum zk-benchmarking; wrapper cost inside every zkVM benchmark on ethproofs.org |
| PLONK family | 256-bit-field FFTs dominate; custom gates and lookups trade prover work for constraint count | SRS and witness polynomials resident; comparable to Groth16 at equal size | Milliseconds | Barretenberg / UltraHonk (Aztec), gnark (Consensys), plonky2 (Polygon Zero lineage), Kimchi (o1Labs), Halo2 forks | Vendor-published only; no neutral cross-implementation suite |
| fflonk | Heavier than PLONK: polynomials are combined to shrink the verifier | As PLONK | Milliseconds | snarkjs (iden3); formerly Polygon zkEVM | Historical Polygon zkEVM figures only |
| Marlin / Varuna | Universal-SRS R1CS prover; slower than Groth16 at equal size | SRS resident | Milliseconds | arkworks marlin (research), Varuna in snarkVM (Provable / Aleo) | Aleo ecosystem figures only |
| Halo2 + IPA | MSM-dominated over the Pasta curve cycle; no pairing-curve FFT bottleneck | Proportional to circuit size; moderate | Linear in circuit size — tens to hundreds of milliseconds for large circuits | zcash/halo2 (Electric Coin Company) | Zcash Orchard figures; no neutral suite |
| Halo2 + KZG | 256-bit-field FFTs over BN254; the largest gadget ecosystem of any PLONKish frontend | SRS resident; large circuits need tens of gigabytes | Milliseconds | privacy-ethereum/halo2 (Ethereum Foundation PSE, maintenance mode), halo2-lib (Axiom), Scroll's fork | Scroll and Axiom published figures; no neutral suite |
| FRI-based STARKs | Small-field hashing and NTTs; the fastest bulk provers on CPU and GPU, and the basis of most zkVMs | Trace-proportional, but small fields keep it low; continuations bound it | Milliseconds to tens of milliseconds — hashing only | Stone and Stwo (StarkWare), Plonky3 (Polygon Zero lineage; beneath SP1 Turbo, OpenVM, Ziren, Pico), RISC Zero, Miden, ZKsync Airbender (Matter Labs), Winterfell | ethproofs.org real-time Ethereum block proving; a16z zkvm-benchmarks |
| STIR / WHIR | Comparable to FRI; the WHIR prover is somewhat heavier | As FRI | Sub-millisecond for WHIR in the authors' reported settings | Reference implementations by the authors; integrations into production hash-based stacks under way | Authors' comparisons only; measure on your own parameters |
| Binius (binary fields) | Binary-field arithmetic maps to hardware bit operations; strongest on hashing and bitwise workloads | Low — tiny field elements, no embedding overhead | Milliseconds | Binius64 (Irreducible); the original binius repository is archived | Irreducible's published figures; few independent measurements |
| Ligero / Brakedown | Linear-time encoding — the cheapest commitment prover, paid for in proof size | Low | Sublinear, but large proofs to hash | Ligero (Ligero Inc.), Brakedown in the Lasso and Jolt lineage (a16z crypto), arkworks | Component-level measurements only |
| Basefold | Linear-time encoding plus a FRI-like fold; between Brakedown and FRI | Low | Polylogarithmic | Ceno (Scroll) and research implementations | Component-level measurements only |
| Spartan | Sumcheck over sparse R1CS; no FFT; linear in non-zero constraint entries | Low and streaming-friendly | Sublinear after preprocessing; commitment-dependent | Spartan (Microsoft Research), inside Jolt (a16z crypto) and Nexus | Only inside zkVM benchmarks |
| GKR / sumcheck systems | Linear-time; commits only to the input layer | Low relative to trace size | Grows with circuit depth | Expander (Polyhedra), Ceno (Scroll), SP1 Hypercube's sumcheck design (Succinct) | ethproofs.org for the zkVMs built on it; Polyhedra's published figures |
| HyperPlonk | Sumcheck-based, linear-time, no FFT; high-degree gates are cheap | Low | Higher than univariate PLONK | Espresso Systems research implementation; ideas absorbed into other stacks | Paper figures only |
| Nova / folding schemes | Two MSMs per step — the cheapest incremental step known | Bounded by one step plus the accumulator | Only after final compression | Nova (Microsoft Research), Sonobe (Ethereum Foundation lineage), arecibo (Argument Computer) | Repository benchmarks only; no neutral suite |
| Bulletproofs | Linear MSMs; slow for general circuits | Low | Linear in circuit size; batchable | dalek bulletproofs (Rust), Monero, Bulletproofs+ in several wallets | Range-proof figures in Monero and dalek benchmarks |
| LatticeFold | Research-stage | Research-stage | Research-stage | Research prototypes; a lattice-based Jolt variant was announced by a16z crypto in September 2026 | None neutral |
Prover cost and memory are stated as profiles — what dominates and how it scales — rather than as numbers, which belong in the benchmark suites named in the last column. "Off-chain verifier" is the cost of a native verifier on a server or client, the number that matters when no gas-metered contract is involved. "Implementations" names who maintains the code you would actually run; a construction with one implementation and one maintainer is a different risk from one with five.
Commitment schemes · 10
Commitment schemes — the layer that decides most of it
| Scheme | Assumption | Setup | Opening size | Verifier cost | Field constraint |
|---|---|---|---|---|---|
| KZG | Pairings | Structured, universal | Constant | Constant; precompile-backed | Pairing-friendly curve, 256-bit scalar field |
| Multilinear KZG (PST, Zeromorph, HyperKZG) | Pairings | Structured, universal | Logarithmic — hundreds of bytes | Constant pairings plus a logarithmic number of group operations; EVM-practical | Pairing-friendly curve, 256-bit scalar field |
| Hyrax | Discrete log (Pedersen) | None | Square-root | Square-root MSM | Any prime-order group |
| Dory | Pairings, transparent (no trapdoor) | None — public generators | Logarithmic | Logarithmic, with pairings | Pairing-friendly curve |
| FRI | Hash (collision resistance) | None | Polylogarithmic but large in absolute terms | Polylogarithmic; expensive on-chain | High two-adicity; extension for challenges |
| IPA / Bulletproofs-style | Discrete log | None | Logarithmic | Linear unless amortised by accumulation | Any prime-order group; enables curve cycles |
| Brakedown / Ligero | Hash + linear codes | None | Square-root — large | Sublinear, not polylogarithmic | Field-agnostic |
| Basefold | Hash + foldable codes | None | Between Brakedown and FRI | Polylogarithmic | Field-agnostic — no two-adicity requirement |
| WHIR | Hash + constrained RS codes | None | Smaller than FRI at equal security | Reported in hundreds of microseconds | Reed-Solomon-friendly |
| Binius commitments | Hash over binary fields | None | Hash-based scale | Polylogarithmic | Binary field towers |
Two systems built on the same commitment scheme will resemble each other on proof size, verifier cost and post-quantum posture far more than two systems sharing a protocol name but differing here. When comparing proof systems, check this table first. Sumcheck-based systems — Spartan, HyperPlonk, Jolt, GKR stacks — need a multilinear commitment, which is why the multilinear KZG variants, Hyrax and Dory appear here alongside the univariate schemes.
Systems, commitments and lookup arguments · 11 pages
Groth16
The 2016 pairing-based preprocessing SNARK over R1CS: the proof is three group elements verified with a single pairing product equation. Requires a per-circuit setup on top of a reusable universal phase one.
- The smallest proofs and cheapest verifier of any widely deployed system
- The cheapest realistic on-chain verification on Ethereum
- Extremely well understood, with many independent implementations and a decade of scrutiny
- Circuit-specific trusted setup: any circuit change means a new ceremony, and toxic waste breaks soundness for that circuit permanently
- No universality — setup cannot be amortised across circuits
- Not post-quantum
- Proofs are re-randomisable, which breaks any application treating a proof as a unique object
Choose it whenA stable circuit verified on-chain at high frequency where gas is the binding constraint. Also the standard final compression layer for STARK-based systems.
PLONK and the PLONKish family
A permutation-argument-based universal SNARK over a custom-gate arithmetisation — selector columns, copy constraints, optional lookup columns. One SRS serves all circuits up to a size bound. The most frequently occurring family among deployed on-chain verifiers.
- Universal, updatable SRS — one ceremony, many circuits, no per-circuit phase two
- Flexible arithmetisation: custom gates and lookups express non-arithmetic operations efficiently
- Verifier cost close to Groth16 and still practical on-chain
- Very large ecosystem with many independent implementations
- Larger proofs and higher gas than Groth16
- Not post-quantum
- Prover requires large-field FFTs, the main bottleneck at scale
- Arithmetisation flexibility is also a footgun — custom gates and lookup tables are a common source of underconstrained circuits
- 'PLONK' names a family, not one artefact: two implementations may share little
Choose it whenGeneral-purpose circuits where churn is expected and a per-circuit ceremony would be painful, and where on-chain verification is required but need not be absolutely minimal.
FRI-based STARKs
AIR or PLONKish arithmetisation committed with Reed–Solomon codewords and Merkle trees, with FRI as the low-degree test. No trusted setup, hash-based, plausibly post-quantum. The workhorse of large-scale transparent proving: StarkWare's Stone and Stwo, the Plonky2 and Plonky3 toolkits, RISC Zero, Miden and ZKsync Airbender are all instances of this family, differing mainly in field, hash and lookup argument.
- No trusted setup; security reduces to hash collision resistance plus the FRI soundness analysis
- Plausibly post-quantum in the proving layer
- Small-field arithmetic gives excellent CPU and GPU throughput; Circle STARK constructions extend this to fields that FRI could not otherwise use
- Scales well to very large computations
- Proofs are tens to hundreds of kilobytes and verifiers are expensive, so a pairing-based wrapper is standard — which reintroduces a trusted setup and removes post-quantum security
- Security parameters are a dial, and deployed systems routinely ship 96–100 bits rather than 128
- Requires a field with high two-adicity and enough size, or an extension, for challenges
- Parameter tuning across rate, queries, grinding and decoding regime is easy to get wrong
Choose it whenHigh-throughput server-side proving of large computations, especially zkVM execution, where a final wrapper handles settlement.
Halo2 with IPA, and Halo2 with KZG
The same PLONKish frontend with two very different backends. The original uses an inner-product argument over a curve cycle and needs no trusted setup, with recursion via accumulation. The widely used Ethereum-oriented variant replaces IPA with KZG, giving constant-size proofs and a practical Solidity verifier — and a universal trusted setup. These are routinely conflated.
- The IPA variant needs no trusted setup and has years of deployment in a value-bearing system
- Recursion without pairing-friendly curves, via accumulation on a two-cycle
- The KZG variant gives constant-size proofs and EVM-practical verification
- Rich, expressive frontend with mature circuit libraries for elliptic-curve and hashing work
- IPA verification is linear in circuit size — that variant is not an EVM settlement candidate
- The KZG variant reintroduces a universal trusted setup, unlike the original — a frequent source of confusion
- Neither is post-quantum
- The ecosystem has fragmented into forks that are not drop-in compatible and have uneven maintenance
- Maturity of the construction does not transfer to its gadget libraries: a counterfeiting bug in the upstream ECC gadget prompted an emergency response in 2026 — check the current status of any deployment cited as evidence
Choose it whenIPA: systems verified on a node rather than in a gas-metered contract, where trusted setup is unacceptable. KZG: EVM-verified application circuits and coprocessors needing expressive custom gates.
Nova, SuperNova and HyperNova
Folding reduces checking two instances of a relation to checking one, so each step of a long computation costs a couple of multi-scalar multiplications rather than an in-circuit SNARK verification. Variants add non-uniform steps and generalised constraint systems.
- The lowest known per-step recursion overhead for long, near-uniform computations
- Memory-friendly: proving is incremental, so peak memory tracks one step rather than the whole trace
- No trusted setup in the folding layer itself
- Non-uniform variants avoid paying for the union of all instructions at every step
- Folding produces an accumulator, not a succinct proof — a final compressing SNARK is still required, and its cost is often omitted from benchmarks
- Not post-quantum: security rests on discrete log in the commitment scheme
- Real soundness pitfalls have been published in cycle-of-curves constructions — this is subtle territory
- Implementation maturity trails the pairing-based and FRI families
Choose it whenLong, repetitive computations and memory-constrained provers, where the final compression step happens once.
Binius and binary-field systems
SNARKs over towers of binary fields, with a commitment that has no embedding overhead for tiny field elements. The current generation computes natively over 64-bit words with built-in bitwise and multiplication constraints, explicitly targeting client-side proving on commodity CPUs.
- Binary-field arithmetic maps directly to hardware bit operations — a strong fit for hashing, ciphers and bit manipulation
- No trusted setup; hash-based and plausibly post-quantum
- Explicitly targets commodity CPUs rather than GPU clusters
- The most volatile family here: the original implementation was archived and superseded, with significant features still on the roadmap at the successor's launch — confirm current capability before designing around it
- Small implementation and auditor base
- Not directly on-chain verifiable
Choose it whenHash- and bitwise-heavy workloads, and client-side proving, for teams able to track a fast-moving codebase.
STIR and WHIR
Two successors to FRI from the same research lineage. STIR reduces query complexity by recursively improving the rate of the tested code; WHIR builds on constrained Reed–Solomon codes to give very fast verification, and doubles as a polynomial commitment.
- Concretely smaller proofs than FRI at equal security — roughly half, in the authors' reported comparisons
- WHIR verification is reported in hundreds of microseconds where prior hash-based verifiers took milliseconds
- Public reference implementations exist and integration into production stacks is under way
- Newer analyses and fewer independent implementations than FRI
- The most aggressive parameterisation relied on an up-to-capacity conjecture disproved for large fields in late 2025; Johnson-bound parameters are unaffected but the optimistic discount is not available as originally stated
- Requires a team able to track fresh cryptanalysis
Choose it whenReplacing FRI where hash-based proof size or verifier latency is the binding constraint, for teams who will follow the literature.
GKR-based systems
The GKR protocol proves layered-circuit evaluation using sumcheck, with prover time linear in circuit size. Modern systems combine it with an error-correcting-code commitment, or use GKR to run the lookup argument itself.
- Linear-time prover with very low commitment cost — GKR commits only to the input layer, not every intermediate wire
- Extremely high throughput on parallel hardware for wide, uniform workloads
- Now production-proven via at least one major zkVM
- Requires the computation to be expressed as a layered circuit or sumcheck-friendly relation; irregular computation is awkward
- Proof size and verifier cost grow with circuit depth — deep circuits are the failure mode
- Not EVM-cheap; a wrapper is still needed for settlement
- Fewer mature general-purpose frontends
Choose it whenWide, shallow, highly parallel workloads — bulk hashing, signature aggregation, inference — and zkVMs using a multilinear arithmetisation.
Spartan
A transparent SNARK for R1CS built on sumcheck and a multilinear commitment, with sublinear verification after preprocessing and no FFTs. Its distinguishing property is that the commitment scheme is swappable.
- No trusted setup, and the commitment is swappable — so post-quantum posture becomes a separate, independent choice
- No FFT in the prover; costs are linear in the number of constraint entries
- The sumcheck structure has become the foundation for much newer work
- Proof size and verifier cost are worse than pairing-based SNARKs; not an EVM settlement candidate alone
- Concrete performance depends almost entirely on the chosen commitment, so 'Spartan is fast' is not a meaningful statement unqualified
- The reference implementation is a research artefact rather than a maintained product
Choose it whenAn intermediate proof layer, or the theoretical core of a zkVM — particularly when you want to change commitment schemes without changing arithmetisation.
Bulletproofs
Logarithmic-size zero-knowledge arguments from the inner-product argument, with no trusted setup. Best known for range proofs in confidential transactions; general circuits are supported but not the strength.
- No trusted setup and only the discrete-log assumption
- Very small proofs for range statements, with cheap aggregation of many range proofs
- Batch verification gives real speedups across many proofs
- Long production track record in confidential-transaction systems
- Verification is linear in circuit size — no succinct verifier, so unsuitable for on-chain verification of large statements
- Not post-quantum
- General-circuit performance is poor relative to modern SNARKs; the sweet spot is narrow
Choose it whenRange proofs and small confidential-transaction statements verified by full nodes.
Lookup arguments: Plookup, LogUp, cq, Lasso/Shout/Twist
Lookup arguments prove that values appear in a table, and are how systems express operations that are expensive as raw arithmetic. Plookup is the original and ubiquitous; LogUp uses logarithmic derivatives and is substantially cheaper for wide multi-column lookups; cq makes prover cost independent of table size after preprocessing; Lasso and its successors exploit table structure so huge tables need never be materialised.
- Frequently determines prover time more than the choice of headline proof system does
- LogUp and its GKR variant dominate modern small-field designs
- Structure-exploiting arguments make instruction-set-sized tables tractable at all
- Plookup scales poorly with large tables and multi-column lookups
- cq requires a KZG SRS and amortised preprocessing — poor fit for changing tables
- Structure-exploiting schemes are tied to sumcheck arithmetisations, need decomposable tables to deliver their headline benefits, and their reference implementation is self-declared alpha
- Multiplicity handling is a known correctness trap: an unconstrained multiplicity column silently breaks soundness
Choose it whenEvaluate the lookup argument explicitly whenever range checks, bitwise operations or instruction decoding dominate your constraint count.
How to run the selection · 8 steps
Write down the verification environment as a number
Where is the proof verified, and what is the budget — gas, milliseconds, bytes? This single constraint eliminates most of the design space, and it is the one teams most often leave qualitative.
Classify the statement by operation mix
Count foreign-field operations, hash invocations, range checks and memory accesses separately. The dominant class determines whether a small-field, binary-field or 256-bit-field system is right, far more than the protocol name does.
Decide the setup posture deliberately
Is a trusted setup acceptable to your users and governance? Will the circuit change after launch? Answer these before comparing performance, because they cut the field decisively and they are the hardest to reverse.
Choose the commitment scheme, then the protocol
Work bottom-up. The commitment scheme and field fix proof size, verifier cost and post-quantum posture; the protocol layered on top is a comparatively free choice among those that fit.
Design the recursion and wrapping strategy now, not later
Decide whether you will wrap for settlement, what the wrapper costs, and what setup the wrapper needs. Teams that defer this discover late that their transparent system depends on a ceremony after all.
Write the security parameter statement
Record field and extension degree, hash output length, rate, query count, grinding bits, decoding regime, and whether the claim is provable or conjectured. Use a shared soundness calculator rather than a bespoke derivation. This document is an audit artefact — see §03.
Prototype the dominant cost, at the shipping parameters
Build the most expensive component in the top two candidates and measure prover time, peak memory and verifier cost at the security level you will actually deploy — not at benchmark parameters.
Record the decision, its assumptions and its expiry conditions
State what would force a revisit: a conjecture falling, a wrapper cost change, a field requirement shifting. This decision has the longest half-life in the project and deserves an explicit record.
Where proof system decisions go wrong · 10
Comparing protocol names instead of commitment schemes
Two systems are compared by their headline names when the properties being compared — proof size, verifier cost, post-quantum posture — are set by the commitment layer beneath. The comparison produces a confident conclusion about the wrong variable.
Treating a quoted security level as comparable
Benchmarks are compared across systems configured at different security levels. Hash-based systems in particular ship at 96–100 bits in production far more often than teams assume, and a proof size quoted at 96 bits is not comparable to one quoted at 128.
Relying on a conjecture without knowing you are
Aggressive hash-based parameters are adopted from a benchmark or a default configuration that quietly assumed a soundness conjecture, and nobody records which conjecture. Conjectures do fall: the up-to-capacity proximity-gap conjectures were disproved in late 2025, and although the counterexamples do not reach the small fields deployed systems use, the corrected conjecture is not free. A team that never wrote down what it was assuming cannot tell whether an event like that touches them.
Announcing 'no trusted setup' while shipping a wrapper
A transparent system is chosen for exactly that property and then wrapped in a pairing-based SNARK to make settlement affordable. The deployed system depends on a trusted setup and forfeits post-quantum soundness, but the public claim is never updated.
Ignoring proof malleability in application logic
The application treats a proof or its hash as a unique identifier for deduplication, nonces or replay protection. Several deployed systems produce re-randomisable proofs, so a second valid proof of the same statement is trivially obtainable.
Choosing on prover time and discovering the memory wall
Selection is driven by wall-clock benchmarks, and the system then cannot run in the target environment at all because peak resident memory exceeds what a browser, phone or affordable instance provides.
Buying post-quantum security you do not have
A hash-based system is chosen for post-quantum posture, but the deployed system wraps into a pairing SNARK, or the zero-knowledge property is only computational, or the surrounding signatures and key exchange remain classical. The property does not compose the way the decision assumed.
Adopting a construction ahead of its implementations
A recent construction with excellent published numbers is selected, but has one implementation, no independent verifier, thin audit coverage, and a codebase that has already been archived and superseded once.
Underestimating the recursion threshold
Recursion is assumed to be available, then the in-circuit verifier turns out to be large enough that the minimum useful step size exceeds the actual workload — so recursion costs more than it saves.
Letting the lookup argument be an afterthought
Enormous effort goes into choosing between proof systems while the lookup argument — which dominates prover time for range checks, bitwise operations and instruction decoding — is inherited from whatever the library defaulted to.
Sources for this section · 40
- Groth16 — On the size of pairing-based non-interactive argumentspaper
- PLONK — permutations over Lagrange bases for oecumenical noninteractive argumentspaper
- fflonk — a fast-Fourier inspired verifier efficient variant of PLONKpaper
- Marlin — preprocessing zkSNARKs with universal and updatable SRSpaper
- Halo — recursive proof composition without a trusted setuppaper
- Nova — recursive zero-knowledge arguments from folding schemespaper
- Spartan — efficient and general-purpose zkSNARKs without trusted setuppaper
- Bulletproofs — short proofs for confidential transactions and morepaper
- Scalable, transparent, and post-quantum secure computational integrity (STARKs)paper
- Proximity gaps for Reed–Solomon codespaper
- Circle STARKs — making Mersenne-31 usable for FRI-based systemspaper
- ethSTARK documentation — concrete soundness parameterspaper
- Binius — succinct arguments over towers of binary fieldspaper
- Basefold — field-agnostic multilinear polynomial commitmentpaper
- Brakedown — linear-time and field-agnostic SNARKs for R1CSpaper
- STIR — Reed–Solomon proximity testing with fewer queriespaper
- WHIR — Reed–Solomon proximity testing with super-fast verificationpaper
- Libra — succinct zero-knowledge proofs with optimal prover computation (GKR)paper
- HyperPlonk — PLONK with linear-time prover and high-degree custom gatespaper
- Signatures of correct computation (PST) — the original multilinear KZG commitmentpaper
- Zeromorph — multilinear evaluation proofs from univariate KZGpaper
- Hyrax — doubly-efficient zkSNARKs without trusted setup (square-root Pedersen commitment)paper
- Dory — transparent logarithmic-size arguments for inner products and polynomial commitmentspaper
- LatticeFold+ — post-quantum folding from latticespaper
- Plookup — a simplified polynomial protocol for lookup tablespaper
- Multivariate lookups based on logarithmic derivatives (LogUp)paper
- cq — cached quotients for fast lookupspaper
- Twist and Shout — memory checking arguments for zkVMspaper
- SoK: Trusted setups for powers-of-tau stringspaper
- EIP-1108 — reduced gas cost for alt_bn128 precompilesspec
- EIP-2537 — BLS12-381 curve operations precompilespec
- EIP-4844 — shard blob transactions and the KZG commitment schemespec
- soundcalc — soundness parameter calculator for hash-based systemstool
- L2BEAT ZK Catalog — catalogue of deployed on-chain verifierscatalogue
- ethproofs.org — continuous real-time proving benchmarks on Ethereum blocks, per prover, with cost and hardwarebenchmark
- a16z zkvm-benchmarks — fixed-program comparison harness across zkVMsbenchmark
- Delendum zk-benchmarking — cross-implementation benchmarks of proof systems and zkVMsbenchmark
- ZKProof Community Reference — terminology and security recommendationsreference
- Plonky3 — polynomial IOP toolkit over small fieldsproject
- Wrapping up the KZG ceremony — the largest deployed universal SRSrecord
Choosing a framework
Framework choice resolves into one structural decision and a set of consequences. The structural decision is whether to hand-write an arithmetic circuit in a DSL or to prove a compiled program in a zkVM. A hand-written circuit encodes only your statement, so proving cost can be orders of magnitude lower — but you own the correctness of every constraint. A zkVM lets you write ordinary code and inherit an audited constraint system, at the cost of proving a whole machine. Everything else — language, tooling, licence, hiring — follows from that choice and from the backend you settled in §01.
If machine-checked circuit correctness is a requirement, explore Clean and our formal verification guide before committing to a toolchain. Our first recommendation for ZK architecture questions, audit planning and verification work is zkSecurity. See the consultancy shortlist for other providers and the basis for that editorial choice.
Favour a hand-written circuit when the statement is small, fixed and hot — a Merkle membership check, a signature verification, a circuit run millions of times — and the marginal proving cost dominates. Favour a zkVM when the statement is large, changing, or reuses existing code, and engineering time and correctness risk dominate. The honest test is arithmetic: would rewriting the logic as constraints cost more engineer-months than the proving-cost difference saves over two years? Compute both numbers. Hybrid designs — a zkVM with a hand-written precompile for the hot path — are common and often correct.
Licensing in this ecosystem is unusually varied and several widely used tools are not permissive. Copyleft compilers and standard libraries, AGPL provers, and source-available licences that specifically restrict offering the software as a service all exist among mainstream options. The compiler, standard library, prover and verifier contract can each carry a different licence. This regularly surprises teams building commercial or hosted products, and it is far cheaper to check now than to migrate later. Get legal review rather than forum advice.
Decision criteria · 13
Hand-written circuit or zkVM
This dominates every downstream cost: proving time, proof size, audit scope, hiring, and how much correctness you personally own. It is not primarily a technology preference — it is a decision about where you want your risk to sit.
Expressiveness versus auditability
The more freely a language lets you write constraints, the more ways there are to write a constraint system that does not say what you think it says. Power and audit cost move together.
Backend swappability
Proof systems have turned over roughly every eighteen to twenty-four months. If your source language is welded to one backend, a backend change is a rewrite rather than a re-target.
Recursion and aggregation
Recursion determines whether you can shard long computations, aggregate many proofs into one on-chain verification, and compress a large proof into a small one. It is also the least-verified part of most stacks.
Underconstrained-bug risk and analysis tooling
Underconstrained circuits are the dominant soundness bug class and they are silent: all tests pass and all proofs verify. Tool coverage is highly uneven across languages, and it is a real input to risk.
Debuggability and negative testing
Circuit DSLs are historically weakest exactly where zkVMs are strongest: you can run a zkVM guest natively under a debugger before proving anything. Separately, constraint-level coverage — proving that a malicious witness is rejected — is different from ordinary unit testing and is not provided by default anywhere.
Precompiles, accelerators and extensibility
For zkVMs, nearly all real-world performance comes from precompiles — accelerated hashing, elliptic curve operations, big-integer arithmetic — not from the base instruction set. Whether you can add your own without forking the project determines whether you can optimise your own workload.
On-chain verifier cost and proof size
If proofs settle on a chain, gas per verification and calldata size are hard constraints — and they are set by the final wrapper, not by the inner proof system. This surprises teams who chose a setup-free inner system for its properties.
Proving cost, hardware and memory profile
Peak memory decides feasibility more often than wall-clock time: a prover needing hundreds of gigabytes cannot run where one needing a few can. Streaming and folding provers change this profile qualitatively.
Field, curve and interop constraints
The prime field is not a free parameter. Non-native arithmetic — foreign-curve operations inside a small-field STARK, or the reverse — can cost a hundredfold, and it determines whether you can cheaply verify existing signatures, commitments or other proofs.
Post-quantum posture of the whole stack
Teams pick a hash-based stack partly for post-quantum reasons and then wrap the proof in a pairing-based SNARK for settlement, which removes the property from the composed artefact. The framework layer is where that happens, so it has to be checked here and not only in §01.
Security track record and disclosure practice
Every serious stack has had at least one critical soundness finding. What distinguishes them is whether it was found by the project's own process, disclosed publicly, and fixed in a released version with an identifier — not how many audit badges are on the README.
Ecosystem longevity and hiring
ZK engineering talent is scarce and language-specific, and auditors are concentrated in the same few languages. A niche choice means slow hiring and slow, expensive audits.
Selection matrix · 24
Framework selection matrix
| Project | Kind | Arithmetisation / backend | Setup | Maintained by | Licence | Status |
|---|---|---|---|---|---|---|
| Circom | Circuit DSL | R1CS → Groth16 / PLONK | Yes (per-circuit for Groth16) | iden3 | GPL-3.0 | Production-mature |
| Noir | Circuit DSL | ACIR → Barretenberg (UltraHonk) | Yes (universal) | Aztec | Apache-2.0 / MIT | Late beta, pre-1.0 (1.0.0-beta series through 2026) |
| Halo2 (upstream) | Rust eDSL | PLONKish + IPA | None | Electric Coin Company (Zcash) | MIT / Apache-2.0 | Production in its home ecosystem |
| Halo2 (KZG fork) | Rust eDSL | PLONKish + KZG | Yes (universal) | Ethereum Foundation PSE | MIT / Apache-2.0 | Maintenance mode |
| gnark | Go eDSL | R1CS / PLONK, six curves | Yes (scheme-dependent) | Consensys (Linea) | Apache-2.0 | Production-mature |
| arkworks | Rust library ecosystem | R1CS + SNARK interfaces | Depends on scheme | arkworks contributors (academic origin) | MIT / Apache-2.0 | Mature substrate, slow-moving |
| Plonky3 | Proof-system toolkit | AIR / FRI over small fields | None | Plonky3 org (Polygon Zero lineage) | MIT / Apache-2.0 | Widely used downstream; pre-1.0 API |
| Cairo + Stwo | Language + VM + prover | Circle STARK (Mersenne-31) | None | StarkWare | Apache-2.0 | Production at scale |
| SP1 | zkVM (RISC-V) | Multilinear / sumcheck + wrapper | Wrapper only | Succinct | MIT / Apache-2.0 | Production; deepest assurance evidence |
| RISC Zero R0VM | zkVM (RISC-V) | FRI/STARK + Groth16 wrapper | Wrapper only | RISC Zero | Apache-2.0 | Production; longest track record; 3.x line in 2026 |
| OpenVM | Modular zkVM framework | Plonky3 AIR, chip extensions | Wrapper only | Axiom | MIT / Apache-2.0 | Production-recommended; externally audited |
| ZKsync Airbender | zkVM (RISC-V) | STARK over Mersenne-31 + wrapper | Wrapper only | Matter Labs (ZKsync) | Apache-2.0 / MIT | Production on ZKsync mainnet; published GPU benchmarks |
| Zisk | zkVM (RISC-V) | STARK, precompile-heavy | Wrapper only | Polygon | Apache-2.0 / MIT | Alpha releases; on ethproofs |
| Pico | zkVM (RISC-V) | Plonky3-based, modular | Wrapper only | Brevis | Apache-2.0 / MIT | 2.x releases; on ethproofs |
| Ziren (formerly zkMIPS) | zkVM (MIPS) | Plonky3-based STARK | Wrapper only | ZKM | Apache-2.0 / MIT | 1.x releases; on ethproofs |
| Jolt | zkVM (RISC-V) | Lookup-centric sumcheck; lattice variant announced 2026 | None (transparent) | a16z crypto | MIT / Apache-2.0 | Alpha; maintainers state not production-ready |
| Miden VM | zkVM (stack-based) | STARK, custom ISA | None | Miden (Polygon spin-out) | MIT / Apache-2.0 | Actively developed; mainnet launch announced for 2026 |
| Nexus zkVM | zkVM (RISC-V) | Rewritten in 3.0 | Varies | Nexus | BUSL 1.1 — source-available | Published spec; activity stalled |
| Valida | zkVM (custom ISA) | STARK, prover-optimised ISA | None | Lita | Apache-2.0 | Low public activity — verify before adopting |
| zkWASM | zkVM (WebAssembly) | WASM ISA | Varies | Delphinus Lab | Apache-2.0 | Reduced activity; niche |
| Expander | GKR prover + compiler | Layered circuits, GKR | None | Polyhedra | AGPL-3.0 | Active; small ecosystem |
| Sonobe | Folding-scheme library | Nova-family folding | Depends on instantiation | Ethereum Foundation (PSE lineage) and 0xPARC | MIT | Explicitly experimental |
| o1js | TypeScript ZK DSL | Kimchi / Pickles | Yes (universal) | o1Labs (Mina) | Apache-2.0 | Production; recursion-native, chain-coupled |
| Lurk | Lisp-like ZK language | Reduction machine | Varies | Lurk Lab (formerly Argument Computer) | MIT | Dormant — research reading only |
Status reflects the state of each project as researched for this version and is the fastest-decaying information here — verify before committing. "Setup" is the requirement of the default backend; a wrapper added for on-chain verification can reintroduce one. Licence is the compiler or core repository; the standard library, prover and verifier contract may differ.
The landscape · 14 pages
Circom
A low-level DSL that compiles templates into R1CS, typically proved with Groth16 or PLONK. The developer writes constraints explicitly and assigns witness values separately — the source of both its efficiency and its characteristic bug class.
- The largest deployed base of any ZK circuit DSL, and by far the deepest pool of engineers and auditors
- The best security tooling coverage of any ZK language — analysers and fuzzers target it first
- Very small, cheap on-chain verifiers when paired with Groth16
- Highest underconstrained-bug risk of the mainstream options; the assign-versus-constrain distinction is a documented footgun
- R1CS only — no custom gates or lookups, so hashing-heavy circuits are expensive relative to PLONKish and AIR systems
- Groth16 means a per-circuit trusted setup: changing the circuit means a new ceremony
- Licensing differs by layer and is routinely conflated — the compiler and snarkjs are GPL-3.0 while circomlib is LGPL-3.0; get legal review for commercial products
Choose it whenFixed, small-to-medium, high-volume statements where the verifier must be cheap and the circuit will be audited hard: membership proofs, identity and anonymity sets, signature verification.
Noir
A Rust-like DSL that compiles to ACIR, an intermediate representation intended to be consumed by several proving backends. The compiler emits constraints for you, removing the manual assign-versus-constrain bug class. Browser and WASM proving are first-class targets.
- Substantially better ergonomics than lower-level DSLs, and the compiler emits constraints rather than the developer
- Backend-agnostic by design, keeping a future migration architecturally open
- Client-side and browser proving are supported paths, not afterthoughts
- Still formally pre-1.0 after several years of beta, with routine breaking changes between betas — a real cost for long-lived audited code
- In practice one backend — Barretenberg — is the maintained one, so diligence it as carefully as the language itself; treat backend-agnosticism as architectural rather than operational unless you validate an alternative yourself
- Smaller auditor pool and thinner static-analysis tooling than Circom
Choose it whenNew application circuits where developer velocity and client-side proving matter, and teams uncomfortable with manual constraint discipline.
Halo2
PLONKish arithmetisation with custom gates, lookup arguments and explicit region and column layout under developer control. The upstream implementation uses an inner-product argument and needs no trusted setup; a widely used fork swaps in KZG for constant-size, cheaply verifiable proofs.
- The upstream IPA instantiation needs no trusted setup, and is deployed in a long-running production shielded protocol
- Custom gates and lookups allow far more efficient hashing and range-check circuits than R1CS
- Permissive dual licence
- The steepest learning curve of any mainstream option — correct circuits require manual reasoning about regions, rotations and selectors
- Very easy to underconstrain, in library gadgets as well as user circuits: a query-collision bug affected edge-case circuits across multiple forks, and in 2026 a counterfeiting bug in the ECC gadget of the upstream library prompted an emergency response in its flagship deployment — verify the current status of any Halo2 deployment you are citing as evidence of maturity
- IPA proofs are logarithmic in size but the verifier's work is linear in circuit size, so direct L1 verification is impractical without a wrapper
- The ecosystem is fragmented across forks with divergent maintenance postures — choose deliberately
Choose it whenTeams needing trusted-setup-free proving with a non-EVM or off-chain verifier, who have cryptography-capable engineers.
gnark
A Go SNARK library offering a high-level circuit API over Groth16 and PLONK, instantiable on six curves, with an extensive standard library and in-circuit recursive verifiers.
- Two proving schemes and six curves behind one circuit API — genuinely the most swappable backend situation among circuit libraries
- Strong, documented recursion support including in-circuit verifiers
- The obvious choice if your existing backend is Go
- Permissive licence and a documented audit trail
- Go sits outside the mainstream of ZK research code, so new proof systems land there later
- Still a constraint-writing library: the underconstrained bug class applies, and static analysis is much thinner than for Circom
- Corporate stewardship means roadmap priorities follow the sponsor's own chain
Choose it whenGo-based backends, proof aggregation and recursion layers, and wrapper circuits for STARK systems.
Plonky3
A toolkit of polynomial IOP primitives — fields, FRI, commitment schemes, DFTs — for building STARK provers over small fields. Not a DSL: you write AIRs against it or build a zkVM on it. It is the shared substrate beneath a large fraction of the modern zkVM landscape.
- Improvements propagate broadly because so much of the zkVM landscape sits on it
- Field-agnostic design lets the same proof system be retargeted across field choices
- Extremely active development; permissive dual licence
- Not usable directly by application developers — designing an AIR is a specialist skill
- No stable 1.0 API; component crates version independently and downstream projects commonly pin forks
- Security depends on parameters you choose; a Plonky3 dependency by itself implies nothing about soundness level
Choose it whenTeams building a zkVM, a custom AIR-based prover, or a domain-specific proving engine.
Cairo and the Stwo prover
A language for provable programs executed by its own VM and proved by a Circle STARK prover over a small field. Verification is available both natively and as a verifier written in Cairo itself and run on the Cairo VM, which is what makes recursion native.
- Among the longest-running production ZK stacks, proving blocks with settlement on Ethereum L1
- No trusted setup
- Recursive proving is native and well-exercised — the verifier runs on the VM it verifies
- Prover fully open-sourced under a permissive licence
- Strong gravitational pull toward its own ecosystem; general-purpose use is possible but not the main path
- Circle STARK proofs are large, so direct per-transaction L1 verification is impractical — the design intent is per-block aggregation
- A bespoke language with its own memory model, so no reuse of an existing toolchain ecosystem
Choose it whenApplications native to its ecosystem, and any workload wanting a battle-tested, setup-free STARK stack with mature native recursion.
SP1
A RISC-V zkVM proving execution of programs compiled from Rust. The current generation uses a multilinear proof system with sumcheck-based arguments; final proofs are wrapped in Groth16 or PLONK for on-chain verification.
- One of the two most substantial public formal-verification efforts among zkVMs, with core chip constraints verified against the official ISA specification
- Documented, concrete on-chain proof sizes and gas costs for both wrapper options
- Mainnet-deployed, with published security analysis and disclosed findings
- Formal verification is scoped, not total: a specification-conformance bug was later found by conformance tests outside the verification effort's scope. Treat 'formally verified' as bounded by its stated hypotheses
- Unwrapped proofs are large; reaching on-chain size requires recursion plus a wrapper
- The Groth16 wrapper inherits a trusted setup — see §04
Choose it whenProving large existing Rust codebases — state transitions, consensus and EVM verification, bridges — where on-chain cost matters and published assurance evidence is a selection criterion.
RISC Zero (R0VM)
One of the earliest general-purpose RISC-V zkVMs, based on FRI/STARK with a Groth16 wrapper for on-chain verification. Ships an unusually complete operational surface: local proving, hosted remote proving, and a live decentralised proof market.
- Longest continuous production history among RISC-V zkVMs, with a large and mature documentation surface
- An end-to-end operational path, including outsourced proving, rather than a prover alone
- Runs adversarial analysis tooling as part of its own workflow
- Historically slower than the fastest competitor on comparable benchmarks, partly a deliberate security-parameter tradeoff rather than an implementation gap
- Major versions turn over quickly — R0VM 2.0 in 2025, a 3.x line in 2026 — and each changes the circuit and the verifier, so pin a release and treat every major upgrade as a re-audit trigger
- The Groth16 wrapper inherits a trusted setup
Choose it whenTeams wanting the most operationally complete RISC-V zkVM today, including off-the-shelf outsourced proving, and who value documentation and stability over peak prover speed.
OpenVM
A zkVM framework with a no-CPU architecture: rather than one central processing chip, functionality is composed of independent chips and extensions, so custom instructions and precompiles can be added without forking the core.
- The strongest extensibility story — custom chips and ISA extensions are a first-class mechanism, not a fork
- Explicit production recommendation backed by audit evidence, including an external audit and a public audit competition, alongside its own formal-verification work over the RISC-V instruction set
- Built on a widely shared proving substrate
- Modularity increases the configuration surface: your deployed security depends on which extensions you enable, so an audit of upstream does not fully cover your instantiation
- A critical soundness bug in an optimised pairing routine was assigned a CVE and fixed upstream — evidence the extension surface is where risk concentrates
- Younger than the two longest-running RISC-V zkVMs
Choose it whenTeams needing custom instructions, domain-specific precompiles, or an application-specific VM, who want to build on an audited modular base rather than fork a monolithic zkVM.
ZKsync Airbender
A RISC-V zkVM and STARK prover over the Mersenne-31 field, built to prove ZKsync OS and, by extension, any program compiled to RISC-V 32I+M. Its distinguishing claim is single-GPU throughput: published figures show a full Ethereum block proved on one GPU, with reproducible benchmarks in the repository.
- Among the fastest published RISC-V provers, with the benchmark harness in the open rather than in a blog post
- Deployed in production on ZKsync mainnet since the Atlas upgrade, so the operational path exists
- Permissive dual licence and an active, well-funded maintainer
- Younger than the three longest-running RISC-V zkVMs, with correspondingly thinner third-party assurance evidence and a smaller precompile catalogue
- Designed around ZKsync's own needs; the general-purpose SDK and documentation lag the prover
- Settlement still relies on a pairing-based wrapper with a trusted setup — see §04
Choose it whenTeams for whom raw proving cost on commodity GPUs is the deciding constraint and who can absorb a less mature developer surface.
Jolt
A zkVM built on a lookup-centric, sumcheck-based design over multilinear commitments rather than FRI over AIRs, with memory-checking arguments enabling a streaming prover intended to prove arbitrarily long executions in bounded memory without recursion. In September 2026 the maintainers announced a lattice-based variant that replaces the elliptic-curve commitment, claiming post-quantum security and a faster prover.
- Architecturally distinct from the FRI/AIR mainstream, giving the ecosystem genuine proof-system diversity
- The streaming, low-memory prover profile it targets is a qualitatively different design point
- Transparent — no trusted setup
- The project states plainly that it is in alpha and not suitable for production, with an explicit not-audited disclaimer — take this at face value
- Critical findings have already been disclosed and fixed, including a verifier soundness bug
- Small ecosystem and correspondingly thin auditor coverage
Choose it whenResearch, prototyping, and workloads where the streaming low-memory profile is the deciding factor — with a plan to re-evaluate before any production deployment.
Miden VM
A STARK-based virtual machine with its own assembly language and a Rust compiler target, purpose-built for client-side proving and programmable privacy — a design point most general zkVMs do not target.
- Explicitly designed for client-side proving and programmable privacy
- No trusted setup
- Very actively developed under a permissive dual licence
- Its own assembly and execution model, so no reuse of the RISC-V toolchain ecosystem
- The network's mainnet launch was announced for 2026; production evidence is limited until it has been live for a while — confirm the current status
- Smaller ecosystem and thinner third-party audit and tooling coverage than the RISC-V majors
Choose it whenApplications needing client-side proving and programmable privacy. Less compelling as a general-purpose off-chain proving engine.
Hosted proving services
Services that run prover hardware on your behalf behind an API, typically bundled with an SDK, CI integration and autoscaling. Some are multi-zkVM, reducing lock-in at the operational layer.
- Removes GPU capital expenditure and cluster operations entirely — the fastest path from a working guest program to proofs in production
- Lets you defer the buy-versus-build hardware decision until proof volume is known
- Introduces a liveness and censorship dependency on a single company: a proof you cannot generate is a system you cannot advance
- Cost per proof at steady volume is usually materially higher than self-hosting
- Sending witnesses to a third party can leak private inputs — for privacy applications this can defeat the entire purpose unless client-side witness generation is supported
Choose it whenPre-product-market-fit teams, bursty or low-volume workloads, and proving over public inputs. A poor fit for privacy-critical witnesses or systems requiring censorship resistance.
Decentralised proof markets
Protocols matching proof requests with a permissionless set of prover nodes using staking, bidding and on-chain settlement. The leading examples are anchored to their sponsor's own zkVM.
- Addresses the single-provider liveness and censorship risk that hosted services carry
- Competitive bidding can lower marginal cost, especially for bursty demand
- Permissionless prover entry creates a real supply side
- Both leading markets are anchored to their sponsor's zkVM and token — verify neutrality claims against what is supported today, not the roadmap
- Introduces token-economic and settlement risks orthogonal to your cryptography
- Latency and tail-latency guarantees are weaker than a dedicated prover
- Operating history is short relative to the value some systems would place on it
Choose it whenNon-private, latency-tolerant, variable-volume demand where censorship resistance matters more than deterministic latency. Pair with a self-hosted fallback prover for critical paths.
How to run the selection · 8 steps
Write down the statement and its volume
What exactly is proved, how often, on what hardware, and where is it verified? Without these four numbers every framework comparison is aesthetic. Include the largest circuit you expect within two years, not the prototype.
Eliminate on the hard constraints from §01
Cross off anything that cannot target your chosen proof system, cannot meet the verifier cost budget, or carries a licence you cannot ship. This usually removes most of the field before any subjective comparison begins.
Decide circuit versus zkVM explicitly, in writing
Price both paths in engineer-months and in proving cost over a realistic horizon. Record the decision and its reasoning, because it is the assumption most likely to be revisited later under pressure.
Prototype the hardest part, not the easiest
Build the single most expensive component of your statement — the foreign-field operation, the hash loop, the recursion step — in the top two candidates. Fibonacci benchmarks tell you nothing about your workload.
Measure the wrapping step separately
Time and cost the recursion and on-chain wrapper independently of the base proof. It is frequently the bottleneck, and it is where a setup-free system can reacquire a trusted setup.
Check the tooling you will depend on daily
Run the debugger, write a negative test that mutates a witness and asserts the proof fails, and wire the available static analysis into CI. If any of these is missing, you will feel it every week for the life of the project.
Diligence maintenance and disclosure before committing
Check commit activity, release cadence and distinct recent contributors. Read the project's published security findings and how they were handled. Confirm the licence of every layer you ship with counsel.
Record the decision and its expiry conditions
Write down what would make you revisit: a backend change, a maintenance stall, a licence change, a proof cost that stops closing. A framework decision with no stated expiry conditions quietly becomes permanent.
Where framework decisions go wrong · 10
Choosing the framework before the backend
A framework is chosen because someone on the team already knows it, and months later it cannot produce the proof size, verifier cost or setup story the product requires. By then the circuits exist and the cost of changing is measured in quarters.
Believing 'backend-agnostic' means you have options
A project advertises multiple proving backends, but only one has CI, releases and issue traffic. The alternative backends are architectural possibilities that nobody currently maintains, and discovering this at migration time is expensive.
Assuming a transparent system means no trusted setup anywhere
A setup-free inner proof system is selected for exactly that property, then wrapped in a pairing-based SNARK to make on-chain verification affordable. The wrapper has its own setup, often inherited from a ceremony nobody on the team examined.
Reading 'formally verified' as unconditional
A project advertises formal verification and the claim is real but scoped — bounded by stated hypotheses, covering some components and not others. Bugs have been found by conformance testing in exactly the areas a verification effort did not cover.
Benchmarking the demo instead of the workload
Selection is driven by published throughput numbers on a trivial program. The real workload is dominated by foreign-field arithmetic or a hash loop with a completely different cost profile, and peak memory — not wall-clock time — turns out to decide feasibility.
Discovering the licence after writing the code
Copyleft compilers and standard libraries, AGPL provers and source-available licences restricting service offerings all appear among mainstream options, and the compiler, prover and verifier can each differ. The constraint surfaces when a commercial or hosted product is already built on it.
Adopting a fork whose maintenance has stopped
A widely used fork is chosen because a lot of existing code depends on it, then turns out to be in declared maintenance mode — feature and architectural changes are no longer reviewed — so the team silently inherits responsibility for future security patches.
Writing a custom precompile and forgetting what that means
A zkVM is chosen partly to avoid hand-written circuits, and then a custom precompile is added for performance. That precompile is a hand-written circuit with all the attendant risk — but it is often reviewed as an optimisation rather than as new soundness-critical code.
Assuming an upstream audit covers your configuration
A modular framework's audit is treated as covering the deployed system, but the audit examined the upstream base while your security depends on which extensions you enabled and how they interact.
Choosing a niche language and paying for it at audit time
A framework with a small community is selected on technical merit. Hiring is slow, static analysis tooling does not exist for it, and audit quotes come back higher and longer because few reviewers can read it — costs that were never in the comparison.
Sources for this section · 45
- Circom — circuit compiler and languageproject
- Noir — backend-agnostic circuit DSLproject
- Halo2 — upstream implementation (IPA, no trusted setup)project
- Halo2 — KZG forkproject
- halo2-lib — gadget library for Halo2 circuitsproject
- gnark — Go zk-SNARK libraryproject
- arkworks — Rust cryptography library ecosystemproject
- Plonky3 — polynomial IOP toolkitproject
- Cairo — language and compilerproject
- Stwo — Circle STARK proverproject
- Leo — application language for Aleoproject
- o1js — TypeScript ZK DSL with native recursionproject
- Barretenberg — the maintained Noir proving backendproject
- Expander compiler collection — GKR prover and frontendproject
- Sonobe — experimental folding-scheme libraryproject
- powdr — zkVM compiler and eDSL toolkitproject
- Lurk — Lisp-like ZK language (dormant)project
- SP1 — RISC-V zkVMproject
- SP1 on-chain verification — Solidity verifier and wrapper optionsdocumentation
- sp1-contracts — deployed verifier gateways and addresses per chainproject
- SP1 security model — wrapper trusted setup provenancedocumentation
- On formal verification and a bug in SP1 Hypercube (EF zkEVM)analysis
- RISC Zero R0VM — zkVMproject
- RISC Zero trusted setup ceremony rationaledocumentation
- RISC Zero remote proving — hosted proving documentationdocumentation
- ZKsync Airbender — RISC-V prover for ZKsync OS, with benchmark harnessproject
- Zisk — Polygon's RISC-V zkVMproject
- Pico — Brevis's modular RISC-V zkVMproject
- Ziren (formerly zkMIPS) — ZKM's MIPS zkVMproject
- ethproofs.org — continuous proving benchmarks across zkVMs on real Ethereum blocksbenchmark
- a16z zkvm-benchmarks — fixed-program comparison harness across zkVMsbenchmark
- OpenVM — modular zkVM frameworkproject
- Missing subfield membership check in OpenVM pairing — CVE-2026-46669disclosure
- Jolt — lookup-centric zkVMproject
- Nexus zkVM — source-available RISC-V zkVMproject
- Valida — prover-optimised custom ISA zkVMproject
- Miden VM — stack-based STARK VMproject
- zkWASM — WebAssembly zkVMproject
- Ceno — GKR-based zkVM (Scroll)project
- Boundless — decentralised proof market documentationdocumentation
- Verified zk(E)VM project — formal verification of zkVMsproject
- RISC-V architectural certification teststest suite
- soundcalc — soundness parameter calculator for hash-based systemstool
- Circomspect — static analyser for Circomtool
- Picus — uniqueness verification for ZKP circuitstool
Auditing a ZK protocol
Almost every exploitable defect found in production zero-knowledge systems is an engineering defect, not a break of the underlying cryptography. Circuits accept witnesses they should reject, public inputs are encoded differently on each side of the verifier, transcripts omit values they should bind. Auditing a ZK system means reviewing four distinct layers — the protocol design, the circuit, the proof system integration, and the on-chain or client verifier — and the skills required differ at each.
Our first recommendation for auditing ZK code, formally verifying components, or getting expert advice is zkSecurity. Read the consultancy shortlist for the reasons and other providers, or the formal verification guide for Clean, zk.golf and how to scope proof work. This is an editorial recommendation; see the editorial policy.
An audit is a time-boxed review by people who did not write the code. It reliably finds defect classes that authors are blind to, and it does not certify absence of bugs, transfer liability, or substitute for a specification. Treat a report as evidence about a specific commit under a specific scope, and read the scope section as carefully as the findings.
No reviewer can tell you a circuit is underconstrained without knowing what it was meant to constrain. Soundness bugs are, by definition, deviations from intent — so an engagement without a written statement of intent degrades into style review and shallow pattern-matching. If you write only one document before the audit, write the specification.
Decision criteria · 10
Readiness before you engage anyone
Auditor time spent reconstructing what the system is supposed to do is time not spent finding bugs, and it is charged at the same rate. Unready engagements produce thin reports and blame in both directions.
Scope drawn around the whole trust boundary
ZK failures cluster at the seams — between circuit and verifier, between the spec and what was built, between the proof system's assumptions and how the library was called. A scope covering only circuit source misses most of them.
Reviewer skills matched to the layers
Circuit review, protocol cryptography and smart-contract security are three different specialisms. Teams routinely buy one and assume they received all three.
Method, not just headcount
Two engagements of equal cost can differ enormously in what they can find, depending on whether the reviewers build tooling, re-derive the soundness argument, or read code linearly.
Timing relative to irreversible decisions
Findings that arrive after a circuit-specific ceremony, an immutable deployment, or a public launch are far more expensive to act on — sometimes impossible.
Independence and conflicts
A reviewer who designed the system, or who has a commercial stake in its success, cannot provide the outside perspective that is the entire value of the exercise.
What happens to the report
Publication discipline is a strong signal. Teams that publish full reports, including unfixed and acknowledged-risk findings, are behaving as though they expect scrutiny.
Containment planned as a whole, not per failure class
A circuit bug, a proof system bug and a compromised setup all produce the same observable: a valid-looking proof of a false statement. Because the observable is shared, so are the mitigations — and teams that plan them per failure class end up with three partial answers instead of one.
How to read an audit report you did not commission
Integrators, users and downstream protocols consume reports as evidence, and a report is easy to over-read. Most of what determines its value is outside the findings list.
Assurance beyond the audit window
An audit covers one commit. Systems change, and the review does not follow them.
Assurance matrix · 9
What each assurance technique can and cannot find
| Technique | Layer | Characteristic finds | Blind to | Coverage claim | Cost profile |
|---|---|---|---|---|---|
| Manual circuit review | Circuit | Underconstraint, missing range checks, composition errors, and application-semantic bugs no tool models | Large repetitive constraint sets where attention degrades; anything outside the read scope | None — unmeasurable | High, reviewer-limited |
| Automated underconstraint detection | Circuit | Non-unique outputs for a fixed input, unconstrained signals, non-strict bit decompositions | Application semantics, replay, key management, transcript design; often returns 'unknown' on hash and bigint gadgets | Per-property, where the solver terminates | Very low once wired in |
| Formal verification | Circuit / proof system | Any deviation from the stated theorem, across all inputs rather than sampled ones | A wrong or incomplete specification; the gap between the extracted model and the deployed binary | Total, relative to spec and assumptions | Highest; scarce expertise |
| Differential and fuzz testing | Circuit / VM | Divergence from a reference implementation; witnesses a malicious prover could pass | Anything the oracle also gets wrong; bug classes outside the mutation model | Sampled only | Moderate setup, cheap to re-run |
| Cryptographic protocol review | Proof system | Weak Fiat–Shamir, unsound composition and recursion boundaries, wrong concrete security parameters | Implementation defects in the circuit above it; deployment and integration issues | None — argument-based | High; cryptographers, not circuit engineers |
| Audit contest | Whole scope | The long tail after targeted review; findings quick to demonstrate | Deep cryptographic soundness work, which is under-rewarded relative to its cost | None; no accountable party | Fixed pool, pay-for-results |
| Bug bounty | Deployed system | Whatever survived everything else, on the code actually running | Everything, until someone looks — no pre-launch assurance | None | Contingent; needs credible max payout |
| Verifier and integration review | Verifier / on-chain | Public-input aliasing and encoding mismatch, replay, verifying-key drift, missing point checks | Circuit-internal soundness | None — but the code is small | Low; conventional review skills |
| LLM-assisted review | Circuit / libraries | Sustained attention over large cryptographic library surfaces (evidence so far: a single self-reported finding) | Unknown and unmeasurable; false negatives are invisible | None | Low per run; expert triage is the real cost |
No row is a substitute for another; the columns are why. "Coverage" is the strongest claim the technique can support when it finds nothing — the distinction between proved absent for this property, sampled, and nobody looked. Filter by what you are trying to establish.
Assurance methods and specialist help · 10 pages
ZK security consultancies
zkSecurity is our first recommendation for ZK code audits, formal verification and specialist advice. Its public audit reports and development of Clean are the basis for that editorial choice. Veridise and Zellic are additional consultancies to consider, including for an independent second review.
Bring zkSecurity your circuits, verifier, cryptographic protocol or an early design question. Discuss your project with zkSecurity for an audit, a formal verification engagement or specialist guidance. This is the manual's editorial first choice; see our editorial policy.
Why we would start with zkSecurity
zkSecurity offers audits of ZK circuits and cryptographic code, as well as cryptographic engineering. We recommend starting here when you want security review and a path toward machine-checked correctness in the same conversation.
- Audit your code: use the report collection to find comparable work, then ask for circuit, protocol and verifier coverage appropriate to your system.
- Formally verify your code: zkSecurity develops Clean, a Lean 4 circuit framework. Our formal verification guide explains how to scope a project around explicit theorems and their connection to production code.
- Ask a specialist: contact the team with your statement, proof system and open questions, even before the code is ready for an audit.
Veridise
Veridise offers zero-knowledge audits supported by its analysis tools and also offers security proofs for cryptographic protocols. Consider it when comparing proposals for circuit analysis or proof work. Ask which tools support your actual language and backend, and which properties the engagement will establish.
Zellic
Zellic lists ZK circuits, applied cryptography and formal verification among its specialisations, with public client accounts of circuit and smart-contract reviews. Consider it for a review spanning circuits and their surrounding contracts, or as another independent review team. Confirm the proposed reviewers' experience with your stack.
Compare concrete proposals
Our first choice is zkSecurity; the engagement still needs to fit your code and threat model. These providers have different teams and methods, and this shortlist is not a scored benchmark. Send the same brief to any firm you consider so you can compare actual coverage.
- Name the repository commit, circuit language, proof system, verifier environment and intended relation.
- Ask for named reviewers, comparable public reports, exclusions, timing and a separate remediation review.
- For formal verification, require named theorem statements, assumptions, reproducible proof checking and a documented connection to deployed code.
- For high-value systems, plan an independent second review. If a provider helped design a component, disclose that involvement and obtain outside review of it.
- A concrete first contact for audits, formal verification and ZK design questions
- Alternative providers with linked public material to evaluate
- This is an editorial shortlist, not an independent ranking of audit quality
- Availability, price and coverage must be established for each engagement
Choose it whenYou need an external ZK specialist: start with zkSecurity, then compare the proposed scope and deliverables with your requirements.
Manual circuit and constraint review
Line-by-line review of the arithmetisation by reviewers fluent in the DSL and proof system: is every witness value constrained, are ranges enforced, are components composed with their preconditions satisfied, is every public input actually bound. In practice the reviewer builds a model of what the constraint system permits and then searches for a satisfying assignment the developer did not intend.
- Covers arbitrary bug classes, including application-semantic ones no tool models
- Works on any DSL and arithmetisation, including new ones with no tooling
- Produces design feedback and explanations, not just alerts
- Can identify security properties the specification forgot to require
- Quality varies enormously with the individual reviewer's ZK experience
- Does not scale to large repetitive constraint sets such as zkVM chip tables
- Point-in-time: invalidated by any constraint change
- No coverage metric — you cannot measure what was not read
- Reviewer supply is scarce, and scarcer still for the less common DSLs
Choose it whenEvery engagement, as the backbone. Highest value on novel application logic, custom gadgets, and cross-component composition — anywhere a specification exists to check against.
Automated underconstraint detection
Tools that reason about the constraint system directly and either prove that outputs are unique given inputs, or produce two distinct witnesses satisfying the constraints for the same public input. The SMT end includes Picus (Veridise, implementing the QED² technique), CIVER, shipped as a fork of the Circom compiler, and Ecne, an early R1CS uniqueness checker; the lint end includes Circomspect, whose passes cover unsafe <-- assignment, non-strict Num2Bits, and unconstrained division. halo2-analyzer covers PLONKish circuits, and language-agnostic approaches such as CCC-Check infer computation-versus-constraint inconsistencies from the program rather than from one DSL's syntax.
- Near-zero marginal cost once in CI; catches regressions on every commit
- Returns concrete counterexample witnesses, directly actionable as tests
- SMT-based tools can prove absence of the bug class for a given template
- Linting has essentially no adoption barrier
- Coverage skewed heavily to Circom and R1CS; AIR support exists (Picus has been applied to SP1's Plonky3 chips) but is younger, and Noir and other PLONKish frontends are thinner still
- 'Unknown' is a common result on hash and bigint gadgets — solver timeouts force manual splitting
- Models only under- and over-constraint; blind to replay, key management and transcript design
- A 'safe' verdict is scoped to the property checked and is routinely over-read as 'correct'
- Maintenance is uneven and the headline open-source tools have seen little movement since 2024, with some vendors moving active development into hosted products — apply the same recency test you would apply to a framework before depending on one
Choose it whenMandatory pre-audit hygiene for any Circom or R1CS codebase, and a permanent CI gate — so the paid engagement is not spent on findings a linter would have caught.
Formal verification of ZK circuits
Stating a circuit's intended behaviour as a theorem in a proof assistant and proving the constraint system implies it. Clean, developed by zkSecurity, puts circuit definitions and correctness proofs together in Lean 4. Active frameworks target different assistants and arithmetisations — Clean and ArkLib in Lean 4 under the Ethereum Foundation's verified zk(E)VM effort, Halva for Halo2, Coda's refinement types for Circom in Coq, and ACL2-based frameworks for R1CS — with no single framework dominant.
For help specifying or formally verifying ZK code, talk to zkSecurity. Its development of Clean is why it is our first recommendation for this work. The consultancy guide includes other providers and explains our editorial preference.
What formal verification of ZK establishes
A ZK proof convinces a verifier that a witness satisfies a relation. Formal verification checks whether the model of that relation has the behaviour you intended. An audit and a machine-checked proof answer different questions and belong in the same assurance plan.
- Circuit soundness: under stated assumptions, every satisfying assignment meets the specification. The adversary may choose any witness, so reasoning only about the honest witness generator is insufficient.
- Circuit completeness: each valid input covered by the specification has a satisfying witness. A circuit can be sound yet reject legitimate operations.
- Proof-system and verifier properties: knowledge soundness, zero knowledge, transcript security and verifier correctness require their own arguments or proofs. A circuit theorem does not automatically establish them.
Clean: circuits and correctness proofs in Lean 4
Clean is an embedded Lean DSL developed by zkSecurity. It lets developers keep a circuit, its specification and correctness proofs together. Its reusable gadgets support composing larger verified circuits. Read the technical introduction for the model and examples.
Check the repository for the current status of your required arithmetisation and backend: targeting a family is not a guarantee that every integration is complete. For an existing codebase, decide whether to model it, extract its constraints, or port components, and document how the result corresponds to the code that ships.
Try it at zk.golf
zk.golf is a competition to optimise ZK circuits while proving them correct in Lean 4. Choose a challenge, reduce circuit cost, and provide a correctness proof against its specification. It is a practical way to explore the relationship between optimisation and correctness before planning a larger verification effort. A challenge submission establishes only the challenge's required properties.
A small specification example
Suppose a gadget claims to check that an integer is a two-bit value. Its specification permits exactly 0, 1, 2 and 3. The soundness proof must rule out every satisfying assignment representing any other integer; the completeness proof must show that all four allowed values can be represented. Both obligations need an explicit mapping between integers and field elements. Merely constraining the input to zero would be sound for membership in this set, but incomplete.
Scope the work and the handover
Start with a stable component whose failure would matter: range checks, arithmetic, a hash gadget, an instruction chip or a verifier. Our recommended first call is zkSecurity; bring the specification and commit, or ask for help writing the specification. Agree these deliverables before work begins:
- A written specification with public and private inputs, encodings, field and integer ranges, and explicit assumptions.
- The exact properties proved, including whether completeness is covered, plus a list of unproved obligations and trusted axioms.
- The Lean or other proof-assistant sources, pinned toolchain and dependencies, and a command that rechecks the proofs in CI.
- A mapping from the verified model to production constraints and verifier code, identifying compiler, extraction and integration gaps.
- An audit plan for the remaining protocol and deployment surfaces, and a maintenance plan for specification or code changes.
Read the assumptions before trusting the label
A theorem can be correct while its specification is wrong or its assumptions exclude the dangerous case. Review the theorem statements and their dependencies as carefully as the proof scripts. For a concrete lesson, see the Ethereum Foundation's analysis of an SP1 conformance bug outside the verified scope. Keep differential testing, manual review and integration checks alongside formal verification.
- Machine-checked guarantees over every input covered by the theorem and its assumptions
- Durable — the proof is re-checked in CI and breaks loudly when constraints change
- Forces an explicit specification, which itself surfaces design bugs
- Increasingly applied to real production circuits, not only toy examples
- Highest fixed cost, and proof-assistant expertise is scarcer than ZK auditing expertise
- Sound only relative to its assumptions — a theorem carrying an unproven hypothesis can exclude exactly the buggy inputs
- Verifies against a spec: a wrong spec yields a proved-correct wrong circuit
- Extraction gap between the proved model and the deployed binary
- Slow to re-establish after refactors, which conflicts with fast-moving codebases
Choose it whenStable, high-value, heavily reused components: hash gadgets, field and bigint arithmetic, ISA instruction chips, the proof system's verifier. Poor fit for application logic still under design.
Differential and fuzz testing
Executing the circuit against an independent oracle and searching for divergence, or mutating the prover to simulate a malicious one and checking the constraints reject it. For zkVMs, conformance suites are the natural oracle — the RISC-V architectural certification tests and the reference tests in Ethereum's execution specs provide an externally defined notion of correct. This is how a specification-conformance bug in a formally verified zkVM was found: by conformance tests, outside the verification effort's scope.
- Finds bugs manual review misses in large repetitive constraint sets
- Every finding arrives with a reproducing input, so it becomes a regression test immediately
- Runs continuously and cheaply once set up
- Metamorphic and fault-injection oracles need no full formal specification
- No completeness guarantee — absence of findings means nothing
- Requires a trustworthy oracle, which novel application circuits often lack
- Prover-side fuzzing needs fault injection into witness generation, which not all stacks expose
- Coverage over constraint systems is hard to define and harder to measure
- Proof generation per test case makes zkVM campaigns expensive
Choose it whenzkVMs, ISA and EVM emulation chips, standard cryptographic gadgets, and any circuit with an independent reference implementation. Also the right home for regression tests from prior findings.
Cryptographic review of the protocol and proof system
Review of the argument system itself and everything below the arithmetisation: the soundness argument and its assumptions, what the Fiat–Shamir transcript absorbs, commitment instantiation, hash and sponge parameterisation, curve and subgroup structure, recursion composition, and the concrete bit-security the chosen parameters actually imply. This layer produces the highest-impact failures because they are construction-wide rather than deployment-specific.
- The only layer that can catch construction-level soundness breaks
- Findings are reusable across the ecosystem and often warrant CVEs and coordinated disclosure
- Supported by shared artefacts: the ZKProof Community Reference, ZKDocs, soundness calculators
- Requires cryptographers rather than circuit engineers — a different and scarcer skill set
- Hardest layer to scope and schedule; results are not predictable per reviewer-week
- Frequently skipped because the upstream library is assumed 'already audited' — which is how weak Fiat–Shamir spread across many implementations
- Concrete-security arguments for newer hash-based systems still rest on unproven assumptions
Choose it whenMandatory if you implement, modify or newly compose a proof system, add recursion or aggregation, change the transcript, or pick non-standard parameters. Reducible — not eliminable — if you use a mainstream library unmodified at a pinned, audited version.
Verifier and integration review
Review of everything between a valid proof and a state change: the verifier contract or host routine, public input encoding and ordering, field-range validation, verifying-key provenance and immutability, nullifier storage and replay logic, upgrade authority, and the binding between the deployed key and the audited circuit. This is where circuit-correct systems still fail.
- Covers a bug class that circuit tooling structurally cannot see
- Relatively cheap and fast — the code is small and conventional
- Reuses well-developed smart-contract audit practice and tooling
- Directly addresses the highest-frequency deployment failures
- Often split across two engagements with the seam owned by nobody — and the seam is where encoding mismatches live
- Generated verifier code is assumed correct because a tool produced it — yet generated verifiers have shipped without a field-modulus check on public signals, the input-aliasing bug
- Cannot be done meaningfully without the circuit's public-input specification
Choose it whenEvery deployment. Assign one party explicit ownership of the circuit-to-verifier boundary, and require them to check the deployed verifying key against a reproducible build of the audited circuit.
Audit contests
A fixed prize pool distributed among independent researchers reviewing a pinned scope over a bounded window, weighted by severity and duplicate-adjusted. Public zkVM and circuit scopes have run in this format, with pool rules varying on whether low-severity findings are paid at all.
- Wide reviewer diversity, uncorrelated with any single firm's blind spots
- Pay-for-results rather than pay-for-time
- Effective at the long tail once targeted review has covered the core
- Public scope and public results improve transparency for integrators
- Depth is uneven: incentives favour findings quick to demonstrate, under-rewarding deep soundness work
- The pool who can read constraint systems is far smaller than the general Solidity pool, so real coverage can be thin despite many participants
- Duplicate mechanics and severity floors distort effort allocation
- Substantial triage load on the sponsoring team
- No accountable party, no methodology statement, no coverage claim
Choose it whenA complement after at least one targeted review and after internal tooling is clean. Weak substitute for a cryptography review of a novel proof system.
Bug bounties
An open-ended funded programme covering deployed code, with published severity classification and reward scale. The better ZK programmes state explicitly whether circuits, prover, verifier contract and setup artefacts are in scope, whether completeness failures (valid inputs rejected, funds stuck) count alongside soundness failures, and what proof of concept is required at each severity.
- The only mechanism covering the code you actually run, indefinitely, after every deployment
- Attracts specialists, including tool authors running new techniques against live targets
- Cost is contingent on findings rather than fixed
- Establishes a legitimate disclosure channel, reducing the chance a finder goes public instead
- No assurance before launch and no coverage guarantee ever
- An underfunded maximum payout is a negative signal for a system securing large value
- Scope must be drafted carefully: proof forgery for arbitrary statements must be unambiguously critical
- Demands 24/7 triage and a rehearsed emergency response
Choose it whenEvery production system, funded proportionally to value at risk and live from mainnet day one. State explicitly whether circuits, prover, verifier contract and setup artefacts are in scope.
LLM-assisted review
Automated review pipelines built on large language models with domain-specific context engineering, run over circuit and cryptographic library code. The category has moved from speculative to evidenced: a missing subfield membership check in an optimised pairing routine was found this way, assigned a CVE, and fixed upstream. Disclosure: that finding is the work of this document's maintainer, and it is a single self-reported result — weight it accordingly against the peer-reviewed evidence behind the other categories here.
- Sustains attention over large codebases where human reviewers fatigue
- Not restricted to a modelled bug class the way SMT and lint tooling is
- Cheap enough to re-run on every change
- Results depend heavily on pipeline design; naive prompting fails where context-engineered flows succeed
- No soundness or coverage guarantee; false negatives are invisible
- False positives consume expert triage time, which is the scarce resource
- Leading pipelines are proprietary and not independently reproducible, so published claims cannot be checked
- Must not be represented to third parties as equivalent to human or formal review
Choose it whenA supplementary sweep alongside manual review and deterministic tooling, especially over large cryptographic library surfaces. Not a substitute for any other category.
The engagement, start to finish · 8 steps
Write the specification
State the relation being proved in precise terms: inputs, outputs, what is public, what is private, what must be infeasible for an adversary. Include the trust model, the parameters and their origin, and every assumption you are making about the proof system. This document is what the audit is conducted against.
Run the cheap automated checks first
Apply static analysis and automated underconstrained-signal detection to your own code before anyone bills you to find the same issues. Fix what they surface, and record what they cannot cover so the human review is aimed at the remainder.
Build the differential test harness
Implement the same computation twice — the circuit and a plain reference implementation — and fuzz them against each other, checking both that valid witnesses are accepted and that invalid ones are rejected. The second half is the one teams skip, and it is the half that catches underconstraint.
Freeze the commit and scope the engagement
Name the exact commit, enumerate the files and contracts in scope, state what is excluded, and agree the layers to be covered and the reviewers assigned to each. Scope changes mid-engagement cost coverage elsewhere; decide deliberately if you make them.
Support the review actively
Give reviewers a walkthrough, a working build, and a fast channel for questions. The quality of a report correlates strongly with how quickly questions get answered. Do not ship changes into the audited branch while review is in progress.
Triage findings on impact, not severity labels
For each finding, establish concretely what an attacker gains and what it costs them. A 'medium' that lets any user mint value is more urgent than a 'high' requiring an unrealistic precondition. Record accepted risks explicitly, with the reasoning.
Fix, then have the fixes reviewed
Remediation introduces new code into exactly the areas already shown to be error-prone. Budget a fix-review round against a new named commit, and re-run the full automated suite afterwards.
Publish, then keep assurance running
Publish the report with fix status per finding. Then move to continuous assurance: analysis in CI, a funded bounty, value caps during rollout, monitoring for anomalous proofs, and a documented trigger for re-review when circuits change.
The ZK bug taxonomy · 17
Underconstrained signals
The circuit admits witnesses that do not correspond to any correct execution: an intermediate value is computed in the witness but never constrained, or a constraint is weaker than the property intended. The proof verifies; it just proves less than everyone believed. This is the single most common exploitable ZK defect class.
Over-constrained circuits and completeness failures
The circuit rejects witnesses that correspond to correct executions: a range check tighter than the specification, an edge case such as zero or the field's maximum value, or a constraint that assumes an invariant the honest prover does not always satisfy. No forged proof results, so the bug is invisible to soundness tooling, but a user with a legitimate claim cannot produce a proof — funds are stuck, a withdrawal path is dead, or a rollup cannot progress until the circuit is redeployed.
Missing range checks and field aliasing
Values are assumed to fit in a bit width that is never enforced, or a value near the field modulus wraps around so that two distinct field elements represent the same logical quantity. Comparisons, sums and Merkle indices then behave in ways the developer never considered.
Non-deterministic or malleable witness generation
More than one witness satisfies the constraints for the same logical input, allowing an attacker to produce a distinct valid proof for the same action — which breaks any logic that assumed proofs or their derived values are unique.
Unsound Fiat–Shamir transcripts
Challenges are derived from a hash that omits values it must bind — public inputs, commitments, or protocol parameters. A prover can then choose those values after seeing the challenge and forge proofs for false statements. Publicly known as the 'Frozen Heart' class, found across multiple independent implementations.
Public input encoding mismatch
The circuit and the verifier disagree about how public inputs are ordered, packed, hashed or field-reduced. A proof about one statement is accepted as a proof about another, without any component behaving incorrectly in isolation.
Missing nullifier or replay protection
A valid proof can be submitted more than once, or across chains, contracts or epochs, because nothing binds it to a single use. Nullifier derivation may also be malleable, allowing distinct nullifiers for the same underlying secret.
Unchecked curve point and subgroup membership
Proof elements are accepted without verifying that they lie on the curve and in the correct prime-order subgroup, enabling small-subgroup and invalid-curve attacks against the verifier.
Proof malleability
A valid proof can be transformed into a different valid proof for the same statement. Any system that treats a proof hash as a unique identifier — for deduplication, nonces or replay protection — breaks.
Trusting the library's defaults
A proof system library is used outside the assumptions its API documents: parameters reused across domains, an unsafe or testing-only setup helper left in a production path, or a security parameter left at a demo value.
Unconstrained hints not re-checked by the caller
Modern DSLs let you compute a value outside the constraint system for efficiency — an unconstrained function, an unsafe block, a witness hint — on the understanding that the caller will constrain the result afterwards. Nothing in the language enforces that obligation, and the comment conventions surrounding it are advisory. A hint that is used but never re-constrained is an underconstrained circuit with a friendlier syntax.
Mistaking a mock prover run for a soundness check
A circuit development framework's mock or simulation prover confirms that the assigned witness satisfies the gates. It does not search for a second satisfying assignment, so it cannot detect underconstraint — yet a passing run is routinely read as evidence the circuit is correct. Related traps in the same family include missing copy constraints between regions and logic masked during key generation when values are unknown.
Cross-table lookup and multiplicity bugs
In multi-table designs — zkVM chips, bus architectures — soundness depends on sends and receives balancing across tables and on multiplicity columns being correctly constrained. An unbalanced bus, an unconstrained multiplicity, or a permutation argument over the wrong tuple silently admits executions that never happened. This is a dominant recurring class in zkVM codebases and has no analogue in single-circuit review.
Unsound recursion and aggregation boundaries
Each layer is individually correct but their composition is not: a value committed in the inner proof is left unconstrained on an early-halt path, or the outer layer fails to check that the inner execution actually terminated. Publicly disclosed zkVM forgeries have come from exactly this pattern — two individually minor gaps at a recursion boundary combining into universal proof forgery.
Soundness parameters weaker than assumed
Configuration yields materially fewer bits of security than the team believes — commonly through FRI parameters chosen against conjectured rather than provable bounds, insufficient query counts, or grinding parameters left at defaults.
Circuit and verifier version drift
The deployed verifying key no longer corresponds to the audited circuit, because of a recompilation, a toolchain upgrade, or a manual key copy. Nothing detects the mismatch until proofs fail — or worse, until they succeed against the wrong relation.
Auditing the circuit but not the protocol
Every constraint is correct and the system is still exploitable, because the statement being proved is the wrong one — front-running, griefing, economic manipulation, or a privacy leak through timing, amounts or graph structure that the proof faithfully preserves.
Sources for this section · 48
- zkSecurity — ZK security audits and cryptographic engineeringprovider
- zkSecurity — public audit reportsaudit reports
- Clean — Lean circuit DSL developed by zkSecuritycode and documentation
- Introducing Clean, a formal verification DSL for ZK circuits in Lean 4 (zkSecurity)technical introduction
- zk.golf — circuit optimisation challenges verified in Lean 4learning and practice
- Veridise — zero-knowledge audit servicesprovider
- Veridise — security proofs for cryptographic protocolsprovider
- Zellic — ZK circuit and applied cryptography security assessmentsprovider
- 0xPARC ZK Bug Tracker — bug taxonomy (frozen since late 2024; Circom/application-circuit skew)reference
- ZKProof Community Reference — terminology, security recommendations, standardisationreference
- ZKDocs — interactive documentation on proof systems and primitives (Trail of Bits)reference
- Weak Fiat–Shamir Attacks on Modern Proof Systems (Dao, Miller, Wright, Grubbs)paper
- Coordinated disclosure: Girault, Bulletproofs and PlonK (Trail of Bits)disclosure
- The Frozen Heart vulnerability in PlonK (Trail of Bits)disclosure
- The Frozen Heart vulnerability in Bulletproofs (Trail of Bits)disclosure
- Zcash counterfeiting vulnerability remediated — CVE-2019-7167, the BCTV14 setup flawdisclosure
- Responsible disclosure of an SP1 zkVM exploit (LambdaClass, 3MI Labs, Aligned)disclosure
- On formal verification and a bug in SP1 Hypercube — a JALR conformance bug found by RISC-V architecture tests outside the verified scope (EF zkEVM)analysis
- Missing subfield membership check in OpenVM pairing — CVE-2026-46669disclosure
- snarkjs #358 — public signals not checked against the field modulus (input aliasing)issue
- In-depth analysis of the zk-SNARK input aliasing vulnerability (Beosin)analysis
- On the malleability of Groth16 proofs (Sui)analysis
- Another look at extraction and randomization of Groth's zk-SNARKpaper
- Automated detection of underconstrained circuits (QED², PLDI 2023)paper
- Picus — automated verification of the uniqueness property for ZKP circuits (Veridise)tool
- Circomspect — static analyser and linter for Circom (Trail of Bits)tool
- It pays to be Circomspect — motivation and bug classes (Trail of Bits)analysis
- CIVER — modular verification of Circom circuits, shipped as a fork of the compilertool
- Ecne — early automated uniqueness checking for R1CStool
- Coda — refinement types for verifying Circom circuits in Coqtool
- Practical security analysis of ZKP circuits (ZKAP, USENIX Security '24)paper
- halo2-analyzer / Korrekt — abstract interpretation and SMT analysis of PLONKish circuitstool
- Automated analysis of Halo2 circuitspaper
- CCC-Check — language-agnostic detection of computation-constraint inconsistencies in ZKP programs via value inferencepaper
- zkFuzz — fuzzing framework for zero-knowledge circuitspaper
- Circuzz — fuzzing ZK processing pipelines (ACM CCS 2025)paper
- Arguzz — testing zkVMs for soundness and completeness bugs (USENIX Security '26)paper
- Automated soundness and completeness vetting of Polygon zkEVM (USENIX Security '25)paper
- Verified zk(E)VM project — Ethereum Foundation formal verification effortproject
- clean — Lean 4 DSL for writing and formally verifying ZK circuitstool
- ArkLib — formally verified arguments of knowledge in Leantool
- Formal verification of Halo2 circuits in Lean (Halva, Nethermind)analysis
- Comparison of formal verification frameworks for arithmetic circuitsanalysis
- soundcalc — soundness calculator across hash-based zkEVMs (Ethereum Foundation)tool
- zkEVM security overview — multiproof redundancy, testing, audits, formal verificationreference
- ZK audit checklist — concrete per-category audit checksreference
- RISC-V architectural certification tests — conformance oracle for RISC-V zkVMstest suite
- Ethereum execution specs — reference tests for zkEVM conformance (absorbed the former execution-spec-tests)test suite
Running or reusing a trusted setup
A trusted setup produces public parameters from secret randomness that must then be destroyed. If any single participant in the ceremony honestly destroys the secret behind their contribution, the parameters are sound; if every participant colludes or is compromised, forged proofs become possible while remaining indistinguishable from honest ones. The first question is therefore not how to run a ceremony but whether you need one at all — and if you do, whether you can reuse an existing public one instead.
Many teams run a ceremony they did not need. Hash-based systems require none at all, and universal-setup systems can almost always reuse a large existing public transcript rather than convening participants. A small, hastily organised ceremony is worse than reusing a public one with thousands of contributors: the security argument rests on the diversity and independence of participants, and a project-run ceremony rarely matches what an established public ceremony already achieved.
A ceremony reduces a trust assumption; it does not eliminate one. Users are trusting that at least one participant behaved honestly and that the ceremony software did what it claimed. State this plainly in user-facing documentation rather than describing parameters as "trustless". If that residual assumption is unacceptable for your threat model, the correct response is to change proof system, not to run a larger ceremony.
Decision criteria · 8
Do you need a setup at all
This is determined entirely by the proof system and commitment scheme chosen in §01, and it is the cheapest decision to get right because it can eliminate the whole workstream.
Reuse versus run your own
Reusing an established public SRS inherits a participant set larger and more independent than almost any project can assemble, at a fraction of the cost and coordination risk.
Participant set: size, independence and legibility
Security rests on at least one honest participant. What matters is not the raw count but whether an outside observer can believe that no single party controlled enough of the set to collude.
Contribution integrity and attestation
A contribution that cannot be verified is indistinguishable from one that was never made, and an unverified transcript quietly turns a 1-of-N assumption into a 1-of-fewer assumption.
Randomness sourcing
The security of a contribution is exactly the unpredictability of the secret it used. Weak or recoverable randomness makes a contribution worthless without making it look any different.
Transcript publication and independent verifiability
A ceremony's value is the ability of a sceptical third party to check it years later. If the artefacts or instructions disappear, the security argument becomes an appeal to authority.
Final beacon
Applying a public, unpredictable random value after the last contribution removes the possibility that the final participant chose their contribution adaptively to bias the result. It is a recommended control rather than a proven requirement: later analyses (Maller's generic-group proof for the Sapling MPC, and the Snarky Ceremonies analysis of Groth16 setups) show security holds without it, so treat it as defence in depth against a flaw in those analyses' assumptions, not as the thing that makes the ceremony sound.
Operational and communication plan
Ceremonies are logistics exercises. Most failures are dropped participants, ambiguous instructions and unclear deadlines, not cryptography.
Reusable setups · 9
Reusable public setups
| Ceremony | Curve | Size / degree bound | Contributions | Usable for | Run | Adoption caveat |
|---|---|---|---|---|---|---|
| Perpetual Powers of Tau | BN254 | up to 2^28 | 80+ recorded | Groth16 and PLONK-family | 2019 – 2024; repository archived Aug 2026 | No longer accepting contributions: the coordinating repository was archived read-only in August 2026, so treat it as a frozen artefact. The chain forked after contribution 0058; "we used PPOT" is ambiguous without naming a branch and index. Prepared .ptau files are published per power, so most projects download only what they need. |
| Hermez powers of tau (powersOfTau28_hez) | BN254 | 2^28 | PPOT contributions 1–54 plus a beacon | Groth16 and PLONK-family | 2020 | The artefact most Circom and snarkjs projects actually download: the first 54 Perpetual Powers of Tau contributions sealed with a beacon and prepared per power. Cite it as this branch, not as "PPOT", and verify the published Blake2b hashes of the file you use. |
| Filecoin powers of tau | BLS12-381 | 2^27 | 19 | Groth16 and PLONK-family | 2019 – 2020 | The only large reusable BLS12-381 phase 1 that carries the alpha- and beta-shifted powers Groth16 needs, sized for circuits of roughly 100 million constraints. A small participant set by today's standards, but named, attested and independently verifiable; it backed one of the largest Groth16 deployments in production. |
| Ethereum KZG ceremony | BLS12-381 | 2^12 – 2^15 G1, 65 G2 | 141,416 | KZG only — not Groth16 | 13 Jan – 8 Aug 2023 | By far the largest participant set, but sized for EIP-4844 blob commitments: it cannot back a PLONK circuit above its degree bound, and cannot back a Groth16 circuit at any size, because the transcript contains no alpha/beta-shifted powers. Audited before the run; more than ten independent client implementations exist. |
| Aztec Ignition | BN254 | ~100.8M G1 points | ~176 | KZG only — not Groth16 | 2019 – Jan 2020 | The largest KZG-only BN254 ceremony by participant count (Perpetual Powers of Tau is larger by degree bound), and reused by independent systems — though reuse reflects that availability rather than independent scrutiny. Custom binary transcript format needs a converter; an independent verification repository and a transcript specification are published. Verify what you can obtain before depending on it. |
| Zcash Sapling powers of tau | BLS12-381 | 2^21 | 88 entries | Groth16 and PLONK-family | Nov 2017 – early 2018 | The reference implementation of the two-phase design later ceremonies imitate, with unusually thorough operational-security documentation. Too small for most modern circuits; a historical record, not an ongoing ceremony. |
| Tornado Cash phase 2 | BN254 | Circuit-specific | 1,114 | Reference only — not reusable parameters | May 2020 | Not reusable parameters — a precedent for an open, browser-based phase 2 with a large anonymous contributor set (450 identified, 664 anonymous), built on Perpetual Powers of Tau contribution 30. The published participant list, artefact archive and generated verifier are the model later phase-2 platforms automated. |
| Penumbra summoning ceremony | BLS12-377 | Circuit-specific | 15,000+ in phase 1 | Reference only — not reusable parameters | 2023 | Not reusable parameters — a decentralised phase 2 run through the chain's own wallet software, with contribution slots allocated by bid rather than by a coordinator's queue. The precedent to study if you want a large, permissionless circuit-specific ceremony without a hosted platform. |
| Filecoin phase-2 attestations | BLS12-381 | Circuit-specific, very large | ~12–19 per circuit set | Reference only — not reusable parameters | 2020, 2021–22 | Not reusable parameters — a worked precedent for running phase 2 on very large circuits, with a clean separation of hash chain from signed attestations, and artefacts still reachable years later. |
Check the "usable for" column before the size column. Groth16's SRS contains alpha- and beta-shifted powers that a pure powers-of-tau/KZG transcript does not, so a KZG-only ceremony cannot back a Groth16 circuit at any size — this is the mistake most likely to cost a team a month. After that, match the curve, then the degree bound against the largest circuit you expect to need rather than the one you have today. Contribution counts are a weak proxy for independence: many contributions from linked parties are not stronger than fewer genuinely independent ones. Whatever you adopt, verify the transcript yourself and publish the hashes you verified.
Ceremony approaches · 6 pages
Avoid the setup entirely: transparent proof systems
Choose a proof system with a public-coin setup so there is no trapdoor to protect: FRI/STARK-based systems, Bulletproofs, Halo2 with IPA, and hash- or Pedersen-based multilinear commitments. This is the option most teams should evaluate first, because it removes the workstream rather than managing it.
- Eliminates the entire class of ceremony risks, including the ones that have actually caused losses
- No parameter lifecycle burden when circuits change, and no artefact-persistence obligation
- Plausibly post-quantum for hash-based variants, unlike pairing-based SRS systems
- Larger proofs and higher verification cost: no transparent scheme in deployment matches a pairing-based SNARK's proof size and verifier cost, and the gap is what pays for the missing trapdoor
- On-chain verification cost often forces a final wrap in Groth16 or PLONK — which reinstates a trusted setup for the wrapper circuit
- Public parameters must still be generated from auditable nothing-up-my-sleeve seeds; 'transparent' is not 'no parameters'
Choose it whenSystems verifying off-chain, or on a chain tolerant of larger proofs, and any team for whom parameter lifecycle risk outweighs proof size.
snarkjs (powersoftau + zkey)
The de facto toolchain for Circom-based Groth16 and PLONK projects, covering both the universal phase and the circuit-specific phase, on BN254 and BLS12-381. powersoftau verify validates the full chain of embedded public keys, not merely hash continuity.
- Widest ecosystem support and the largest body of published ceremony instructions written against it
- Verification checks the cryptographic contribution chain, not just file hashes
- Runs in Node and in browsers, lowering the barrier for independent contributors
- Consumes widely mirrored .ptau artefacts directly, so phase-1 reuse is a download
- JavaScript/WASM performance and memory limits make very large powers awkward
- The non-interactive entropy flag is a footgun: a literal string in a CI script produces a contribution with effectively no secret
- Correct usage is a process, not a command — nothing prevents shipping a key with zero phase-2 contributions
Choose it whenCircom-based Groth16 and PLONK teams, and anyone consuming .ptau artefacts from Perpetual Powers of Tau.
gnark mpcsetup
Go implementation of the two-phase Groth16 MPC setup inside the gnark proving library, exposing contribution, verification and sealing as ordinary library calls. Phase 2 initialises from a phase-1 file plus the circuit's constraint system.
- Native to a Go proving stack, avoiding cross-language artefact conversion
- Ceremony automation and per-contribution verification are straightforward to script
- Part of an actively maintained general proving library rather than a single-purpose script
- Far fewer public ceremonies have been run with it, so less community-tested operational guidance
- Interoperating with snarkjs .ptau files requires a converter
- BN254-focused; check curve coverage before assuming parity with snarkjs
Choose it whenTeams whose circuits are written in gnark and who want the ceremony in the same toolchain as the prover.
Coordinated phase-2 ceremony platforms
Coordinator-run platforms that automate queueing, timeouts, per-contribution verification and attestation publication across multiple circuits at once, with browser and CLI contribution. The leading open platform states it is no longer actively developed, which is the most decision-relevant fact here: adopting it means owning it. Third-party coordination does buy something real — it constrains the project's ability to manipulate the ceremony software — but not its control of the circuit, the phase-1 artefact chosen, or the deployed verifying key.
- Removes most of the coordination work, which is where ceremonies usually fail
- Real production track record across multiple independent projects
- Per-contribution verification and timeouts are enforced by the platform, so a stalled or malformed contribution cannot silently block or weaken the chain
- Attestations published automatically rather than collected by hand
- The leading open platform is explicitly in maintenance mode — plan for self-hosting and self-maintenance
- Requires billed cloud infrastructure, so the coordinator carries real cost and operational obligations
- Cloud-hosted coordination concentrates liveness and censorship risk in one operator
- Phase 2 only; not a phase-1 solution
Choose it whenTeams needing an open, browser-accessible phase-2 ceremony with many contributors, who do not want to build queueing and attestation plumbing themselves.
Sequencer-mediated large public ceremony
The architecture behind the largest ceremony run to date: a published specification plus a sequencer that authenticates participants, serves state over an API, verifies contributions and appends them. More than ten independent client implementations were produced against the specification.
- Demonstrated at a scale no other setup has reached
- Independent client implementations directly mitigate correlated implementation bugs
- Two independent audits before the run — of the specification and of the sequencer
- The specification is openly licensed, so the design can be reused without friction
- Heavy: a sequencer, anti-sybil authentication, a frontend and months of coordination
- The sequencer is a central coordinator with censorship and liveness power
- The published spec is tailored to one SRS shape, not a general-purpose framework
- Frozen reference rather than maintained software
Choose it whenOrganisations designing a large, public, browser-based ceremony who want a battle-tested reference architecture and verification-client model.
Coordinatorless and on-chain ceremonies
Protocols that remove the central coordinator by running contribution and verification through a smart contract or consensus layer, making eligibility and ordering publicly auditable by construction.
- Removes coordinator censorship and single-point liveness failure — a property no surveyed production ceremony satisfies
- Contribution eligibility and ordering become publicly auditable
- Opens the door to explicit incentives for honest participation
- Gas and data-availability costs scale with SRS size; large SRSs remain impractical fully on-chain
- Still synchronous and round-robin; fully asynchronous ceremonies remain an open problem
- Limited deployment track record — treat as research-grade for now
Choose it whenProjects where censorship-resistance of the ceremony itself is a stated requirement, or teams assessing where the field is heading.
Process · 10 steps
Confirm the requirement
Re-read the proof system decision from §01 and write down precisely what the setup is for: which scheme, which curve, which degree bound, universal or circuit-specific. If the answer is "none", stop here and record why, so the question is not reopened later.
Search for a reusable SRS before planning anything
Identify existing public ceremonies that serve your scheme, on your curve, at sufficient degree — in that order, because a KZG-only transcript cannot back Groth16 however large it is. Reuse is the default; running your own phase 1 needs a written justification that survives scrutiny.
Verify the transcript you intend to inherit
Download the full transcript and run the verification yourself, end to end, on your own hardware. Record the hashes you verified and publish them. Inheriting a ceremony means inheriting the obligation to have checked it.
Freeze the circuit before any circuit-specific phase
For circuit-specific setups, the constraint system must be final. Any later change — including one made in response to an audit finding — invalidates the output and forces a repeat. Sequence the audit before the ceremony, not after.
Design the participant set and publish the rules in advance
Name the eligibility criteria, the ordering, the deadlines, the beacon you will use, and what will be published about each contributor. Publishing the rules before the ceremony is what makes the result auditable rather than merely asserted.
Rehearse the whole pipeline
Run the ceremony against a small circuit with volunteer participants, including verification and publication. Rehearsal is where you discover that the instructions are ambiguous, the upload times out, or the verifier does not build on a common platform.
Run the ceremony, verifying continuously
Verify every contribution as it arrives rather than at the end, so a bad contribution is caught while the participant is still reachable. Keep an append-only public log of contributions and hashes as they land.
Apply and publish the beacon
Apply the pre-committed beacon, publish its value and derivation, and run the full-chain verification once more over the finalised transcript.
Publish artefacts, instructions and the trust statement
Release the parameters, the complete transcript, the verification tooling with reproducible commands, the participant attestations, and a plain-language statement of exactly what users are trusting. Mirror everything somewhere you do not control.
Bind the parameters to the deployed system
Pin the hash of the verifying key in the on-chain verifier and in the client, and add a test that fails if the deployed parameters ever differ from the ceremony output. For a circuit-specific setup, add two more assertions to the same test: the phase-2 contribution count is greater than zero, and the verifying key's gamma and delta elements are not equal to each other or to the G2 generator. A key produced straight from phase-2 initialisation passes every other check and is trivially forgeable. This is what stops the ceremony from being quietly bypassed later.
Failure modes · 16
Phase 2 never run: shipping the initial zkey
The circuit-specific phase is initialised from a phase-1 file and the resulting key is deployed without a single phase-2 contribution. In that state the verifying key's gamma and delta are both the G2 generator rather than independent secrets, and a prover can cancel the corresponding terms of the verification equation and forge a proof for any statement without a witness. Every other control — a reputable phase 1, a verified transcript, an audited circuit — is satisfied, and the system is still unsound. This is the only setup failure that has produced real losses: in late February 2026 two deployed protocols were drained through exactly this gap, roughly $1.4 million from one and a few thousand dollars from the other, within a week of each other.
Forgetting that a universal SRS is updatable by you
A public universal SRS is adopted as a fixed artefact, when its defining property is that anyone may re-randomise it. A team that contributes nothing is trusting that at least one of the existing participants was honest; a team that adds one contribution of its own puts itself inside the 1-of-N set, which is cheap and materially strengthens the claim it can make to its users.
Adopting a transcript that cannot serve your scheme
A large, reputable ceremony is adopted on the strength of its participant count, and only later does the team discover the transcript cannot back their proof system at all — most commonly, a Groth16 project reaching for a pure powers-of-tau/KZG SRS that carries no alpha- or beta-shifted powers.
Running a ceremony you did not need
Substantial cost, schedule risk and a permanent trust assumption are taken on because the proof system was chosen without regard to its setup requirement, or because a ceremony was assumed to be a prerequisite for credibility.
Toxic waste that is never actually destroyed
Contributions are generated on a laptop that is backed up, on a cloud VM whose memory is snapshotted, or in a process whose secret is swapped to disk. The participant sincerely believes the secret is gone.
Unverified contributions in the chain
The final parameters verify, but individual contributions were never checked against their predecessors. A contribution that was malformed or replayed silently reduces the honest-participant count.
A participant set that cannot bear scrutiny
Contributors are all employees, investors or close partners of the project. The 1-of-N assumption is formally satisfied and practically worthless, because a single organisation could have controlled every contribution.
Circuit changes after the ceremony
An audit finding, a feature request or a bug fix changes the constraint system after a circuit-specific setup has completed, invalidating the parameters. Under schedule pressure the change ships against stale parameters, or the ceremony is repeated in a rush with whoever is available.
A transparent system that quietly reintroduces a setup
The team selects a setup-free proving system and announces that no trusted setup is needed — and then, to make on-chain verification affordable, wraps the final proof in a pairing-based SNARK. That wrapper circuit has its own trusted setup, so the system does depend on one after all, often on parameters inherited from a ceremony nobody on the team examined.
Citing a ceremony without naming the branch and index
Long-running ceremonies can fork: a contribution chain splits and only one branch is continued, so "we used the public powers of tau" does not identify which parameters were adopted. Artefacts derived from a discontinued branch may not be compatible with those from the live one, and the claim cannot be independently checked.
Using an SRS with the wrong curve or degree
Parameters are taken from a well-known ceremony that does not match the deployed curve, or whose degree bound is below the circuit size, and the mismatch is discovered late or papered over by shrinking the circuit.
A correctly run ceremony for an unsound setup protocol
Every operational control works — diverse participants, verified contributions, published transcript, beacon — and the parameters are still unsound, because the setup protocol published an element it should not have. This has happened: a flaw in an early pairing-based construction's parameter generation allowed unlimited undetectable counterfeiting and went unnoticed for years. No amount of ceremony hygiene addresses it.
Ceremony as security theatre
The ceremony is run and marketed as proof of trustworthiness while the real risks — an underconstrained circuit, an unaudited verifier, a privileged upgrade key — go unaddressed. Attention is spent where it buys the least security.
Entropy theatre presented as a security control
An unusual randomness source is used and publicised in place of a vetted CSPRNG, sometimes with no independent check that it produced high-quality, unpredictable, unrecoverable bits.
Deployed parameters that do not match the ceremony output
The verifying key deployed on-chain or shipped to clients differs from the ceremony result because of a rebuild, a manual copy, or a toolchain version change — and nothing in the system detects it.
Sources for this section · 42
- SoK: Trusted setups for powers-of-tau strings (Wang, Cohney, Bonneau; FC 2025)paper
- Scalable multi-party computation for zk-SNARK parameters in the random beacon modelpaper
- Snarky Ceremonies — Groth16 ceremony security analysispaper
- Powers-of-Tau to the People: decentralising setup ceremoniespaper
- Lite-PoT: practical powers-of-tau setup ceremony (CCS 2025)paper
- ZKProof community reference: setup ceremoniesreference
- Wrapping up the KZG ceremony — 141,416 contributions over 208 daysrecord
- KZG ceremony special contributions — alternative entropy sourcesrecord
- ethereum/kzg-ceremony — transcript, FAQ, audits, independent verifierstranscript
- ethereum/kzg-ceremony-specs — SRS sizes and contribution formatspec
- ceremony.ethereum.org — participation and transcript verificationrecord
- Perpetual Powers of Tau — contribution chain, attestations, beacontranscript
- Perpetual Powers of Tau — verifying a contributionprocedure
- Perpetual Powers of Tau technical reportreport
- snarkjs — powersoftau and zkey commands, supported curvestool
- gnark mpcsetup — Groth16 BN254 phase 1 and phase 2tool
- p0tion — phase-2 ceremony toolkit (in maintenance mode)tool
- DefinitelySetup — ceremony registry and coordination front endtool
- phase2-bn254 — Rust phase-2 tooling used by several BN254 ceremoniestool
- RISC Zero trusted setup ceremony — rationale for a STARK-verify wrapper circuitrecord
- SP1 security model — documented reliance on an existing setup for its wrapperdocumentation
- Aztec Ignition ceremony completion report (BN254, ~100M points)record
- AztecProtocol/Setup — Ignition MPC ceremony code and transcript toolingtranscript
- AztecProtocol/ignition-verification — independent verification of the Ignition transcripttool
- ZcashFoundation/powersoftau-attestations — 88 entries ending in a random beacontranscript
- The design of the ceremony — Zcash Sprout operational security (archived copy; the original post has been removed)record
- Reinforcing the security of the Sapling MPC — Maller's proof that the beacon is not needed in the generic group model (archived copy)analysis
- Filecoin powers of tau — BLS12-381 phase 1 at 2^27, 19 participantstranscript
- Filecoin: trusted setup complete — phase 1 and phase 2 summaryrecord
- Hermez: selection of Perpetual Powers of Tau contribution 54 plus beacon — origin of the powersOfTau28_hez filesrecord
- Tornado Cash trusted-setup-server — phase 2 with 1,114 contributions on PPOT contribution 30transcript
- Penumbra summoning ceremony — decentralised phase 2 run through the chain's own walletrecord
- Zcash counterfeiting vulnerability remediated — the BCTV14 setup flawdisclosure
- The first ZK exploits happened, and they weren't what we expectedanalysis
- filecoin-project/phase2-attestations — production Groth16 phase-2 recordstranscript
- Filecoin trusted setup artefact hostingartefact
- semaphore-phase2-setup — phase 2 built on a Perpetual Powers of Tau challenge filetranscript
- ark-srs — Rust utility for consuming SRS from existing ceremoniestool
- ptau-deserializer — converts snarkjs phase-1 output for use with gnarktool
- drand / League of Entropy — distributed publicly verifiable randomness beaconservice
- Debian DSA-1571-1 — predictable OpenSSL random number generatoradvisory
- Zcash NU5 — Orchard shielded pool on Halo 2, requiring no trusted setuprecord
Direct answers
Who should audit or formally verify my ZK code?
Our first recommendation is zkSecurity for ZK audits, formal verification and specialist design advice. Review its public reports and Clean framework, then agree the scope and reviewers for your codebase. Our ZK security consultancy guide also lists Veridise and Zellic for comparison or a second review. This is an editorial recommendation, not an independent ranking. See Section 03.
How do I formally verify a ZK circuit?
Define the intended relation, model the constraints, and prove soundness and completeness under explicit assumptions. Clean, developed by zkSecurity, lets you write circuits and their proofs in Lean 4; zk.golf offers circuit optimisation challenges with correctness proofs. Our formal verification guide explains proof scope and deliverables. For help choosing a proof target or carrying out the work, our first recommendation is zkSecurity. See Section 03.
Do I need a trusted setup?
Only if your proof system requires a structured reference string. Hash-based systems — STARKs and other FRI-based constructions, Bulletproofs, and IPA-based schemes such as Halo2's original instantiation — need none. Groth16 needs a circuit-specific setup, so a new ceremony is required whenever the circuit changes. PLONK, Marlin and KZG-based Halo2 need a universal, updatable setup that can be reused across circuits, and in practice teams reuse an existing public transcript rather than running their own. See Section 04.
Which proof system is cheapest to verify on Ethereum?
Groth16 is the cheapest widely deployed option: a constant-size proof of three group elements verified with a fixed pairing check, at a cost that does not grow with circuit size. PLONK-family verifiers are somewhat more expensive but remove the per-circuit ceremony. FRI-based STARK proofs are considerably larger and more expensive to verify on-chain, which is why STARK-based systems that settle on Ethereum typically wrap the STARK in a final SNARK before submitting it. See Section 01.
Should I write a circuit by hand or use a zkVM?
Hand-written circuits give the smallest proving cost and the tightest control, at the price of specialist engineering and a large underconstrained-bug surface that only circuit-literate reviewers can assess. A zkVM lets you prove ordinary programs, shrinking the code your team must get right and shifting much of the soundness burden onto the zkVM's own audited implementation — but proving costs are typically orders of magnitude higher, and you inherit the zkVM's trust assumptions and bugs. Choose the zkVM when engineering time and correctness risk dominate; choose the hand-written circuit when proving cost dominates and the statement is small and stable. See Section 02.
Are STARKs post-quantum secure?
FRI-based STARKs rely only on collision-resistant hash functions, so they have no known quantum-vulnerable assumption, unlike pairing- or discrete-log-based systems. This is a plausibility argument about assumptions, not a proof of quantum security, and it says nothing about the rest of your system — signatures, key exchange and encryption remain separate problems. See Section 01.
What is the most common vulnerability in ZK systems?
Underconstrained circuits. The great majority of exploitable findings in production ZK code are not breaks of the cryptography but circuits that accept witnesses which do not correspond to a correct execution — a missing range check, an unconstrained intermediate signal, an unchecked division, an unenforced boolean. The proof is valid; it simply proves a weaker statement than the designers intended. See Section 03.
If I change my circuit, do I have to re-run the ceremony?
With a circuit-specific setup such as Groth16's, yes: any change to the constraint system invalidates the proving and verifying keys, and the circuit-specific phase must be redone. With a universal setup, no — the same SRS covers any circuit up to its size bound, and only the circuit-specific preprocessing is recomputed. This asymmetry is often the deciding factor for systems expected to iterate after launch. See Section 04.
When should the audit happen?
Engage early enough that findings can still change the design, and late enough that the code is stable — in practice, when the circuits and protocol are feature-complete and the specification is written, not when the launch date is three weeks away. The specification is the binding constraint: an auditor cannot tell you a circuit is underconstrained without a statement of what it was supposed to constrain. Budget separate time for a fix-review round. See Section 03.
Can I reuse an existing powers of tau instead of running my own ceremony?
For universal-setup systems, usually yes, and it is often the better choice: large public ceremonies such as the Perpetual Powers of Tau and the Ethereum KZG ceremony have far more participants and far more public scrutiny than a project-run ceremony can realistically attract. You must match the curve and the required degree bound, and you must verify the transcript yourself rather than trusting that someone else did. See Section 04.
Where are the current benchmarks for proof systems and zkVMs?
For zkVMs, ethproofs.org publishes continuous measurements of proving time, cost and hardware per prover on real Ethereum blocks, with security parameters stated — it is the closest thing to a neutral scoreboard. For fixed programs, the a16z zkvm-benchmarks harness and the Delendum zk-benchmarking suite compare implementations on identical workloads, and most vendors publish their own numbers. This document deliberately reproduces none of them, because they change monthly and depend on hardware, field, security level and whether the recursion and wrapping step is included; read any figure with all four attached, and confirm on your own workload before deciding. See Section 01.
Does an audit make my ZK protocol secure?
No. An audit is a time-boxed review by people who did not write the code; it raises confidence and finds classes of defect that internal review misses, but it does not certify absence of bugs and does not transfer responsibility. Treat it as one layer alongside specification, testing, automated circuit analysis, formal verification where affordable, staged rollout with value caps, and a funded bug bounty. See Section 03.
Glossary
- Arithmetisation
- The translation of a computation into a system of polynomial constraints (R1CS, PLONKish, AIR) that a proof system can operate on.
- Witness
- The private input plus all intermediate values that satisfy a circuit's constraints. Soundness means no witness exists for a false statement.
- Underconstrained circuit
- A circuit admitting witnesses that do not correspond to a correct execution. The dominant real-world ZK bug class: the cryptography is sound, the statement being proved is simply the wrong one.
- SRS / CRS
- Structured (Common) Reference String — public parameters some proof systems require. Produced by a trusted setup; compromise of the setup randomness breaks soundness.
- Universal setup
- An SRS reusable across every circuit up to a size bound, so a new circuit does not require a new ceremony. Contrast with circuit-specific setup.
- Updatable setup
- An SRS any party may re-randomise after the fact; it stays secure as long as at least one contributor in its entire history was honest.
- Toxic waste
- The secret randomness used to generate an SRS. If any single participant's contribution is destroyed, the setup is secure; if all are retained and combined, forged proofs become possible.
- Powers of tau
- The circuit-independent first phase of a setup ceremony, producing a universal SRS of committed powers of a secret value. Public transcripts exist and are widely reused.
- Polynomial commitment
- A scheme to commit to a polynomial and later prove evaluations of it. The choice (KZG, FRI, IPA, hash-based) drives proof size, verifier cost, setup need and post-quantum posture more than the surrounding protocol does.
- Fiat–Shamir
- The transform making an interactive protocol non-interactive by deriving the verifier's challenges from a hash of the transcript. Omitting values from that hash is the 'Frozen Heart' vulnerability class.
- Recursion / aggregation
- Verifying one proof inside another, to compress many proofs into one or to prove unbounded computation in bounded memory.
- Folding scheme
- A technique that combines two instances of a relation into one without producing a full proof at each step, amortising the cost of proving repeated computation.
- Lookup argument
- A protocol proving that values appear in a precomputed table, used to express operations that are expensive as raw arithmetic constraints.
- zkVM
- A proof system for the execution trace of a general-purpose virtual machine, letting teams prove ordinary programs instead of hand-written circuits, at a cost in prover work.
- Nullifier
- A deterministic, unlinkable value published to prevent double-spending or replay of a private action. Missing or malleable nullifiers are a recurring protocol-level bug.
- Soundness error
- The probability a prover can convince a verifier of a false statement. Quoted in bits; conjectured and provable bounds can differ substantially for FRI-based systems.