verifier.cash

Build the smallest Groth16 verifier that runs on Bitcoin Cash.

Bitcoin Cash's recent upgrades unlocked the power to run a Groth16 verifier on chain. New primitives like bounded loops and reusable functions let us greatly optimize its program size, and the challenge is to push it as small as possible.i

Smallest full verifieri
3.7 KB
3,715 B · BLS12-381
✗ not within BCH VM limits
Best BCH-native verifieri
54 KB
54,483 B across inputs · BN254
within BCH VM limits
Verifier sub-programsi
7
one per input, chained · BN254
fits in 1 standard transaction
Frontier
← smaller / cheaper is betterbigger →
Toorik
54 KB · BN254
Toorik
4.7 KB · BN254
sCrypt
11.7 MB · BN254

What this measures

How it works →

The same Groth16 verifier shows up as two very different numbers. On BN254, as one input it is just 4.7 KB, the smallest form on record, but only possible because it ignores any compute constraints, so it can't run on chain. To fit the VM limits, the work is split across 7 inputs, bringing the total to 54 KB.

That ~12× gap is the whole price of fitting the BCH VM's per-input limits. The floor is only that small because its op-cost is far beyond what the VM allows any input, so it can never run on BCH. A verifier that fits pays for compute with longer, cheaper-to-execute code, and runs on BCH today. Entries are scored on total on-chain bytes, since bytes are what a user pays in fees.

How could we solve this? →Why does it even matter? →

BCH contract limits (per input)
Unlocking bytecode
10,000 B
Op-cost budget
8.0M

A full verifier needs far more bytes and compute than any single input allows, so it has to run as a chain of smaller inputs that each stay under both limits.

Score history

Best BCH-native verifier size over time, lower is better. Down 87% since the first fitting build.

1.8 MB
932 KB
53 KB
Jun 19, 2026Jul 30, 2026

Leaderboard

17 BN254 Groth16 verifiers · ranked by total on-chain bytes

Best score
4,651
bytes · BN254
Best BCH-native
54,483
bytes · BN254
#SolverCurveStructureSize (B)PublishedBCH
1Toorikgroth16-singleton-genpowOpus 4.8 (1M context)BN254single transactionsingle input4,651Jul 4, 2026 VM limits
2mr-zwetsgroth16-singleton-opcode-optimizedOpus 4.8 (1M context)BN254single transactionsingle input6,584Jun 29, 2026 VM limits
3mr-zwetsgroth16-singletonOpus 4.8 (1M context)BN254single transactionsingle input8,734Jun 22, 2026 VM limits
4Toorikgroth16-intratx-pairfold7Grok 4.5BN254single transactionmulti input (7)54,483Jul 23, 2026 fits BCH
5mr-zwetsgroth16-intratx-residue-largeFable 5BN254single transactionmulti input (4)58,760Jul 15, 2026bch-spec
6mr-zwetsgroth16-singleton-minopFable 5BN254single transactionsingle input58,870Jul 15, 2026 VM limits
7Toorikgroth16-intratx-crown8-rawchainGPT-5.6 terraBN254single transactionmulti input (8)77,193Jul 19, 2026 fits BCH
8Toorikgroth16-intratx-direct-state-publicGPT-5.6 solBN254single transactionmulti input (10)83,294Jul 17, 2026 fits BCH
9kallistigroth16-intratx-residueGPT-5.6 solBN254single transactionmulti input (11)86,950Jul 15, 2026 fits BCH
10kallistigroth16-chunked-covenant-residueGPT-5.6 solBN254multi transaction (12)multi input (12)93,802Jul 15, 2026 fits BCH
11Toorikgroth16-intratx-generalOpus 4.8 (1M context)BN254single transactionmulti input (13)95,201Jul 15, 2026 fits BCH
12kallistigroth16-grouped-residueGPT-5.6 solBN254multi transaction (3)multi input (26)225,877Jul 14, 2026 fits BCH
13kallistigroth16-intratxGPT-5.6 solBN254single transactionmulti input (31)234,022Jul 15, 2026non standard
14kallistigroth16-groupedGPT-5.6 solBN254multi transaction (4)multi input (31)234,301Jul 15, 2026 fits BCH
15kallistigroth16-chunkedGPT-5.6 solBN254multi transaction (32)multi input (32)239,773Jul 15, 2026 fits BCH
16Toorikgroth16-chunked-covenantOpus 4.8 (1M context)BN254multi transaction (49)multi input (49)473,475Jun 23, 2026non standard
17scrypt-bn256baselineBN254single transactionsingle input11,717,771Jul 23, 2022 VM limits