Abastraction
Proof system protocols—such as SNARKs and STARKs—are emerging as the fundamental way to exchange state and computation between computer programs(fact or properties around private state, computation on private or public state, etc) in a trust-minimized manner secured by cryptography on the internet. It provides a cryptographic way for computer programs to exchange attestations about state and computation.
In the coming years, proofs will become first-class citizens on the internet, much like web documents are today. It is crucial to establish standards for proof systems to ensure strong interoperability.
Proofs act as interoperability primitives. Just as HTTP standardized the exchange of documents on the internet( like the exchange of data between computers using JSON or XML format over the HTTP protocol in the web paradigm), proof systems will standardize the exchange of verifiable states
secured by cryptography(trust minimization). To make proofs first-class citizens in a standardized manner, several layers must be addressed:
- Proof objects: canonical serialization formats for inputs, outputs, and verification keys.
Verification interfaces: on-chain (EVM, WASM),
off-chain APIs exposing uniform isValidProof semantics across proof systems.- Proof transport: protocols for transmitting proofs across domains (e.g., cross-chain messaging, client-server APIs). We must address the question of how proofs are transported securely and efficiently from off-chain environments to on-chain verifiers.
- Composability: standards for recursive verification, proof aggregation, and succinct proofs of multiple systems.
Without these standards, interoperability will fragment: a proof generated in one system may not be consumable elsewhere, and applications will remain siloed. With them, proofs become the standardized verifiable state computation, enabling trust-minimized interoperability across blockchains, web applications, and distributed systems.
Problem & Motivation
On-Chain Proof Verification: A Heterogeneous Landscape
Zero-knowledge proofs are now integral to blockchain scalability, privacy, and interoperability — but the way they are verified on-chain is far from uniform. Each proof system carries its own verification model, leading to a heterogeneous ecosystem:
-
Groth16 (used by Circom/snarkjs, gnark) produces constant-size proofs that are checked with a small number of pairings over the bn254 curve. Verification is cheap and battle-tested, but every circuit requires its own hard-coded verifying key.
-
PLONK and Plonkish systems (Halo2, Plonky2, etc.) rely on polynomial commitments (KZG or IPA). On Ethereum, these verifiers either target bn254 pairings (like Groth16) or the newer BLS12-381 KZG precompile (EIP-4844). Proofs are larger and gas costs higher, but a universal SRS allows reuse across many circuits.
-
zkVM receipts (RISC Zero, SP1) represent whole virtual-machine executions. Their native STARK proofs are far too large for direct L1 verification, so receipts are usually compressed into smaller SNARKs (Groth16 or PLONK). The contract then enforces higher-level semantics such as programId and journalHash embedded in the public inputs.
This heterogeneity shows up across multiple dimensions — proof size, field/curve choice, precompiles used, verifier contract structure
, and setup assumptions. The result is a fragmented developer experience.
In the Ethereum ecosystem, on-chain proof verification is a fundamental activity and has become a critical primitive for applications. Co-processors, wallets, bridges, verifiable applications (vApps), identity & credential/attestation systems, zkML, and trustless agents all submit proofs on-chain. The key question is whether there exists an abstracted smart-contract interface that can be called to verify proofs, regardless of the underlying system. Since proof verification is becoming a core activity on Ethereum, it is essential that we move toward standardization.
In these workflows, one smart contract typically calls another to perform proof verification. What is missing is a standardized, transparent way to manage proofs on-chain. We need a well-defined interface that governs how proof verification calls are handled between contracts, ensuring consistency and composability. Moreover, the verifier contract itself must expose its verification capability in a clear, interoperable manner.
Efforts are emerging to smooth this landscape with ERC-style standards (mirroring ERC-1271 for signatures) that define a universal isValidProof interface, backed by a registry of schemas and adapters. Such an abstraction speeds up proofs to be first-class citizens on the Blockchain: composable, interoperable, and accessible to any smart contract regardless of the underlying cryptography.
ERC-1271 standardized “Can this contract validate a signature?
” for authentication. What we’re missing is the sibling question for attestation/claims: “Can this contract validate a proof of a statement?
” A clean, minimal interface lets wallets, paymasters, bridges, and dApps plug in any proof system (SNARKs/STARKs/zkVM receipts) without bespoke adapters.
In the context of smart contracts, it is crucial to define an interface for their capability to verify proofs. It is a serious and fundamental discussion that needs to be had to decide on a unified interface for standardizing the on-chain proof verification layer.
Can we define a proof-system-agnostic smart-contract interface for on-chain proof verification—decoupled from Groth16/PLONK/zkVM and their underlying cryptographic specifics?
Unified interface for exposing ZK proof verification by smart contracts
A generalized abstract interface used by any smart contract that exposes proof verification capability.
It is an interface to be used by a smart contract that will make a call to verify a proof without thinking about any details about the proof verification process. This ensures strong on-chain interoperability and clear on-chain proof verification. It will be part of the on-chain proof management standardization and let proofs, first-class on-chain citizen.
The interface can be the entry point for verifying proofs within multiple circuits of the same entity, statements using different proof systems(protocols and their production frameworks/libraries), or multiple circuits versions of the same statements.
The ERC is designed to provide a unified interface for on-chain proof verification. Any smart contract or protocol that has proof verification capabilities must be implemented and exposed using the unified standardized interface for strong interoperability.
The suggested interface can be paired and adapted for proof verification within a smart contract that manages:
- Relations
- Relations and instances
- Different proof system protocols or their production framework/library, different circuit/program versions
A protocol or registry that governs trust-minimized provable statements management (i.e., relations and their instances or only relations) MUST expose proof verification via this interface.
Application protocols whose business logic depends on such statements MAY delegate verification by invoking the standardized smart-contract interface defined herein.
A provable statement is defined by a relation R and a public instance X such that the verifier accepts a proof π attesting ∃W:(X,W)∈R. Conforming contracts MUST identify R by schema/relationId and accept publicInputs encoding X.
In practice, a trust-minimized protocol (or a shared verification registry) implements this ERC so that other applications can offload ZK proof verification. Any application whose state transitions imply a particular statement calls isValidProof(schema, publicInputs, proof)
and proceeds only if the call returns the interface’s magic value.
The smart contract can manage only relations. Then, you pass the relation via the schema and pass the instance via public inputs.
The smart contract can manage relations and instances. In this case, pass the relationId via the schema parameter and reference to the instance via the public input parameters.
The circuit is something programmable. It is crucial to handle the circuit evolution: bug fixes, business-logic changes, or security updates, etc. The scheme(we can refer to as relationId) parameter is responsible for handling the circuit programmability evolution.
ERC Draft
What feedback I’m seeking
Is the verification interface sufficiently abstract—i.e., independent of specific proof systems and implementations?
Interface shape: Does schema + bytes32 publicInputs + bytes proof cover your SNARK/STARK/zkVM/Recursion integration needs without extra parameters?
Lane discipline: Any objections to requiring fixed lane order, big-endian numeric interpretation, and (if applicable) pre-reduction to the target field?
Domain separation: Are chainId, verifyingContract, nonce, expiry (or your equivalents) sufficient and practical as public signals?
zkVM receipts: Is exposing programId and journalHash as bytes32 lanes workable across existing zkVM toolchains?
Error semantics: Any concerns with “return magic value on success; otherwise any other value; do not revert on invalid proofs”?
Interoperability risks: Are there proof systems or popular verifier contracts that would struggle with bytes32 lanes?
Versioning via schema: Is minting a new schema ID on layout change acceptable for ecosystem evolution?