Choosing a framework
Framework choice resolves into one structural decision and a set of consequences. The structural decision is whether to hand-write an arithmetic circuit in a DSL or to prove a compiled program in a zkVM. A hand-written circuit encodes only your statement, so proving cost can be orders of magnitude lower — but you own the correctness of every constraint. A zkVM lets you write ordinary code and inherit an audited constraint system, at the cost of proving a whole machine. Everything else — language, tooling, licence, hiring — follows from that choice and from the backend you settled in §01.
If machine-checked circuit correctness is a requirement, explore Clean and our formal verification guide before committing to a toolchain. Our first recommendation for ZK architecture questions, audit planning and verification work is zkSecurity. See the consultancy shortlist for other providers and the basis for that editorial choice.
Favour a hand-written circuit when the statement is small, fixed and hot — a Merkle membership check, a signature verification, a circuit run millions of times — and the marginal proving cost dominates. Favour a zkVM when the statement is large, changing, or reuses existing code, and engineering time and correctness risk dominate. The honest test is arithmetic: would rewriting the logic as constraints cost more engineer-months than the proving-cost difference saves over two years? Compute both numbers. Hybrid designs — a zkVM with a hand-written precompile for the hot path — are common and often correct.
Licensing in this ecosystem is unusually varied and several widely used tools are not permissive. Copyleft compilers and standard libraries, AGPL provers, and source-available licences that specifically restrict offering the software as a service all exist among mainstream options. The compiler, standard library, prover and verifier contract can each carry a different licence. This regularly surprises teams building commercial or hosted products, and it is far cheaper to check now than to migrate later. Get legal review rather than forum advice.
Decision criteria · 13
Hand-written circuit or zkVM
This dominates every downstream cost: proving time, proof size, audit scope, hiring, and how much correctness you personally own. It is not primarily a technology preference — it is a decision about where you want your risk to sit.
Expressiveness versus auditability
The more freely a language lets you write constraints, the more ways there are to write a constraint system that does not say what you think it says. Power and audit cost move together.
Backend swappability
Proof systems have turned over roughly every eighteen to twenty-four months. If your source language is welded to one backend, a backend change is a rewrite rather than a re-target.
Recursion and aggregation
Recursion determines whether you can shard long computations, aggregate many proofs into one on-chain verification, and compress a large proof into a small one. It is also the least-verified part of most stacks.
Underconstrained-bug risk and analysis tooling
Underconstrained circuits are the dominant soundness bug class and they are silent: all tests pass and all proofs verify. Tool coverage is highly uneven across languages, and it is a real input to risk.
Debuggability and negative testing
Circuit DSLs are historically weakest exactly where zkVMs are strongest: you can run a zkVM guest natively under a debugger before proving anything. Separately, constraint-level coverage — proving that a malicious witness is rejected — is different from ordinary unit testing and is not provided by default anywhere.
Precompiles, accelerators and extensibility
For zkVMs, nearly all real-world performance comes from precompiles — accelerated hashing, elliptic curve operations, big-integer arithmetic — not from the base instruction set. Whether you can add your own without forking the project determines whether you can optimise your own workload.
On-chain verifier cost and proof size
If proofs settle on a chain, gas per verification and calldata size are hard constraints — and they are set by the final wrapper, not by the inner proof system. This surprises teams who chose a setup-free inner system for its properties.
Proving cost, hardware and memory profile
Peak memory decides feasibility more often than wall-clock time: a prover needing hundreds of gigabytes cannot run where one needing a few can. Streaming and folding provers change this profile qualitatively.
Field, curve and interop constraints
The prime field is not a free parameter. Non-native arithmetic — foreign-curve operations inside a small-field STARK, or the reverse — can cost a hundredfold, and it determines whether you can cheaply verify existing signatures, commitments or other proofs.
Post-quantum posture of the whole stack
Teams pick a hash-based stack partly for post-quantum reasons and then wrap the proof in a pairing-based SNARK for settlement, which removes the property from the composed artefact. The framework layer is where that happens, so it has to be checked here and not only in §01.
Security track record and disclosure practice
Every serious stack has had at least one critical soundness finding. What distinguishes them is whether it was found by the project's own process, disclosed publicly, and fixed in a released version with an identifier — not how many audit badges are on the README.
Ecosystem longevity and hiring
ZK engineering talent is scarce and language-specific, and auditors are concentrated in the same few languages. A niche choice means slow hiring and slow, expensive audits.
Selection matrix · 24
Framework selection matrix
| Project | Kind | Arithmetisation / backend | Setup | Maintained by | Licence | Status |
|---|---|---|---|---|---|---|
| Circom | Circuit DSL | R1CS → Groth16 / PLONK | Yes (per-circuit for Groth16) | iden3 | GPL-3.0 | Production-mature |
| Noir | Circuit DSL | ACIR → Barretenberg (UltraHonk) | Yes (universal) | Aztec | Apache-2.0 / MIT | Late beta, pre-1.0 (1.0.0-beta series through 2026) |
| Halo2 (upstream) | Rust eDSL | PLONKish + IPA | None | Electric Coin Company (Zcash) | MIT / Apache-2.0 | Production in its home ecosystem |
| Halo2 (KZG fork) | Rust eDSL | PLONKish + KZG | Yes (universal) | Ethereum Foundation PSE | MIT / Apache-2.0 | Maintenance mode |
| gnark | Go eDSL | R1CS / PLONK, six curves | Yes (scheme-dependent) | Consensys (Linea) | Apache-2.0 | Production-mature |
| arkworks | Rust library ecosystem | R1CS + SNARK interfaces | Depends on scheme | arkworks contributors (academic origin) | MIT / Apache-2.0 | Mature substrate, slow-moving |
| Plonky3 | Proof-system toolkit | AIR / FRI over small fields | None | Plonky3 org (Polygon Zero lineage) | MIT / Apache-2.0 | Widely used downstream; pre-1.0 API |
| Cairo + Stwo | Language + VM + prover | Circle STARK (Mersenne-31) | None | StarkWare | Apache-2.0 | Production at scale |
| SP1 | zkVM (RISC-V) | Multilinear / sumcheck + wrapper | Wrapper only | Succinct | MIT / Apache-2.0 | Production; deepest assurance evidence |
| RISC Zero R0VM | zkVM (RISC-V) | FRI/STARK + Groth16 wrapper | Wrapper only | RISC Zero | Apache-2.0 | Production; longest track record; 3.x line in 2026 |
| OpenVM | Modular zkVM framework | Plonky3 AIR, chip extensions | Wrapper only | Axiom | MIT / Apache-2.0 | Production-recommended; externally audited |
| ZKsync Airbender | zkVM (RISC-V) | STARK over Mersenne-31 + wrapper | Wrapper only | Matter Labs (ZKsync) | Apache-2.0 / MIT | Production on ZKsync mainnet; published GPU benchmarks |
| Zisk | zkVM (RISC-V) | STARK, precompile-heavy | Wrapper only | Polygon | Apache-2.0 / MIT | Alpha releases; on ethproofs |
| Pico | zkVM (RISC-V) | Plonky3-based, modular | Wrapper only | Brevis | Apache-2.0 / MIT | 2.x releases; on ethproofs |
| Ziren (formerly zkMIPS) | zkVM (MIPS) | Plonky3-based STARK | Wrapper only | ZKM | Apache-2.0 / MIT | 1.x releases; on ethproofs |
| Jolt | zkVM (RISC-V) | Lookup-centric sumcheck; lattice variant announced 2026 | None (transparent) | a16z crypto | MIT / Apache-2.0 | Alpha; maintainers state not production-ready |
| Miden VM | zkVM (stack-based) | STARK, custom ISA | None | Miden (Polygon spin-out) | MIT / Apache-2.0 | Actively developed; mainnet launch announced for 2026 |
| Nexus zkVM | zkVM (RISC-V) | Rewritten in 3.0 | Varies | Nexus | BUSL 1.1 — source-available | Published spec; activity stalled |
| Valida | zkVM (custom ISA) | STARK, prover-optimised ISA | None | Lita | Apache-2.0 | Low public activity — verify before adopting |
| zkWASM | zkVM (WebAssembly) | WASM ISA | Varies | Delphinus Lab | Apache-2.0 | Reduced activity; niche |
| Expander | GKR prover + compiler | Layered circuits, GKR | None | Polyhedra | AGPL-3.0 | Active; small ecosystem |
| Sonobe | Folding-scheme library | Nova-family folding | Depends on instantiation | Ethereum Foundation (PSE lineage) and 0xPARC | MIT | Explicitly experimental |
| o1js | TypeScript ZK DSL | Kimchi / Pickles | Yes (universal) | o1Labs (Mina) | Apache-2.0 | Production; recursion-native, chain-coupled |
| Lurk | Lisp-like ZK language | Reduction machine | Varies | Lurk Lab (formerly Argument Computer) | MIT | Dormant — research reading only |
Status reflects the state of each project as researched for this version and is the fastest-decaying information here — verify before committing. "Setup" is the requirement of the default backend; a wrapper added for on-chain verification can reintroduce one. Licence is the compiler or core repository; the standard library, prover and verifier contract may differ.
The landscape · 14 pages
How to run the selection · 8 steps
Write down the statement and its volume
What exactly is proved, how often, on what hardware, and where is it verified? Without these four numbers every framework comparison is aesthetic. Include the largest circuit you expect within two years, not the prototype.
Eliminate on the hard constraints from §01
Cross off anything that cannot target your chosen proof system, cannot meet the verifier cost budget, or carries a licence you cannot ship. This usually removes most of the field before any subjective comparison begins.
Decide circuit versus zkVM explicitly, in writing
Price both paths in engineer-months and in proving cost over a realistic horizon. Record the decision and its reasoning, because it is the assumption most likely to be revisited later under pressure.
Prototype the hardest part, not the easiest
Build the single most expensive component of your statement — the foreign-field operation, the hash loop, the recursion step — in the top two candidates. Fibonacci benchmarks tell you nothing about your workload.
Measure the wrapping step separately
Time and cost the recursion and on-chain wrapper independently of the base proof. It is frequently the bottleneck, and it is where a setup-free system can reacquire a trusted setup.
Check the tooling you will depend on daily
Run the debugger, write a negative test that mutates a witness and asserts the proof fails, and wire the available static analysis into CI. If any of these is missing, you will feel it every week for the life of the project.
Diligence maintenance and disclosure before committing
Check commit activity, release cadence and distinct recent contributors. Read the project's published security findings and how they were handled. Confirm the licence of every layer you ship with counsel.
Record the decision and its expiry conditions
Write down what would make you revisit: a backend change, a maintenance stall, a licence change, a proof cost that stops closing. A framework decision with no stated expiry conditions quietly becomes permanent.
Where framework decisions go wrong · 10
Sources for this section · 45
- Circom — circuit compiler and languageproject
- Noir — backend-agnostic circuit DSLproject
- Halo2 — upstream implementation (IPA, no trusted setup)project
- Halo2 — KZG forkproject
- halo2-lib — gadget library for Halo2 circuitsproject
- gnark — Go zk-SNARK libraryproject
- arkworks — Rust cryptography library ecosystemproject
- Plonky3 — polynomial IOP toolkitproject
- Cairo — language and compilerproject
- Stwo — Circle STARK proverproject
- Leo — application language for Aleoproject
- o1js — TypeScript ZK DSL with native recursionproject
- Barretenberg — the maintained Noir proving backendproject
- Expander compiler collection — GKR prover and frontendproject
- Sonobe — experimental folding-scheme libraryproject
- powdr — zkVM compiler and eDSL toolkitproject
- Lurk — Lisp-like ZK language (dormant)project
- SP1 — RISC-V zkVMproject
- SP1 on-chain verification — Solidity verifier and wrapper optionsdocumentation
- sp1-contracts — deployed verifier gateways and addresses per chainproject
- SP1 security model — wrapper trusted setup provenancedocumentation
- On formal verification and a bug in SP1 Hypercube (EF zkEVM)analysis
- RISC Zero R0VM — zkVMproject
- RISC Zero trusted setup ceremony rationaledocumentation
- RISC Zero remote proving — hosted proving documentationdocumentation
- ZKsync Airbender — RISC-V prover for ZKsync OS, with benchmark harnessproject
- Zisk — Polygon's RISC-V zkVMproject
- Pico — Brevis's modular RISC-V zkVMproject
- Ziren (formerly zkMIPS) — ZKM's MIPS zkVMproject
- ethproofs.org — continuous proving benchmarks across zkVMs on real Ethereum blocksbenchmark
- a16z zkvm-benchmarks — fixed-program comparison harness across zkVMsbenchmark
- OpenVM — modular zkVM frameworkproject
- Missing subfield membership check in OpenVM pairing — CVE-2026-46669disclosure
- Jolt — lookup-centric zkVMproject
- Nexus zkVM — source-available RISC-V zkVMproject
- Valida — prover-optimised custom ISA zkVMproject
- Miden VM — stack-based STARK VMproject
- zkWASM — WebAssembly zkVMproject
- Ceno — GKR-based zkVM (Scroll)project
- Boundless — decentralised proof market documentationdocumentation
- Verified zk(E)VM project — formal verification of zkVMsproject
- RISC-V architectural certification teststest suite
- soundcalc — soundness parameter calculator for hash-based systemstool
- Circomspect — static analyser for Circomtool
- Picus — uniqueness verification for ZKP circuitstool
Cite this page
MarketComp (2026). Choosing a framework. The ZK Field Manual (Version 1.3). MarketComp. https://zkpick.com/frameworks/
@misc{zkfieldmanual-choosing-a-framework,
title = {Choosing a framework — The ZK Field Manual},
author = {MarketComp},
year = {2026},
version = {1.3},
howpublished = {\url{https://zkpick.com/frameworks/}},
note = {Accessed: YYYY-MM-DD}
}