What this proposes: A fixed-address system contract and verifier precompile that define Ethereum’s canonical privacy pool: one shared note tree, nullifier set, user registry, and auth policy registry for private asset transfers of ETH and ERC-20 tokens, with public deposits and withdrawals. A recursive architecture keeps protocol invariants in a hard-fork-managed outer circuit while allowing permissionless inner auth circuits for authorization. The contract has no admin key and no on-chain upgrade path.
The outer circuit enforces value conservation, nullifiers, Merkle membership, encryption correctness, and registry checks. Inner circuits handle authentication and intent parsing. New auth methods can be added without creating a new pool: users register an auth policy for an inner circuit, and the outer circuit continues to enforce the shared protocol rules. The goal is one canonical privacy substrate, not a new app-specific pool.
Why enshrine: Ethereum transactions and balances are public by default, but Ethereum has no canonical private transfer substrate. App-layer pools can provide useful privacy features, but multiple incompatible deployments coexist and none is the default target for wallet and infrastructure integration. That fragmentation hurts adoption and hurts privacy, because splitting users across pools shrinks the anonymity set each pool provides.
This EIP proposes that Ethereum provide the common substrate directly: one system contract, one shared state surface, one verifier path, and one hard-fork-governed upgrade path. If a canonical privacy layer is going to exist, Ethereum should define it directly rather than rely on app-layer competition to converge on a neutral default.
Protocol enshrinement also resolves the upgradeability dilemma. An upgradeable app-layer pool carries admin or governance risk; an immutable pool avoids that risk but cannot evolve as cryptography, proof systems, or auth methods change. The system-contract model keeps the trust base neutral: no admin key, no proxy, and upgrades only through Ethereum’s normal social-consensus hard-fork process.
Key design choices we’d like feedback on:
-
Recursive outer/inner split: The outer circuit is fork-managed and enforces all protocol invariants. Inner circuits are permissionless and handle authentication plus intent parsing. Is the interface between them —
authorizingAddress,authDataCommitment,policyVersion,intentDigest— sufficient, or are there auth patterns that need more from the outer circuit? -
Permissionless auth methods: The current draft is neutral about the signing format. Companion auth circuits can implement ECDSA, passkeys, multisig, or other schemes so long as they produce the required inner outputs and bind the canonical intent digest. Is that the right level of protocol neutrality, or should the base layer be more opinionated about auth?
-
Label-based lineage: Notes carry a cryptographic label tracing back to their original deposit. Mixed-origin notes receive a sentinel label (
MIXED_LABEL). This is committed in the circuit but not enforced as policy — counterparties and wrapper contracts decide what to do with it. Is that enough as a base-layer lineage primitive, or is there a stronger requirement we are missing? -
System contract vs. precompile-only: A verifier precompile alone makes proof verification gas-feasible, but it does not create a canonical shared pool state or solve the governance/ossification problem for the pool itself. Do people see a precompile-only path that actually addresses those concerns?
-
State growth: Each pool transaction adds permanent state (nullifiers and new commitment leaves). Is that acceptable for v0, or should an accumulator-based nullifier design be a prerequisite for enshrinement?
Links: