Print
The whole document on one page

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.

01 — Proof system · The decision everything else depends on

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.

Proof size versus on-chain verifier cost A poster-like positioning chart of eight proof families. A red wrapping path carries large FRI-based STARK proofs to compact Groth16 settlement proofs. SMALL LARGE PROOF SIZE CHEAP EXPENSIVE ON-CHAIN VERIFIER COST GROTH16 PLONK FAMILY FFLONK HALO2 + KZG HALO2 + IPA BULLETPROOFS STIR / WHIR FRI-BASED STARKS WRAPPED FOR SETTLEMENT
Fig. 2 · Proof size against on-chain verifier cost · schematic, not benchmarked
The three layers, and which one actually decides things

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.

The landscape is bimodal, and hybrid by default

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.

Where the benchmarks are, and how to read them

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.

Two things to check before quoting anyone's security level

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.

How to evaluateWrite the verifier down as a concrete gas number at a stated instance size, not as a complexity class. For pairing-based systems on Ethereum, budget the pairing precompile plus a per-public-input cost for the input commitment. If the answer is "we will wrap it", price the wrapper — it is the real verifier.

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.

How to evaluateAsk how often the circuit will change and who runs the ceremony each time. If a setup is required, check whether a reusable public artefact already exists on your curve at sufficient degree — running your own phase 1 is almost never the right answer.

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.

How to evaluateInsist on numbers at a stated security level and stated instance size, because for hash-based systems proof size is a tunable dial traded against query count and grinding. A size quoted without its security parameters is not a number.

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.

How to evaluateMeasure peak resident memory, not just wall time, on the actual target device and at the security level you will ship. Ask whether the system supports streaming, chunking or continuation-based proving — folding schemes and continuation-based zkVMs do; a monolithic prover over a huge constraint system does not. Start from the prover-profile table below and the public benchmark suites it points to, then confirm on your own workload.

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.

How to evaluateAsk three concrete questions. Is there an in-circuit verifier already implemented and audited, or would you be writing one? How large is that verifier circuit — this sets your minimum useful step size. Does the design require non-native field arithmetic, which typically dominates the cost?

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.

How to evaluateProfile the statement by operation class before choosing a backend, then check the field menu the backend actually offers. Some toolkits expose several fields behind one interface, making this a configuration choice rather than a rewrite.

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.

How to evaluateCount lookups and memory operations, not just gates. If lookups dominate, the lookup argument matters more than the choice between one PLONK variant and another. If the machine is non-uniform, check whether you pay for the union of all instructions at every step.

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.

How to evaluateSeparate confidentiality from soundness. If the proof hides a long-lived secret, harvest-now-decrypt-later applies and the zero-knowledge property must be statistical or post-quantum. If only soundness matters, a proof verified and settled today cannot be retroactively forged, so the requirement is much weaker. Note also that a pairing-based wrapper removes the inner system's PQ posture.

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.

How to evaluateDemand a written parameter statement: field and extension degree, hash output length, rate, number of queries, grinding bits, decoding regime, and explicitly whether the claim is provable or conjectured. Shared calculators now exist for this; use one rather than accepting a bespoke bit count.

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.

How to evaluateLook for an independent second implementation of the verifier, which is a strong maturity signal; published audit reports; and presence in neutral catalogues of deployed verifiers. Check repository health directly rather than trusting a launch post.

Selection matrix · 17

Proof system selection matrix

Filter by hard constraint
Proof system families by structural properties
FamilySetupProof sizeOn-chain verificationPQRecursionMaturity
Groth16Circuit-specific3 group elements: 128 B compressed, 256 B as EVM calldataCheapest deployed optionNoVia curve cycles; awkwardProduction since 2016
PLONK familyUniversal, updatableSub-kilobytePractical; above Groth16NoWell-exercisedProduction; most common deployed family
fflonkUniversal~768 B as deployedFewer verifier group ops than PLONKNoAs PLONKWas production in one stack, since retired
Marlin / VarunaUniversal, updatableConstant, above Groth16PracticalNoLimitedProduction in one ecosystem; little greenfield use
Halo2 + IPANoneLogarithmicImpractical — verifier linear in circuit sizeNoNative, via accumulation on a curve cycleYears in production; gadget-layer bug in 2026
Halo2 + KZGUniversal, updatableConstantPracticalNoSupportedProduction; central maintenance declining
FRI-based STARKsNoneTens to hundreds of KBImpractical directly — wrapper is standardPlausiblyWell-exercisedHeavily production
STIR / WHIRNoneMarkedly smaller than FRI at equal securityImpractical directlyPlausiblyInherits FRI approachesResearch maturing into implementation
Binius (binary fields)NoneHash-based scaleImpractical directlyPlausiblyDevelopingEarly production; fast-moving codebase
Ligero / BrakedownNoneSquare-root — largeNot viablePlausiblyUsed as an inner layerEstablished; mostly used as a component
BasefoldNoneBetween Brakedown and FRIImpractical directlyPlausiblyAs a commitment layerResearch-to-production transition
SpartanNone (commitment-dependent)Depends on commitmentNot a settlement candidate aloneCommitment-dependentUsed inside larger systemsEstablished construction, widely built upon
GKR / sumcheck systemsNone (commitment-dependent)Grows with circuit depthWrapper neededCommitment-dependentDevelopingProduction via at least one major zkVM
HyperPlonkCommitment-dependentLarger than univariate PLONK with KZGMore expensive than PLONKCommitment-dependentSupportedInfluential; fewer deployments under its own name
Nova / folding schemesNone in the folding layerAccumulator, not a proof — needs final compressionVia the compressing SNARK onlyNoThis is the whole pointResearch to early production
BulletproofsNoneLogarithmic; small for rangesLinear in circuit size — not succinctNoPoorProduction for range proofs since 2018
LatticeFoldNoneResearch-stageResearch-stageYes (lattice)Designed for itResearch only — not a 2026 production choice
Reading this table

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

Filter
Proof system families by prover cost, memory, off-chain verifier, maintainers and where they are measured
FamilyProver cost profilePeak prover memoryOff-chain verifierImplementations and maintainersWhere it is measured
Groth16256-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 limitMilliseconds: three pairingssnarkjs 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 family256-bit-field FFTs dominate; custom gates and lookups trade prover work for constraint countSRS and witness polynomials resident; comparable to Groth16 at equal sizeMillisecondsBarretenberg / UltraHonk (Aztec), gnark (Consensys), plonky2 (Polygon Zero lineage), Kimchi (o1Labs), Halo2 forksVendor-published only; no neutral cross-implementation suite
fflonkHeavier than PLONK: polynomials are combined to shrink the verifierAs PLONKMillisecondssnarkjs (iden3); formerly Polygon zkEVMHistorical Polygon zkEVM figures only
Marlin / VarunaUniversal-SRS R1CS prover; slower than Groth16 at equal sizeSRS residentMillisecondsarkworks marlin (research), Varuna in snarkVM (Provable / Aleo)Aleo ecosystem figures only
Halo2 + IPAMSM-dominated over the Pasta curve cycle; no pairing-curve FFT bottleneckProportional to circuit size; moderateLinear in circuit size — tens to hundreds of milliseconds for large circuitszcash/halo2 (Electric Coin Company)Zcash Orchard figures; no neutral suite
Halo2 + KZG256-bit-field FFTs over BN254; the largest gadget ecosystem of any PLONKish frontendSRS resident; large circuits need tens of gigabytesMillisecondsprivacy-ethereum/halo2 (Ethereum Foundation PSE, maintenance mode), halo2-lib (Axiom), Scroll's forkScroll and Axiom published figures; no neutral suite
FRI-based STARKsSmall-field hashing and NTTs; the fastest bulk provers on CPU and GPU, and the basis of most zkVMsTrace-proportional, but small fields keep it low; continuations bound itMilliseconds to tens of milliseconds — hashing onlyStone and Stwo (StarkWare), Plonky3 (Polygon Zero lineage; beneath SP1 Turbo, OpenVM, Ziren, Pico), RISC Zero, Miden, ZKsync Airbender (Matter Labs), Winterfellethproofs.org real-time Ethereum block proving; a16z zkvm-benchmarks
STIR / WHIRComparable to FRI; the WHIR prover is somewhat heavierAs FRISub-millisecond for WHIR in the authors' reported settingsReference implementations by the authors; integrations into production hash-based stacks under wayAuthors' comparisons only; measure on your own parameters
Binius (binary fields)Binary-field arithmetic maps to hardware bit operations; strongest on hashing and bitwise workloadsLow — tiny field elements, no embedding overheadMillisecondsBinius64 (Irreducible); the original binius repository is archivedIrreducible's published figures; few independent measurements
Ligero / BrakedownLinear-time encoding — the cheapest commitment prover, paid for in proof sizeLowSublinear, but large proofs to hashLigero (Ligero Inc.), Brakedown in the Lasso and Jolt lineage (a16z crypto), arkworksComponent-level measurements only
BasefoldLinear-time encoding plus a FRI-like fold; between Brakedown and FRILowPolylogarithmicCeno (Scroll) and research implementationsComponent-level measurements only
SpartanSumcheck over sparse R1CS; no FFT; linear in non-zero constraint entriesLow and streaming-friendlySublinear after preprocessing; commitment-dependentSpartan (Microsoft Research), inside Jolt (a16z crypto) and NexusOnly inside zkVM benchmarks
GKR / sumcheck systemsLinear-time; commits only to the input layerLow relative to trace sizeGrows with circuit depthExpander (Polyhedra), Ceno (Scroll), SP1 Hypercube's sumcheck design (Succinct)ethproofs.org for the zkVMs built on it; Polyhedra's published figures
HyperPlonkSumcheck-based, linear-time, no FFT; high-degree gates are cheapLowHigher than univariate PLONKEspresso Systems research implementation; ideas absorbed into other stacksPaper figures only
Nova / folding schemesTwo MSMs per step — the cheapest incremental step knownBounded by one step plus the accumulatorOnly after final compressionNova (Microsoft Research), Sonobe (Ethereum Foundation lineage), arecibo (Argument Computer)Repository benchmarks only; no neutral suite
BulletproofsLinear MSMs; slow for general circuitsLowLinear in circuit size; batchabledalek bulletproofs (Rust), Monero, Bulletproofs+ in several walletsRange-proof figures in Monero and dalek benchmarks
LatticeFoldResearch-stageResearch-stageResearch-stageResearch prototypes; a lattice-based Jolt variant was announced by a16z crypto in September 2026None neutral
Reading this table

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

Filter
Polynomial commitment schemes by setup, cost and field requirements
SchemeAssumptionSetupOpening sizeVerifier costField constraint
KZGPairingsStructured, universalConstantConstant; precompile-backedPairing-friendly curve, 256-bit scalar field
Multilinear KZG (PST, Zeromorph, HyperKZG)PairingsStructured, universalLogarithmic — hundreds of bytesConstant pairings plus a logarithmic number of group operations; EVM-practicalPairing-friendly curve, 256-bit scalar field
HyraxDiscrete log (Pedersen)NoneSquare-rootSquare-root MSMAny prime-order group
DoryPairings, transparent (no trapdoor)None — public generatorsLogarithmicLogarithmic, with pairingsPairing-friendly curve
FRIHash (collision resistance)NonePolylogarithmic but large in absolute termsPolylogarithmic; expensive on-chainHigh two-adicity; extension for challenges
IPA / Bulletproofs-styleDiscrete logNoneLogarithmicLinear unless amortised by accumulationAny prime-order group; enables curve cycles
Brakedown / LigeroHash + linear codesNoneSquare-root — largeSublinear, not polylogarithmicField-agnostic
BasefoldHash + foldable codesNoneBetween Brakedown and FRIPolylogarithmicField-agnostic — no two-adicity requirement
WHIRHash + constrained RS codesNoneSmaller than FRI at equal securityReported in hundreds of microsecondsReed-Solomon-friendly
Binius commitmentsHash over binary fieldsNoneHash-based scalePolylogarithmicBinary field towers
Reading this table

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

Pairing-based SNARK

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.

Construction by Jens Groth (2016). Implementations: snarkjs and rapidsnark (iden3), gnark (Consensys), arkworks, bellman (Zcash lineage), ICICLE GPU backends (Ingonyama) Production since 2016 n/a (construction) eprint.iacr.org ↗

PLONK and the PLONKish family

Pairing-based SNARK, universal SRS

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.

Construction by Gabizon, Williamson and Ciobotaru (Aztec, 2019). Implementations: Barretenberg / UltraHonk (Aztec), gnark (Consensys), plonky2 (Polygon Zero lineage), Kimchi (o1Labs), Halo2 forks Production; most common deployed family n/a (construction) eprint.iacr.org ↗

FRI-based STARKs

Transparent hash-based proof system

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.

Construction by Ben-Sasson, Bentov, Horesh and Riabzev (StarkWare, 2018). Implementations: Stone and Stwo (StarkWare), Plonky2 and Plonky3 (Polygon Zero lineage), RISC Zero, Miden, ZKsync Airbender (Matter Labs), Winterfell Heavily production n/a (construction) eprint.iacr.org ↗

Halo2 with IPA, and Halo2 with KZG

PLONKish SNARK — two distinct trust models

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.

Halo by Bowe, Grigg and Hopwood (Electric Coin Company, 2019); upstream halo2 maintained by Electric Coin Company. KZG fork by Ethereum Foundation PSE (maintenance mode); halo2-lib by Axiom; further forks at Scroll and others Long production history; forks vary n/a (construction) eprint.iacr.org ↗

Nova, SuperNova and HyperNova

Folding schemes / IVC

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.

Nova by Kothapalli, Setty and Tzialla (Microsoft Research, 2021); SuperNova and HyperNova from the same lineage. Implementations: Nova (Microsoft Research), Sonobe (Ethereum Foundation lineage), arecibo (Argument Computer) Research to early production n/a (construction) eprint.iacr.org ↗

Binius and binary-field systems

Transparent hash-based, binary fields

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.

Diamond and Posen (Irreducible, formerly Ulvetanna, 2023). Implementation: Binius64 (Irreducible) Early production; active development n/a (construction) eprint.iacr.org ↗

STIR and WHIR

Hash-based low-degree tests

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.

Arnon, Chiesa, Fenzi and Yogev (2024). Reference implementations by the authors; integrations at several hash-based zkVM teams Research maturing into implementation n/a (construction) eprint.iacr.org ↗

GKR-based systems

Sumcheck / interactive proofs

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.

Goldwasser, Kalai and Rothblum (2008); linear-time prover by Xie et al. (Libra, 2019). Implementations: Expander (Polyhedra), Ceno (Scroll), sumcheck-based zkVM designs at Succinct Production as of 2026 n/a (construction) eprint.iacr.org ↗

Spartan

Transparent SNARK for R1CS

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.

Srinath Setty (Microsoft Research, 2019). Implementations: Spartan (Microsoft Research), inside Jolt (a16z crypto) and Nexus Established construction, heavily built upon n/a (construction) eprint.iacr.org ↗

Bulletproofs

Transparent discrete-log argument

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.

Bünz, Bootle, Boneh, Poelstra, Wuille and Maxwell (Stanford and Blockstream, 2017). Implementations: dalek bulletproofs (Rust), Monero's Bulletproofs+, several confidential-asset wallets Production since 2018 in its niche n/a (construction) eprint.iacr.org ↗

Lookup arguments: Plookup, LogUp, cq, Lasso/Shout/Twist

Cross-cutting — often the real cost driver

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.

Plookup: Gabizon and Williamson (Aztec). LogUp: Haböck (Polygon). cq: Eagen, Fiore and Gabizon. Lasso, Twist and Shout: Setty, Thaler and collaborators (a16z crypto) Plookup and LogUp production; structure-exploiting variants research-stage n/a (constructions) eprint.iacr.org ↗

How to run the selection · 8 steps

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

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

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

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

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

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

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

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

MitigationIdentify the commitment scheme and field for each candidate first, and compare those. Two systems sharing a commitment resemble each other far more than two sharing a protocol name.

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.

MitigationRequire a full written parameter statement with every benchmark, and normalise to a common target before comparing. Treat any bit count without its derivation as unverified.

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.

MitigationState explicitly whether your parameters are provable or conjectural, and set a review trigger tied to the relevant literature. Prefer provable-regime parameters where the performance cost is affordable.

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.

MitigationDescribe the assumption at the boundary the verifier actually sits on. If a wrapper is used, its setup and its parameters are yours to justify — see §04.

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.

MitigationNever derive uniqueness from proof bytes. Bind it to constrained in-circuit values such as nullifiers, and canonicalise encodings on deserialisation.

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.

MitigationMeasure peak memory on the actual target device early, and check whether the system supports streaming, chunked or continuation-based proving before committing.

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.

MitigationSeparate soundness from confidentiality and check each end to end. If a long-lived secret is hidden, the hiding property must itself be statistical or post-quantum — a hash-based proof system does not supply that by itself.

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.

MitigationWeight an independent second implementation of the verifier heavily — it is the strongest available maturity signal. Match construction novelty to your team's ability to own cryptographic risk.

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.

MitigationGet the concrete size of the in-circuit verifier circuit before designing around recursion, and check whether it requires non-native field arithmetic, which typically dominates.

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.

MitigationCount lookups explicitly and evaluate the lookup argument as a first-class decision. Constrain multiplicity columns carefully: an unconstrained multiplicity silently breaks soundness.

Sources for this section · 40

  1. Groth16 — On the size of pairing-based non-interactive argumentspaper
  2. PLONK — permutations over Lagrange bases for oecumenical noninteractive argumentspaper
  3. fflonk — a fast-Fourier inspired verifier efficient variant of PLONKpaper
  4. Marlin — preprocessing zkSNARKs with universal and updatable SRSpaper
  5. Halo — recursive proof composition without a trusted setuppaper
  6. Nova — recursive zero-knowledge arguments from folding schemespaper
  7. Spartan — efficient and general-purpose zkSNARKs without trusted setuppaper
  8. Bulletproofs — short proofs for confidential transactions and morepaper
  9. Scalable, transparent, and post-quantum secure computational integrity (STARKs)paper
  10. Proximity gaps for Reed–Solomon codespaper
  11. Circle STARKs — making Mersenne-31 usable for FRI-based systemspaper
  12. ethSTARK documentation — concrete soundness parameterspaper
  13. Binius — succinct arguments over towers of binary fieldspaper
  14. Basefold — field-agnostic multilinear polynomial commitmentpaper
  15. Brakedown — linear-time and field-agnostic SNARKs for R1CSpaper
  16. STIR — Reed–Solomon proximity testing with fewer queriespaper
  17. WHIR — Reed–Solomon proximity testing with super-fast verificationpaper
  18. Libra — succinct zero-knowledge proofs with optimal prover computation (GKR)paper
  19. HyperPlonk — PLONK with linear-time prover and high-degree custom gatespaper
  20. Signatures of correct computation (PST) — the original multilinear KZG commitmentpaper
  21. Zeromorph — multilinear evaluation proofs from univariate KZGpaper
  22. Hyrax — doubly-efficient zkSNARKs without trusted setup (square-root Pedersen commitment)paper
  23. Dory — transparent logarithmic-size arguments for inner products and polynomial commitmentspaper
  24. LatticeFold+ — post-quantum folding from latticespaper
  25. Plookup — a simplified polynomial protocol for lookup tablespaper
  26. Multivariate lookups based on logarithmic derivatives (LogUp)paper
  27. cq — cached quotients for fast lookupspaper
  28. Twist and Shout — memory checking arguments for zkVMspaper
  29. SoK: Trusted setups for powers-of-tau stringspaper
  30. EIP-1108 — reduced gas cost for alt_bn128 precompilesspec
  31. EIP-2537 — BLS12-381 curve operations precompilespec
  32. EIP-4844 — shard blob transactions and the KZG commitment schemespec
  33. soundcalc — soundness parameter calculator for hash-based systemstool
  34. L2BEAT ZK Catalog — catalogue of deployed on-chain verifierscatalogue
  35. ethproofs.org — continuous real-time proving benchmarks on Ethereum blocks, per prover, with cost and hardwarebenchmark
  36. a16z zkvm-benchmarks — fixed-program comparison harness across zkVMsbenchmark
  37. Delendum zk-benchmarking — cross-implementation benchmarks of proof systems and zkVMsbenchmark
  38. ZKProof Community Reference — terminology and security recommendationsreference
  39. Plonky3 — polynomial IOP toolkit over small fieldsproject
  40. Wrapping up the KZG ceremony — the largest deployed universal SRSrecord
02 — Framework · How you express the statement

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.

Hand-written circuit compared with a zero-knowledge virtual machine Two equal-width stacks compare the three-layer surface of a hand-written circuit with the five-layer inherited surface of a zkVM. A red dimension marks the added proving cost. HAND-WRITTEN CIRCUIT ZKVM STATEMENT CONSTRAINTS YOU OWN THIS PROOF SYSTEM PROGRAM YOU OWN THIS COMPILER VM EXECUTION CONSTRAINTS PROOF SYSTEM PROVING COST SMALL SURFACE, ALL OF IT YOURS LARGE SURFACE, MOSTLY INHERITED
Fig. 3 · Hand-written circuit against zkVM · what you own, and what you inherit
Plan correctness with your framework

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.

The structural choice, stated plainly

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.

Read licences before you write code

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.

How to evaluateIs the statement small, fixed and executed at high volume? Favour a circuit. Is it large, evolving, or reusing existing code — EVM or consensus verification, business logic, inference? Favour a zkVM. Price both paths in engineer-months and in proving cost over a realistic horizon, and consider a hybrid.

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.

How to evaluateEstimate audit hours per thousand lines with your intended reviewer, not lines of code. Ask whether the language has written semantics, whether the compiler has been audited, and whether the constraint output is reviewable — constraint counts per component, R1CS or AIR dumps.

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.

How to evaluateCheck for a stable intermediate representation with more than one real, maintained consumer. Treat "supports N backends" as unproven unless you can find CI, releases and issue traffic for the alternative. Architectural agnosticism is not the same as an operational option.

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.

How to evaluateAsk for the recursion topology and whether it is documented; whether the final wrapper requires a trusted setup; the aggregation throughput; and — importantly — whether the recursive verifier circuit was audited separately from the base prover.

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.

How to evaluateCheck what static and symbolic tooling exists for your language and can run in CI. Coverage is heavily Circom-biased today. Budget for manual review regardless — evaluations of these tools against real vulnerabilities show detection rates falling sharply when run against whole codebases rather than isolated circuits.

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.

How to evaluateRequire a native execution or simulation mode, a witness-level debugger or trace inspector, a negative test harness that mutates witnesses and asserts proofs fail, and constraint-count regression tracking in CI.

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.

How to evaluateEnumerate the precompiles you actually need, confirm they exist and are audited, and check the extension mechanism. Note that precompiles are a recurring source of soundness bugs, and that writing a custom one means you now own a hand-written circuit after all.

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.

How to evaluateGet concrete numbers per proof type from the project's own documentation, including the cost of the recursion and wrapping step, which is frequently the bottleneck. Establish whether the wrapper needs a trusted setup, and if so, whose.

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.

How to evaluateBenchmark your own workload, never the project's demo program. Measure prover time, peak RAM and cost per proof on the hardware you will actually rent, and measure the recursion and wrapping step separately.

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.

How to evaluateList every foreign-field operation your statement needs and price each one in the candidate stack, checking whether an audited precompile or gadget already exists. Small-field systems are fast for hashing-heavy work and slow for foreign-curve work unless precompiled.

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.

How to evaluateTrace the assumption to whatever the verifier actually checks. If a wrapper is in the path, the deployed system is as quantum-vulnerable as the wrapper. Then separate soundness from confidentiality: a proof settled today cannot be retroactively forged, but a proof hiding a long-lived secret needs a hiding property that survives, which a hash-based proof system does not supply by itself.

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.

How to evaluateRead the actual reports rather than the badges. Look for CVEs, public postmortems, whether fixes shipped promptly, and whether the project runs its own adversarial tooling. A project with public findings and clean disclosure is a better bet than one with neither.

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.

How to evaluateUse verifiable proxies rather than popularity: commit activity in the last ninety days, number of distinct recent contributors, whether releases are still being cut, and whether audit firms advertise coverage for that language. Star counts routinely overstate general-purpose relevance.

Selection matrix · 24

Framework selection matrix

Filter by hard constraint
Circuit DSLs, proving libraries and zkVMs by structural properties
ProjectKindArithmetisation / backendSetupMaintained byLicenceStatus
CircomCircuit DSLR1CS → Groth16 / PLONKYes (per-circuit for Groth16)iden3GPL-3.0Production-mature
NoirCircuit DSLACIR → Barretenberg (UltraHonk)Yes (universal)AztecApache-2.0 / MITLate beta, pre-1.0 (1.0.0-beta series through 2026)
Halo2 (upstream)Rust eDSLPLONKish + IPANoneElectric Coin Company (Zcash)MIT / Apache-2.0Production in its home ecosystem
Halo2 (KZG fork)Rust eDSLPLONKish + KZGYes (universal)Ethereum Foundation PSEMIT / Apache-2.0Maintenance mode
gnarkGo eDSLR1CS / PLONK, six curvesYes (scheme-dependent)Consensys (Linea)Apache-2.0Production-mature
arkworksRust library ecosystemR1CS + SNARK interfacesDepends on schemearkworks contributors (academic origin)MIT / Apache-2.0Mature substrate, slow-moving
Plonky3Proof-system toolkitAIR / FRI over small fieldsNonePlonky3 org (Polygon Zero lineage)MIT / Apache-2.0Widely used downstream; pre-1.0 API
Cairo + StwoLanguage + VM + proverCircle STARK (Mersenne-31)NoneStarkWareApache-2.0Production at scale
SP1zkVM (RISC-V)Multilinear / sumcheck + wrapperWrapper onlySuccinctMIT / Apache-2.0Production; deepest assurance evidence
RISC Zero R0VMzkVM (RISC-V)FRI/STARK + Groth16 wrapperWrapper onlyRISC ZeroApache-2.0Production; longest track record; 3.x line in 2026
OpenVMModular zkVM frameworkPlonky3 AIR, chip extensionsWrapper onlyAxiomMIT / Apache-2.0Production-recommended; externally audited
ZKsync AirbenderzkVM (RISC-V)STARK over Mersenne-31 + wrapperWrapper onlyMatter Labs (ZKsync)Apache-2.0 / MITProduction on ZKsync mainnet; published GPU benchmarks
ZiskzkVM (RISC-V)STARK, precompile-heavyWrapper onlyPolygonApache-2.0 / MITAlpha releases; on ethproofs
PicozkVM (RISC-V)Plonky3-based, modularWrapper onlyBrevisApache-2.0 / MIT2.x releases; on ethproofs
Ziren (formerly zkMIPS)zkVM (MIPS)Plonky3-based STARKWrapper onlyZKMApache-2.0 / MIT1.x releases; on ethproofs
JoltzkVM (RISC-V)Lookup-centric sumcheck; lattice variant announced 2026None (transparent)a16z cryptoMIT / Apache-2.0Alpha; maintainers state not production-ready
Miden VMzkVM (stack-based)STARK, custom ISANoneMiden (Polygon spin-out)MIT / Apache-2.0Actively developed; mainnet launch announced for 2026
Nexus zkVMzkVM (RISC-V)Rewritten in 3.0VariesNexusBUSL 1.1 — source-availablePublished spec; activity stalled
ValidazkVM (custom ISA)STARK, prover-optimised ISANoneLitaApache-2.0Low public activity — verify before adopting
zkWASMzkVM (WebAssembly)WASM ISAVariesDelphinus LabApache-2.0Reduced activity; niche
ExpanderGKR prover + compilerLayered circuits, GKRNonePolyhedraAGPL-3.0Active; small ecosystem
SonobeFolding-scheme libraryNova-family foldingDepends on instantiationEthereum Foundation (PSE lineage) and 0xPARCMITExplicitly experimental
o1jsTypeScript ZK DSLKimchi / PicklesYes (universal)o1Labs (Mina)Apache-2.0Production; recursion-native, chain-coupled
LurkLisp-like ZK languageReduction machineVariesLurk Lab (formerly Argument Computer)MITDormant — research reading only
Reading this table

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

Circuit DSL (R1CS)

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.

iden3 Production-mature GPL-3.0 github.com ↗

Noir

Circuit DSL (backend-agnostic)

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.

Aztec Late beta; used in production by some teams Apache-2.0 / MIT github.com ↗

Halo2

Rust eDSL (PLONKish)

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.

Electric Coin Company (upstream); Ethereum Foundation PSE (KZG fork, maintenance mode); Axiom (halo2-lib) Long production history; verify current status MIT / Apache-2.0 github.com ↗

gnark

Go eDSL

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.

Consensys (Linea) Production-mature Apache-2.0 github.com ↗

Plonky3

Proof-system toolkit

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.

Plonky3 organisation (Polygon Zero lineage), with contributors from the zkVM teams built on it Widely used downstream; pre-1.0 API MIT / Apache-2.0 github.com ↗

Cairo and the Stwo prover

Language + VM + 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.

StarkWare Production at scale Apache-2.0 github.com ↗

SP1

zkVM (RISC-V)

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.

Succinct Production, mainnet-deployed MIT / Apache-2.0 github.com ↗

RISC Zero (R0VM)

zkVM (RISC-V)

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.

RISC Zero Production; longest track record Apache-2.0 github.com ↗

OpenVM

Modular zkVM framework

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.

Axiom Production-recommended; externally audited MIT / Apache-2.0 github.com ↗

ZKsync Airbender

zkVM (RISC-V)

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.

Matter Labs (ZKsync) Production on ZKsync mainnet; general-purpose use newer Apache-2.0 / MIT github.com ↗

Jolt

zkVM (RISC-V)

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.

a16z crypto Alpha; not production-ready per maintainers MIT / Apache-2.0 github.com ↗

Miden VM

zkVM (stack-based)

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.

Miden (spun out of Polygon Labs) Actively developed; mainnet launch announced for 2026 MIT / Apache-2.0 github.com ↗

Hosted proving services

Operations — managed proving

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.

Several vendors: Axiom (proving API), RISC Zero (remote proving and Boundless), Succinct (prover network), among others — none is endorsed here Commercially available; vendor maturity varies Proprietary services over open-source zkVMs axiom.xyz ↗

Decentralised proof markets

Operations — proof marketplaces

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.

Boundless (RISC Zero) and the Succinct Prover Network are the leading examples; each is anchored to its sponsor's zkVM Live on mainnet; under a year of operating history Protocol-specific docs.boundless.network ↗

How to run the selection · 8 steps

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

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

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

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

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

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

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

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

MitigationSettle the proof system and its hard constraints first, then treat frameworks that cannot target it as non-candidates regardless of familiarity.

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.

MitigationTreat a backend as real only if you can find recent commits, releases and issues for it — or if you validate it yourself and are prepared to maintain it.

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.

MitigationTrace the assumption to what the chain actually verifies. If a wrapper is used, its parameters are in scope: name their provenance and verify that transcript. See §04.

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.

MitigationAsk what was verified, against which specification, under what hypotheses, and what was explicitly out of scope. A precise, bounded claim is a good sign; an unqualified one is not.

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.

MitigationPrototype your most expensive component in the top candidates and measure prover time, peak RAM and cost per proof on the hardware you will actually rent.

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.

MitigationEnumerate the licence of every layer you ship before writing code, and get legal review rather than relying on forum consensus about what generated artefacts inherit.

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.

MitigationCheck the maintenance posture of the specific fork, not the upstream project. If it is in maintenance mode, budget for owning it or choose differently for greenfield work.

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.

MitigationScope custom precompiles into the audit explicitly, as circuit code. Precompiles are a recurring source of soundness bugs precisely because they are written for speed.

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.

MitigationEstablish what the upstream audit actually covered and treat your specific instantiation — the enabled extensions and their composition — as a separate review target.

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.

MitigationInclude auditor availability and tooling coverage as explicit selection criteria, and get an indicative audit quote for your top candidates before committing.

Sources for this section · 45

  1. Circom — circuit compiler and languageproject
  2. Noir — backend-agnostic circuit DSLproject
  3. Halo2 — upstream implementation (IPA, no trusted setup)project
  4. Halo2 — KZG forkproject
  5. halo2-lib — gadget library for Halo2 circuitsproject
  6. gnark — Go zk-SNARK libraryproject
  7. arkworks — Rust cryptography library ecosystemproject
  8. Plonky3 — polynomial IOP toolkitproject
  9. Cairo — language and compilerproject
  10. Stwo — Circle STARK proverproject
  11. Leo — application language for Aleoproject
  12. o1js — TypeScript ZK DSL with native recursionproject
  13. Barretenberg — the maintained Noir proving backendproject
  14. Expander compiler collection — GKR prover and frontendproject
  15. Sonobe — experimental folding-scheme libraryproject
  16. powdr — zkVM compiler and eDSL toolkitproject
  17. Lurk — Lisp-like ZK language (dormant)project
  18. SP1 — RISC-V zkVMproject
  19. SP1 on-chain verification — Solidity verifier and wrapper optionsdocumentation
  20. sp1-contracts — deployed verifier gateways and addresses per chainproject
  21. SP1 security model — wrapper trusted setup provenancedocumentation
  22. On formal verification and a bug in SP1 Hypercube (EF zkEVM)analysis
  23. RISC Zero R0VM — zkVMproject
  24. RISC Zero trusted setup ceremony rationaledocumentation
  25. RISC Zero remote proving — hosted proving documentationdocumentation
  26. ZKsync Airbender — RISC-V prover for ZKsync OS, with benchmark harnessproject
  27. Zisk — Polygon's RISC-V zkVMproject
  28. Pico — Brevis's modular RISC-V zkVMproject
  29. Ziren (formerly zkMIPS) — ZKM's MIPS zkVMproject
  30. ethproofs.org — continuous proving benchmarks across zkVMs on real Ethereum blocksbenchmark
  31. a16z zkvm-benchmarks — fixed-program comparison harness across zkVMsbenchmark
  32. OpenVM — modular zkVM frameworkproject
  33. Missing subfield membership check in OpenVM pairing — CVE-2026-46669disclosure
  34. Jolt — lookup-centric zkVMproject
  35. Nexus zkVM — source-available RISC-V zkVMproject
  36. Valida — prover-optimised custom ISA zkVMproject
  37. Miden VM — stack-based STARK VMproject
  38. zkWASM — WebAssembly zkVMproject
  39. Ceno — GKR-based zkVM (Scroll)project
  40. Boundless — decentralised proof market documentationdocumentation
  41. Verified zk(E)VM project — formal verification of zkVMsproject
  42. RISC-V architectural certification teststest suite
  43. soundcalc — soundness parameter calculator for hash-based systemstool
  44. Circomspect — static analyser for Circomtool
  45. Picus — uniqueness verification for ZKP circuitstool
03 — Auditing · Assurance, not certification

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.

Constrained and under-constrained circuit comparison Two aligned circuit graphs show how one absent constraint creates a second satisfying output and permits a forged witness. CONSTRAINED UNDER-CONSTRAINED A B C O EXACTLY ONE SATISFYING WITNESS A B C O F TWO SATISFYING WITNESSES ONE OF THEM IS A FORGERY
Fig. 4 · Anatomy of an under-constrained circuit
Need a ZK auditor? Start with zkSecurity

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.

What an audit is and is not

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.

The specification is the binding constraint

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.

How to evaluateBefore scoping: the circuits compile and tests pass; the specification states the relation being proved, all trust assumptions, and every public input with its encoding; the code is frozen on a named commit; known-weak areas are documented rather than hidden.

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.

How to evaluateExplicitly include or exclude: circuits, witness generation, the proving/verifying key pipeline, the on-chain verifier, public input encoding on both sides, the parameters and their provenance, and the surrounding protocol logic. Write down what is out of scope and why.

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.

How to evaluateAsk which named reviewers will work on which layer, and what comparable systems they have reviewed. If you use a novel or modified proof system, confirm someone will review the cryptography itself rather than only its implementation.

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.

How to evaluateAsk what they will actually do: manual constraint-by-constraint review, differential testing against a reference implementation, automated underconstrained detection, formal verification of selected components, or a re-derivation of the protocol's security argument. Ask what they will not do.

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.

How to evaluateSequence the audit before any circuit-specific trusted setup and before immutable deployment. Leave calendar room for a fix-review round; a remediation review is a separate, smaller engagement, not an afterthought.

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.

How to evaluateDisclose prior involvement, token holdings and advisory relationships in the report. For high-value systems, use more than one independent provider rather than a larger engagement with one.

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.

How to evaluateAgree publication terms up front: full report or summary, fix status per finding, and whether the reviewer may publish independently. Be sceptical of a summary that names no findings.

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 evaluatePlan containment once, covering all three: independent redundancy across provers or implementations; supply and balance invariants checked outside the proof system, so forged value is detectable; withdrawal rate limits and a delay window before finality; a governed and rehearsed verifier-key rotation path; and a funded bounty that classifies proof forgery as unambiguously critical.

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.

How to evaluateCheck that the reviewed commit is actually an ancestor of what shipped; that findings marked "acknowledged" rather than "fixed" are still live risks you are inheriting; and that nothing in the out-of-scope list has since become load-bearing in production. A clean report on the wrong commit tells you nothing about the system you are integrating.

Assurance beyond the audit window

An audit covers one commit. Systems change, and the review does not follow them.

How to evaluatePlan continuous assurance: automated circuit analysis in CI, a funded bug bounty scaled to value at risk, staged rollout with caps, an incident response plan, and re-review triggered by circuit changes.

Assurance matrix · 9

What each assurance technique can and cannot find

Filter by hard constraint
Assurance techniques by layer, cost profile and coverage guarantee
TechniqueLayerCharacteristic findsBlind toCoverage claimCost profile
Manual circuit reviewCircuitUnderconstraint, missing range checks, composition errors, and application-semantic bugs no tool modelsLarge repetitive constraint sets where attention degrades; anything outside the read scopeNone — unmeasurableHigh, reviewer-limited
Automated underconstraint detectionCircuitNon-unique outputs for a fixed input, unconstrained signals, non-strict bit decompositionsApplication semantics, replay, key management, transcript design; often returns 'unknown' on hash and bigint gadgetsPer-property, where the solver terminatesVery low once wired in
Formal verificationCircuit / proof systemAny deviation from the stated theorem, across all inputs rather than sampled onesA wrong or incomplete specification; the gap between the extracted model and the deployed binaryTotal, relative to spec and assumptionsHighest; scarce expertise
Differential and fuzz testingCircuit / VMDivergence from a reference implementation; witnesses a malicious prover could passAnything the oracle also gets wrong; bug classes outside the mutation modelSampled onlyModerate setup, cheap to re-run
Cryptographic protocol reviewProof systemWeak Fiat–Shamir, unsound composition and recursion boundaries, wrong concrete security parametersImplementation defects in the circuit above it; deployment and integration issuesNone — argument-basedHigh; cryptographers, not circuit engineers
Audit contestWhole scopeThe long tail after targeted review; findings quick to demonstrateDeep cryptographic soundness work, which is under-rewarded relative to its costNone; no accountable partyFixed pool, pay-for-results
Bug bountyDeployed systemWhatever survived everything else, on the code actually runningEverything, until someone looks — no pre-launch assuranceNoneContingent; needs credible max payout
Verifier and integration reviewVerifier / on-chainPublic-input aliasing and encoding mismatch, replay, verifying-key drift, missing point checksCircuit-internal soundnessNone — but the code is smallLow; conventional review skills
LLM-assisted reviewCircuit / librariesSustained attention over large cryptographic library surfaces (evidence so far: a single self-reported finding)Unknown and unmeasurable; false negatives are invisibleNoneLow per run; expert triage is the real cost
Reading this table

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

Choosing an audit and formal verification partner

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.

Recommended first: zkSecurity

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.

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.

Production standard Service github.com ↗

Automated underconstraint detection

Static analysis / SMT

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.

Production-used, unevenly maintained Mixed (MIT / GPL-3.0) github.com ↗

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.

Our first choice for formal verification of ZK: zkSecurity

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.

Research to early production Mixed (MIT / Apache-2.0) verified-zkevm.org ↗

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.

Research tooling with production impact Mixed (GPL-3.0 / Apache-2.0) arxiv.org ↗

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.

Established discipline Service eprint.iacr.org ↗

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.

Production standard Service github.com ↗

Audit contests

Crowdsourced review

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.

Production-used for ZK scopes Platform cantina.xyz ↗

Bug bounties

Crowdsourced review

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.

Run by the deploying team, usually on a bounty platform; the linked ZKsync Era programme is one example of a published ZK scope, not a recommendation Production standard Platform immunefi.com ↗

LLM-assisted review

Emerging tooling

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.

Emerging; one CVE-assigned production finding Varies; mostly proprietary blog.zksecurity.xyz ↗

The engagement, start to finish · 8 steps

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

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

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

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

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

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

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

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

MitigationRun automated underconstrained-signal detection; review that every witness-assigned value is also constrained; fuzz for accepted-but-invalid witnesses rather than only checking valid ones are accepted.

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.

MitigationTest completeness deliberately: generate valid witnesses across boundary values and assert the proof is produced, fuzz against a reference implementation for rejected-but-valid inputs, and include completeness in the bug-bounty scope. Tools that vet completeness as well as soundness exist for zkVMs and some circuit pipelines.

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.

MitigationEnforce explicit range constraints on every externally influenced value, and check that decompositions into bits are both complete and canonical, rejecting non-canonical representations.

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.

MitigationConstrain witness generation to a canonical form. Where uniqueness matters downstream, enforce it in the circuit rather than relying on the honest prover implementation.

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.

MitigationHash the complete transcript, in a fixed order, including all public inputs and every commitment, with domain separation. Compare the implementation against the paper's transcript definition line by line rather than assuming the library handles it.

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.

MitigationDefine the encoding once, in the specification, and test round-trip equivalence across every implementation of it — circuit, prover, on-chain verifier and client.

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.

MitigationBind proofs to a domain, a chain identifier and a spending context; constrain nullifier derivation to be deterministic and collision-resistant in the circuit; check the nullifier set atomically with the state change.

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.

MitigationValidate every deserialised group element for curve membership and subgroup order before use, including in hand-written or gas-optimised verifiers where such checks are the first thing removed.

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.

MitigationNever treat proof bytes as a unique identifier. Derive uniqueness from constrained in-circuit values such as nullifiers, and canonicalise encodings on deserialisation.

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.

MitigationRead the library's security notes and audit history; grep production paths for setup and testing helpers; pin and record the exact security parameters, and assert them at build time.

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.

MitigationTreat every unconstrained or unsafe block as a review checkpoint with an explicit written obligation: what the caller must verify, and where that verification happens. Grep for them and enumerate them in the audit scope rather than trusting the accompanying comment.

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.

MitigationUnderstand exactly what your framework's test prover checks, and pair it with negative tests that mutate the witness and assert rejection, plus automated uniqueness analysis. Never treat a green mock prover run as a soundness result.

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.

MitigationReview the bus or cross-table argument as its own artefact: enumerate every send and receive, check they balance, and confirm multiplicity columns are range-constrained and cannot be chosen freely by the prover.

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.

MitigationTreat every recursion and aggregation boundary as its own review target with its own written contract: what the inner proof guarantees, what the outer layer must independently re-check, and what happens on abnormal termination. Do not assume a boundary is covered because both sides were reviewed.

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.

MitigationWrite down the target soundness in bits, state whether it relies on conjectured bounds, and have the parameter derivation reviewed as an artefact in its own right — not inferred from a configuration file.

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.

MitigationPin the hash of circuit artefacts and verifying keys in CI and on-chain, fail the build on mismatch, and make the deployed key hash publicly checkable against the audited commit.

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.

MitigationScope protocol-level review explicitly, including privacy leakage through metadata and side channels outside the proof, and review the specification's claims about what an adversary cannot learn.

Sources for this section · 48

  1. zkSecurity — ZK security audits and cryptographic engineeringprovider
  2. zkSecurity — public audit reportsaudit reports
  3. Clean — Lean circuit DSL developed by zkSecuritycode and documentation
  4. Introducing Clean, a formal verification DSL for ZK circuits in Lean 4 (zkSecurity)technical introduction
  5. zk.golf — circuit optimisation challenges verified in Lean 4learning and practice
  6. Veridise — zero-knowledge audit servicesprovider
  7. Veridise — security proofs for cryptographic protocolsprovider
  8. Zellic — ZK circuit and applied cryptography security assessmentsprovider
  9. 0xPARC ZK Bug Tracker — bug taxonomy (frozen since late 2024; Circom/application-circuit skew)reference
  10. ZKProof Community Reference — terminology, security recommendations, standardisationreference
  11. ZKDocs — interactive documentation on proof systems and primitives (Trail of Bits)reference
  12. Weak Fiat–Shamir Attacks on Modern Proof Systems (Dao, Miller, Wright, Grubbs)paper
  13. Coordinated disclosure: Girault, Bulletproofs and PlonK (Trail of Bits)disclosure
  14. The Frozen Heart vulnerability in PlonK (Trail of Bits)disclosure
  15. The Frozen Heart vulnerability in Bulletproofs (Trail of Bits)disclosure
  16. Zcash counterfeiting vulnerability remediated — CVE-2019-7167, the BCTV14 setup flawdisclosure
  17. Responsible disclosure of an SP1 zkVM exploit (LambdaClass, 3MI Labs, Aligned)disclosure
  18. 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
  19. Missing subfield membership check in OpenVM pairing — CVE-2026-46669disclosure
  20. snarkjs #358 — public signals not checked against the field modulus (input aliasing)issue
  21. In-depth analysis of the zk-SNARK input aliasing vulnerability (Beosin)analysis
  22. On the malleability of Groth16 proofs (Sui)analysis
  23. Another look at extraction and randomization of Groth's zk-SNARKpaper
  24. Automated detection of underconstrained circuits (QED², PLDI 2023)paper
  25. Picus — automated verification of the uniqueness property for ZKP circuits (Veridise)tool
  26. Circomspect — static analyser and linter for Circom (Trail of Bits)tool
  27. It pays to be Circomspect — motivation and bug classes (Trail of Bits)analysis
  28. CIVER — modular verification of Circom circuits, shipped as a fork of the compilertool
  29. Ecne — early automated uniqueness checking for R1CStool
  30. Coda — refinement types for verifying Circom circuits in Coqtool
  31. Practical security analysis of ZKP circuits (ZKAP, USENIX Security '24)paper
  32. halo2-analyzer / Korrekt — abstract interpretation and SMT analysis of PLONKish circuitstool
  33. Automated analysis of Halo2 circuitspaper
  34. CCC-Check — language-agnostic detection of computation-constraint inconsistencies in ZKP programs via value inferencepaper
  35. zkFuzz — fuzzing framework for zero-knowledge circuitspaper
  36. Circuzz — fuzzing ZK processing pipelines (ACM CCS 2025)paper
  37. Arguzz — testing zkVMs for soundness and completeness bugs (USENIX Security '26)paper
  38. Automated soundness and completeness vetting of Polygon zkEVM (USENIX Security '25)paper
  39. Verified zk(E)VM project — Ethereum Foundation formal verification effortproject
  40. clean — Lean 4 DSL for writing and formally verifying ZK circuitstool
  41. ArkLib — formally verified arguments of knowledge in Leantool
  42. Formal verification of Halo2 circuits in Lean (Halva, Nethermind)analysis
  43. Comparison of formal verification frameworks for arithmetic circuitsanalysis
  44. soundcalc — soundness calculator across hash-based zkEVMs (Ethereum Foundation)tool
  45. zkEVM security overview — multiproof redundancy, testing, audits, formal verificationreference
  46. ZK audit checklist — concrete per-category audit checksreference
  47. RISC-V architectural certification tests — conformance oracle for RISC-V zkVMstest suite
  48. Ethereum execution specs — reference tests for zkEVM conformance (absorbed the former execution-spec-tests)test suite
04 — Trusted setup · Only if your proof system demands it

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.

Trusted setup ceremony contribution chain Six participant contributions flow through a public beacon into the final structured reference string. Security requires only one honest participant. BEACON SRS CONTRIBUTES RANDOMNESS DESTROYS THE SECRET 01 02 03 04 05 06 SECURE IF ANY ONE OF THESE WAS HONEST
Fig. 5 · Contribution chain, beacon and the 1-of-N assumption
Read this first

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.

The residual risk never reaches zero

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.

How to evaluateCheck the commitment scheme first: FRI and Merkle/hash-based commitments need no setup; KZG does. If a setup is unavoidable, establish whether it is universal and updatable or circuit-specific, because that determines whether you repeat this exercise every time the circuit changes.

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.

How to evaluateConfirm three things in order: that the transcript can serve your scheme — Groth16 needs a phase 1 carrying alpha- and beta-shifted powers, which a pure powers-of-tau/KZG transcript does not have; that the curve matches; and that the degree bound covers your largest expected circuit with headroom. Then verify the published transcript yourself rather than trusting the claim. If you must run phase 2 for a circuit-specific system, you can still build it on a reused phase 1.

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.

How to evaluateRecruit across organisations, jurisdictions and interests, including parties with no stake in your project. Publish who contributed and when. A hundred contributors who all work for you is a weaker argument than five who visibly do not.

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.

How to evaluateRequire each contribution to be publicly verifiable against the previous state, have participants sign an attestation naming their randomness source and destruction method, and run the verifier over the full chain — not just the final file — before publishing.

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.

How to evaluatePrefer the operating system CSPRNG, optionally mixed with additional entropy. Treat exotic entropy theatre — lava lamps, dice on camera, radio static — as public communication, not as a security control, and never as the sole source. Ensure the secret is destroyed with the machine state, ideally on an air-gapped or ephemeral machine.

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.

How to evaluatePublish the full transcript, the verification tool, the exact commands to reproduce the check, and the hashes of every intermediate file, in durable locations under more than one party's control. Assume the person checking has no relationship with you.

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.

How to evaluateUse a beacon whose value was unknowable at ceremony time and is verifiable afterwards, publish the exact beacon value and how it was derived, and commit to the choice of beacon before it is known.

Operational and communication plan

Ceremonies are logistics exercises. Most failures are dropped participants, ambiguous instructions and unclear deadlines, not cryptography.

How to evaluateDecide coordinator-driven versus queue-based participation, budget for participants who start and never finish, rehearse end to end on a small circuit, and write the user-facing explanation of the trust assumption before the ceremony rather than after.

Reusable setups · 9

Reusable public setups

Filter by hard constraint
Published ceremonies whose output can be adopted instead of running your own
CeremonyCurveSize / degree boundContributionsUsable forRunAdoption caveat
Perpetual Powers of TauBN254up to 2^2880+ recordedGroth16 and PLONK-family2019 – 2024; repository archived Aug 2026No 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)BN2542^28PPOT contributions 1–54 plus a beaconGroth16 and PLONK-family2020The 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 tauBLS12-3812^2719Groth16 and PLONK-family2019 – 2020The 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 ceremonyBLS12-3812^12 – 2^15 G1, 65 G2141,416KZG only — not Groth1613 Jan – 8 Aug 2023By 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 IgnitionBN254~100.8M G1 points~176KZG only — not Groth162019 – Jan 2020The 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 tauBLS12-3812^2188 entriesGroth16 and PLONK-familyNov 2017 – early 2018The 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 2BN254Circuit-specific1,114Reference only — not reusable parametersMay 2020Not 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 ceremonyBLS12-377Circuit-specific15,000+ in phase 1Reference only — not reusable parameters2023Not 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 attestationsBLS12-381Circuit-specific, very large~12–19 per circuit setReference only — not reusable parameters2020, 2021–22Not 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.
Reading this table

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

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.

See the transparent families in §01: StarkWare, Polygon, RISC Zero, Succinct, Zcash and others ship transparent provers Production-used at scale Varies by implementation eprint.iacr.org ↗

snarkjs (powersoftau + zkey)

Phase 1 and phase 2 tooling

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.

iden3 (Polygon ID lineage), open source Production-used, actively maintained GPL-3.0 github.com ↗

gnark mpcsetup

Phase 1 and phase 2 tooling

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.

Consensys (gnark team) Maintained; smaller ceremony track record Apache-2.0 pkg.go.dev ↗

Coordinated phase-2 ceremony platforms

Coordinated ceremony platform

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.

Ethereum Foundation Privacy & Scaling Explorations (p0tion, DefinitelySetup); maintenance mode Production-used, maintenance mode MIT github.com ↗

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.

Ethereum Foundation (KZG ceremony specification and sequencer) Completed and published; not maintained CC0-1.0 (specification) github.com ↗

Coordinatorless and on-chain ceremonies

Ceremony design (research)

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.

Academic authors (Powers-of-Tau to the People; a16z crypto research on-chain ceremony prototype) Research with prototypes Academic; see reference implementations eprint.iacr.org ↗

Process · 10 steps

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

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

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

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

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

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

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

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

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

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

MitigationTreat phase 2 as mandatory for any circuit-specific setup, even a single contribution by the team. Assert in CI and in the deployment checklist that the contribution count is non-zero and that gamma and delta differ from the generator and from each other. Auditors reviewing a Groth16 verifier should check the deployed key for this condition explicitly.

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.

MitigationConsider adding your own contribution on top of the adopted SRS. Weigh it against the cost: an updated SRS is no longer byte-identical to the widely mirrored artefact, so you take on publishing and verification duties that reuse would otherwise have avoided.

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.

MitigationCheck scheme compatibility before curve and before size. Run your toolchain's phase-2 initialisation against the candidate artefact as the very first step, not after the ceremony has been planned.

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.

MitigationSettle the setup question as part of §01, not afterwards. If a setup-free system meets the constraints, the entire workstream and its residual risk disappear.

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.

MitigationProvide tooling and written procedure: ephemeral or air-gapped machines, no swap, no backups, secure erase or destruction of the medium. Have participants attest to what they actually did, not to what was recommended.

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.

MitigationVerify each contribution on receipt and re-verify the full chain before publication. Publish the verification output alongside the transcript.

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.

MitigationRecruit adversarially: parties with no stake, competitors, independent researchers, other jurisdictions. Publish affiliations so readers can judge independence for themselves.

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.

MitigationFreeze the circuit and complete the audit before the circuit-specific phase. If a change is unavoidable, repeat the phase properly and treat the timeline slip as the cost of the design choice — or move to a universal setup so this class of event stops being fatal.

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.

MitigationTrace the trust assumption all the way to what the chain actually verifies. If a wrapper is used, its parameters are in scope: name their provenance, verify that transcript, and describe the assumption in user-facing documentation rather than claiming the system is setup-free.

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.

MitigationRecord the exact ceremony, branch, contribution index, file and hash you adopted, publish them, and verify that specific chain yourself rather than relying on the ceremony's overall reputation.

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.

MitigationCheck curve and degree against the largest circuit you expect to need, not the current one, and add an automated check that the loaded SRS matches the expected identity and size at build time.

The transcript becomes unavailable

Artefacts live in one repository, one bucket or one company's infrastructure. Years later the links are dead, the verification tool no longer builds, and no one can independently confirm the ceremony happened as described.

MitigationMirror artefacts across independent parties and archival services, pin content hashes in the published documentation, and keep the verifier buildable with pinned dependencies.

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.

MitigationHave the setup construction itself reviewed as cryptography, separately from the ceremony's operation — see §03. Prefer constructions with multiple independent implementations and published security proofs over bespoke or modified parameter generation.

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.

MitigationRank the ceremony against the other risks in the system honestly. For most deployments the circuit and the verifier are far likelier failure points than the setup, and should receive proportionally more budget.

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.

MitigationUse the platform CSPRNG as the primary source. Additional entropy may be mixed in, and may be filmed for communication purposes, but the security argument must not depend on it.

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.

MitigationPin the parameter hash in the verifier and in CI, and fail the build on mismatch. Include the check in the audit scope.

Sources for this section · 42

  1. SoK: Trusted setups for powers-of-tau strings (Wang, Cohney, Bonneau; FC 2025)paper
  2. Scalable multi-party computation for zk-SNARK parameters in the random beacon modelpaper
  3. Snarky Ceremonies — Groth16 ceremony security analysispaper
  4. Powers-of-Tau to the People: decentralising setup ceremoniespaper
  5. Lite-PoT: practical powers-of-tau setup ceremony (CCS 2025)paper
  6. ZKProof community reference: setup ceremoniesreference
  7. Wrapping up the KZG ceremony — 141,416 contributions over 208 daysrecord
  8. KZG ceremony special contributions — alternative entropy sourcesrecord
  9. ethereum/kzg-ceremony — transcript, FAQ, audits, independent verifierstranscript
  10. ethereum/kzg-ceremony-specs — SRS sizes and contribution formatspec
  11. ceremony.ethereum.org — participation and transcript verificationrecord
  12. Perpetual Powers of Tau — contribution chain, attestations, beacontranscript
  13. Perpetual Powers of Tau — verifying a contributionprocedure
  14. Perpetual Powers of Tau technical reportreport
  15. snarkjs — powersoftau and zkey commands, supported curvestool
  16. gnark mpcsetup — Groth16 BN254 phase 1 and phase 2tool
  17. p0tion — phase-2 ceremony toolkit (in maintenance mode)tool
  18. DefinitelySetup — ceremony registry and coordination front endtool
  19. phase2-bn254 — Rust phase-2 tooling used by several BN254 ceremoniestool
  20. RISC Zero trusted setup ceremony — rationale for a STARK-verify wrapper circuitrecord
  21. SP1 security model — documented reliance on an existing setup for its wrapperdocumentation
  22. Aztec Ignition ceremony completion report (BN254, ~100M points)record
  23. AztecProtocol/Setup — Ignition MPC ceremony code and transcript toolingtranscript
  24. AztecProtocol/ignition-verification — independent verification of the Ignition transcripttool
  25. ZcashFoundation/powersoftau-attestations — 88 entries ending in a random beacontranscript
  26. The design of the ceremony — Zcash Sprout operational security (archived copy; the original post has been removed)record
  27. Reinforcing the security of the Sapling MPC — Maller's proof that the beacon is not needed in the generic group model (archived copy)analysis
  28. Filecoin powers of tau — BLS12-381 phase 1 at 2^27, 19 participantstranscript
  29. Filecoin: trusted setup complete — phase 1 and phase 2 summaryrecord
  30. Hermez: selection of Perpetual Powers of Tau contribution 54 plus beacon — origin of the powersOfTau28_hez filesrecord
  31. Tornado Cash trusted-setup-server — phase 2 with 1,114 contributions on PPOT contribution 30transcript
  32. Penumbra summoning ceremony — decentralised phase 2 run through the chain's own walletrecord
  33. Zcash counterfeiting vulnerability remediated — the BCTV14 setup flawdisclosure
  34. The first ZK exploits happened, and they weren't what we expectedanalysis
  35. filecoin-project/phase2-attestations — production Groth16 phase-2 recordstranscript
  36. Filecoin trusted setup artefact hostingartefact
  37. semaphore-phase2-setup — phase 2 built on a Perpetual Powers of Tau challenge filetranscript
  38. ark-srs — Rust utility for consuming SRS from existing ceremoniestool
  39. ptau-deserializer — converts snarkjs phase-1 output for use with gnarktool
  40. drand / League of Entropy — distributed publicly verifiable randomness beaconservice
  41. Debian DSA-1571-1 — predictable OpenSSL random number generatoradvisory
  42. 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.