GROTH16
snark · pairing-based
Smallest proofs in the business — 3 group elements, ~200k gas to verify on EVM. Per-circuit trusted setup. Ideal for fixed rollup circuits that ship rarely.
- proof size 192 B
- verify 206k gas
- setup per-circuit
// zk-proof infrastructure · v3.11.0 · mainnet
Zerocopy turns a witness into a verifiable zk-SNARK or STARK proof in milliseconds, not minutes. Submit over gRPC, settle on-chain, pay per proof. No GPU farm to babysit, no trusted-setup ceremony to run.
Pick the backend that fits your trust model and your gas budget. We compile your R1CS / AIR once and route every job to warm provers.
snark · pairing-based
Smallest proofs in the business — 3 group elements, ~200k gas to verify on EVM. Per-circuit trusted setup. Ideal for fixed rollup circuits that ship rarely.
snark · universal setup
One universal SRS, any circuit. Swap your proving logic without a new ceremony. The default for teams that iterate fast and still want SNARK-cheap verification.
stark · transparent
No trusted setup, post-quantum, FRI-based. Larger proofs, but you trust math instead of a ceremony. We auto-wrap in a SNARK if you need cheap on-chain verify.
* STARK proofs are verified off-chain or wrapped in a Groth16 outer proof for EVM settlement. Wrapping adds ~140ms.
Measured on a single prover-c7g.16xl node, witness pre-loaded,
cold cache excluded. Numbers are p50 over 10k runs. Your circuit will vary; bring it and we'll re-run.
┌────────────────────────┬──────────┬───────────┬───────────┬─────────────┐ │ circuit │ system │ constraints │ prove p50 │ gas / verify │ ├────────────────────────┼──────────┼───────────┼───────────┼─────────────┤ │ rollup_batch_256 │ groth16 │ 1.2M │ 312 ms │ 206,114 │ │ rollup_batch_1024 │ plonk │ 4.8M │ 904 ms │ 290,402 │ │ withdrawal_merkle │ groth16 │ 310k │ 88 ms │ 198,770 │ │ sig_aggregate_bls │ plonk │ 2.1M │ 471 ms │ 288,955 │ │ state_diff_stark │ stark │ 9.6M │ 1,740 ms │ off-chain │ │ state_diff_wrapped │ stark→g │ 9.6M │ 1,883 ms │ 209,330 │ └────────────────────────┴──────────┴───────────┴───────────┴─────────────┘
One endpoint. Submit a witness, poll the job, fetch the proof. SDKs for Rust, Go, and TypeScript. gRPC for the latency-sensitive, REST for everyone else.
# submit a proving job curl -X POST https://api.zerocopyzk.xyz/v3/prove \ -H "authorization: Bearer $ZC_KEY" \ -H "content-type: application/octet-stream" \ --data-binary @witness.bin \ -G --data-urlencode "circuit=rollup_batch_256" \ --data-urlencode "system=groth16" # → 202 Accepted { "job": "job_3f9a..1c", "eta_ms": 312 }
// GET /v3/proof/job_3f9a..1c { "status": "proven", "system": "groth16", "prove_ms": 309, "proof": "0x1f3c…a4", "public_inputs": ["0x88…"], "verify_gas": 206114, "settle": "Verifier.sol#L142" }
A tail of the public mainnet prover stream. Job ids and addresses are hashed. This is real-shaped traffic, redacted.
state_diff_stark circuit. Transparent, post-quantum, no setup.