Hey @Damonzwicker @TMerlini @VincentWu — hope you’re all doing well!
I’ve been following this thread closely since the beginning, and honestly the discussion has grown into something far better than what I originally proposed. The layered stack you’ve collectively built — OCP as the portable verification floor, the input trust layer with the triple-hash scheme, ERC-8263 for on-chain commitment — is exactly the kind of concrete, independently-verifiable building blocks this space needs. Really appreciate the depth you’ve each brought to this.
I’ve just submitted a PR that I think closes the remaining gap in the stack:
ERC-8xxx: AI Inference Proof Verification Interfaces
The way I see the full stack now:
| Layer |
Spec |
Job |
| L1 |
ERC-8004 |
Agent identity |
| L2 |
Input trust (@TMerlini) |
Sanitisation commitments, raw/pipeline/input triple-hash |
| L3 |
OCP (@Damonzwicker) |
Portable, system-independent digest verification |
| L4 |
ERC-8263 (@VincentWu) |
On-chain proof commitment via anchor() |
| L5 |
ERC-8xxx (this ERC) |
Abstract interfaces for proof backend interop |
The idea is simple: two minimal abstract interfaces that let any consuming contract call any OCP-compatible proof backend through a single verify() entry point — no central registry, no hub.
interface IProofVerifier {
function verify(bytes32 inputHash, bytes32 outputHash, bytes calldata proof) external view returns (bool);
function proofProfile() external view returns (string memory);
}
proofProfile() is intentionally named after OCP’s “proof profile” concept — it’s what tells the consumer which OCP-compatible system is behind the verifier (e.g. "zkml/risc0/1", "tee/nitro/1").
Here’s how I see it connecting to each of your work:
@Damonzwicker — verify() is the on-chain execution of the OCP primitive (recompute → compare → confirm inclusion). proofProfile() is how a verifier declares which OCP profile it implements. The ERC explicitly positions itself as the Solidity interface layer for OCP-compatible backends. Would love your thoughts on whether the OCP alignment is correctly described, and whether there’s anything in the spec that should be tightened.
@TMerlini — The ERC references the input trust layer in the Rationale: inputHash is the SHA-256 of the sanitised input after the preprocessing pipeline has been applied, and gateway.ensub.org is cited as the reference implementation of the full L1–L4 stack. This ERC deliberately doesn’t prescribe how inputHash was derived — that’s your layer’s job. The way I see it, the details of the preprocessing pipeline (the sanitizationPipelineHash, the triple-hash scheme) are things that belong inside ERC-8263’s scope as the outer commitment wrapper — both your input trust work and the verification interface here can be seen as components that ERC-8263 encompasses. Does that framing make sense to you? Happy to refine the wording together.
@VincentWu — ERC-8263 is the write path (anchor), ERC-8xxx is the read path (verify). They’re complementary: the inputHash in verify() is the same value as proofHash in anchor() for the same inference event. The ERC calls this out explicitly in the Rationale. Would be great to align on the exact wording so both specs cross-reference each other cleanly.
I’d love to have all three of you involved — whether as co-authors, contributors to specific sections, or early reviewers. Whatever works best for each of you.
One more thing: would it make sense to add a row for this interface layer to the Composition Note? The note covers L1–L4 really well; adding the verification interface layer would give implementors a single place to see the full picture. Happy to draft the text and send a PR against the gist, or just share the wording here for you to merge however you see fit.
Thanks again for everything you’ve built here — this thread has been genuinely excellent.
— JimmyShi22