Zeeka saysThe zkEVM taxonomy ranks systems by how closely they match Ethereum: Type 1 is fully equivalent but slow to prove; Type 4 compiles high-level code and proves fastest but matches least.
Not all zkEVMs are equal. The widely-used taxonomy ranks them by equivalence to Ethereum versus prover speed. Type 1 is fully Ethereum-equivalent (proves the real chain, no changes) but slowest to prove. Type 2 is EVM-equivalent with minor internal tweaks. Type 3 is almost EVM-equivalent, dropping a few hard precompiles. Type 4 compiles a high-level language straight to a ZK circuit — fastest to prove, but it does not run EVM bytecode.
The single axis is compatibility versus proving cost: the closer you hug Ethereum, the more expensive the proof. Over time, as proving gets cheaper, projects migrate toward lower type numbers. The demo lays out the spectrum and the trade-off each type makes.
Power-ups you unlock
Type 1: full Ethereum equivalence, slowest to prove
Type 2: EVM-equivalent, minor internal differences
Type 3: almost EVM-equivalent, some edge cases differ
Type 4: high-level-language equivalent, fastest to prove
The trade-off is compatibility versus proving speed
The Collision attacks — common mistakes
Assuming a higher type number is strictly better
Ignoring which precompiles or opcodes a type drops
Expecting bytecode compatibility from a Type 4 system
Forgetting projects migrate toward lower types as proving improves
Boss battleLay out the four zkEVM types and explain the compatibility-versus-prover-speed trade-off each makes.
Example code
<!doctype html><html><head><meta charset="utf-8"></head>
<body style="background:#06040d;color:#e6e0ff;font-family:monospace;padding:20px"><pre id="o"></pre>
<script>
// the zkEVM spectrum: equivalence vs prover speed.
const types=[
['Type 1','full Ethereum equivalence','slowest to prove'],
['Type 2','EVM-equivalent','slow'],
['Type 3','almost EVM-equivalent','faster'],
['Type 4','high-level-language equivalent','fastest'],
];
document.getElementById('o').textContent = [
'zkEVM types — compatibility ↔ prover-speed trade-off:',
...types.map(t=> ' ' + t[0].padEnd(8) + t[1].padEnd(34) + t[2]),
'',
'Type 1 = most compatible, hardest to prove',
'Type 4 = fastest, least compatible (no EVM bytecode)',
'projects migrate toward lower numbers as proving gets cheaper'
].join('\n');
</script></body></html>