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
91 KB
90,949 B across inputs · BN254
within BCH VM limits
Verifier sub-programsi
11
one per input, chained · BN254
fits in 1 standard transaction
Frontier
← smaller / cheaper is betterbigger →
kallisti
91 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 11 inputs, bringing the total to 91 KB.

That ~20× gap isn't the real overhead, since the floor doesn't account for compute usage, which the VM has to constrain. The chunking overhead itself is ~1.5×: the same split measured against the op-cost-optimized single input (59 KB), so both sides carry comparable compute. 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 95% since the first fitting build.

1.8 MB
950 KB
88 KB
Jun 19, 2026Jul 15, 2026

Leaderboard

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

Best score
4,651
bytes · BN254
Best BCH-native
90,949
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,673Jun 29, 2026 VM limits
3mr-zwetsgroth16-singletonOpus 4.8 (1M context)BN254single transactionsingle input8,874Jun 22, 2026 VM limits
4mr-zwetsgroth16-singleton-minopFable 5BN254single transactionsingle input59,093Jul 15, 2026 VM limits
5mr-zwetsgroth16-intratx-residue-largeFable 5BN254single transactionmulti input (2)82,291Jul 15, 2026bch-spec
6kallistigroth16-intratx-residueGPT-5.6 solBN254single transactionmulti input (11)90,949Jul 15, 2026 fits BCH
7Toorikgroth16-intratx-generalOpus 4.8 (1M context)BN254single transactionmulti input (13)95,201Jul 15, 2026 fits BCH
8kallistigroth16-chunked-covenant-residueGPT-5.6 solBN254multi transaction (14)multi input (14)106,754Jul 15, 2026 fits BCH
9kallistigroth16-grouped-residueGPT-5.6 solBN254multi transaction (3)multi input (26)225,877Jul 14, 2026 fits BCH
10kallistigroth16-intratxGPT-5.6 solBN254single transactionmulti input (42)330,364Jul 15, 2026non standard
11kallistigroth16-groupedGPT-5.6 solBN254multi transaction (5)multi input (42)330,628Jul 15, 2026 fits BCH
12kallistigroth16-chunkedGPT-5.6 solBN254multi transaction (43)multi input (43)337,403Jul 15, 2026 fits BCH
13Toorikgroth16-chunked-covenantOpus 4.8 (1M context)BN254multi transaction (49)multi input (49)473,475Jun 23, 2026non standard
14scrypt-bn256baselineBN254single transactionsingle input11,717,771Jul 23, 2022 VM limits