Credential Store for WebAuthn Public Keys
ENS has no native credential resolution primitive for WebAuthn public keys. Any ENS name can store a passkey public key as a text record today — but with no standard key convention, no resolver that understands the format, and no onchain verification path, the credential is effectively inert.
This RFC proposes a WebAuthn credential resolver for ENS — a primitive that makes passkey public keys first-class resolvable ENS records, verifiable onchain via P-256 signature verification (EIP-7951, live on mainnet since Fusaka).
ENS supports storing arbitrary data as text records — including WebAuthn public keys, with gas abstracted by embedded wallet providers for the initial setText(). What ENS doesn’t provide is a standardized way to resolve that credential or verify it.
Every app that wants to authenticate against an ENS-stored passkey has to build its own resolver logic and P-256 verifier from scratch.
This proposal eliminates that duplication: a single credential resolver contract any app can call, backed by a standalone P-256 verifier using EIP-7951.
The infrastructure exists once — apps just resolve and verify.
Example Use Cases
App ecosystem with 2LD identity
A developer builds a reputation-weighted prediction market and wants users to have a portable identity that works across their ecosystem. The app offers free 2LDs — users register via an embedded wallet in one tap, no seed phrase. The embedded wallet signs the one-time setText() that publishes the user’s WebAuthn credential (qx, qy) to ENS.
WebAuthnCredentialResolver reads that record and WebAuthnVerifier handles P-256 signature verification against the user’s device — no custom resolver logic required from the app developer.
From that point on, any app in the ecosystem resolves the ENS name and authenticates via Face ID or Touch ID — no wallet, no gas for the user, no extension. The credential lives in ENS, not the app’s database. one setup, portable everywhere.
Passwordless Login Anchored to ENS
A user registers alice.eth and signs one transaction to publish their passkey public key (qx, qy). ENS stores the credential — but without a standardized credential resolver, any app that wants to authenticate against it has to build its own resolver logic and P-256 verifier from scratch.
WebAuthnCredentialResolver and WebAuthnVerifier close that gap, extending ENS from a naming registry into an authentication primitive. Any app can resolve alice.eth, fetch the credential, issue a nonce, and verify the user’s Face ID response — no custom infrastructure, no wallet dependency in the auth flow.
Wallet only needed once — for setup. Every login after that is passkey-native.
AI agent authorization
An AI agent acting on behalf of alice.eth publishes its P-256 public key as an ENS text record. Any service the agent calls can resolve alice.eth and verify the agent’s signatures. Authorization is publicly auditable onchain. Revocation is one setText(), instantly effective everywhere. No OAuth server, no API keys, no centralized auth provider.
This is only possible with a standardized credential resolver — without one, each service would need to independently know which text record key to read and build its own P-256 verifier.
How it Works
We ship two contracts:
WebAuthnCredentialResolver— readswebauthn.credentialfrom an ENS name’s text records and returns the P-256 public key(qx, qy)to the calling appWebAuthnVerifier— verifies a P-256 signature against that public key using the EIP-7951 precompile (~3,000 gas)
Authentication flow in three steps:
- app resolves
alice.eth→ fetches(qx, qy)viaWebAuthnCredentialResolver - app issues a nonce → user taps Face/Touch ID → device returns a P-256 signature
- app calls
WebAuthnVerifier.verify()→booleantrue or false
No wallet, no seed phrase, no cross-chain calls. All verification happens on L1.
The specification has already been developed in depth — proof system, cryptographic primitives, challenge freshness rules, client requirements, and resolver profiles are fully documented here: WebAuthn Resolution Specification - Eureka
Open Questions
-
Are there existing ENS ecosystem projects pursuing passkey-native credential resolution that I should coordinate with rather than duplicate?
-
Trust model: this proposal proves ownership of a credential published in an ENS name’s records — not ownership of the name itself. If a wallet is compromised and the
webauthn.credentialrecord is overwritten, an attacker could impersonate the user without their passkey. How should apps consuming credentials resolved this way handle this risk?