Cody Gunton and Ignacio Hagopian - March 25, 2026
https://codygunton.github.io/talks-and-writing/2026-03-25-epf-study-zkevms/
Allow the EVM to execute more compute per block while keeping the work done by the consensus network small to preserve decentralization.
An attester must re-execute every transaction. As blocks get bigger, this time pressure is the bottleneck.
If we allow more transactions in a block, eventually we exhaust the following attester resources:
zkVMs create an asymmetry:
In our application:
Without ZKEVM proofs:
With ZKEVM proofs:
SNARK (Succinct Non-interactive Argument of Knowledge): a logical argument that allows one party (a Prover) to convince another party (a Verifier) that they (the Prover) did the work of executing a particular computation
ZKSNARK: a SNARK where the Prover keeps some details of the computation private
ZK: a term abused to refer to the use of SNARKs in general
(ZK)STARK: T = Transparent; used for systems without a certain trust assumption
ZKVM: a particularly flexible approach to implementing SNARKs
Now we're there™
There are two parties, Prover and Verifier
Typical part of the exchange:
Goal:
Reality:
Cartoon picture to be further developed:
CPU resources
Storage resources
Network resources
Full state requirement for particular roles
State growth/size
hash_tree_root(NewPayloadRequest) == hash_tree_root(NewPayloadRequestHeader)
Execution witness generation
Guest program
https://github.com/ethereum/execution-specs/tree/projects/zkevm https://github.com/ethereum/execution-spec-tests/releases?q=zkevm&expanded=true
Two approaches:
From scratch — implement the guest program in a language that compiles to RISCV64IM
Refactor an existing EL — adapt Ethrex, Geth, or Reth
no_std
Goal: guest programs should work with any zkVM
riscv64im_zicclsm-unknown-none-elf
https://github.com/eth-act/zkvm-standards/tree/main/standards
Resources are limited
We have constraints
Key question: If the protocol isn't aware of proofs, who is responsible for generating and propagating them?
Operations that are cheap in gas compared to proving effort (i.e. mispriced).
An adversary can fill a block with them, making it unprovable in time.
Example:
https://zkevm.ethereum.foundation/blog/repricings-for-block-proving-part-1 https://zkevm.ethereum.foundation/blog/repricings-for-block-proving-part-2
https://eth-act.github.io/zkevm-benchmark-runs/repricing/
Code-chunking — split contracts bytecode into smaller and provable chunks to reduce bytecode verification worst-case
Binary trees — consider other tree-arity and other potential hash functions for merkelization to speedup proving
https://ethresear.ch/t/merkelizing-bytecode-options-tradeoffs/22255 https://ethereum-magicians.org/t/eip-7864-ethereum-state-using-a-unified-binary-tree/22611/6
https://eips.ethereum.org/EIPS/eip-8142
https://eips.ethereum.org/EIPS/eip-7928
TODO: add a different illustration here, not a table — will describe later
~25 minutes for this section