PR: ethereum/ERCs#2012 · Repo / reference implementation: garyyang-finchip/kya-standard · Status: Draft, number not yet assigned
What this proposes
ERC-8004 gives agents portable identity and a place to accumulate raw trust signals (Reputation, Validation). It deliberately stops short of trust conclusions — a shared way to say “this agent was checked under principle X, by issuer Y, reached level L, valid until T, not revoked.”
This ERC standardises the container for such conclusions, not the conclusions themselves:
- Scheme Registry — registers a KYA Scheme: an addressable, versioned, freezable pointer to a descriptor that says what is checked, how the result is expressed as a
uint8 level, which evidence kinds are admissible, and how assertions are admitted (ATTESTEDby an issuer, orPROVEDby a verifier contract). - KYA Registry — records Assertions
(subjectKey, schemeId, issuer, level, claimDigest, issuedAt, expiresAt, evidenceHash, status)with per-issuer supersession and revocation, and resolves them:resolve(subject, schemeId, issuers[])/check(subject, schemeId, minLevel, issuers[]).issuersmust be non-empty — same Sybil rationale as 8004’sgetSummaryrequiringclientAddresses. - ZK-KYA profile — not a second registry.
attestWithProof(subject, schemeId, publicInputs, proof)calls the scheme’sIKYAVerifier, which returns(ok, subjectKey, nullifier, level, claimDigest, expiresAt). The registry enforces subject binding and nullifier consumption and records the assertion withissuer = verifier. Any proving system enters via an adapter; the spec fixes only the public-input layout (kya-public-v1). Proofs can also be presented ephemerally in the handshake without ever touching the chain. - Handshake — EIP-712
KYAChallenge/KYAPresentation,/.well-known/kya.jsondiscovery; mutual KYA is two exchanges. - Policy (minimal) —
registerPolicy(uri, hash)gives relying-party requirements an id that can be named in a challenge; on-chain evaluation is optional. - ERC-8004 binding —
erc8004is the MUST-support subject type(chainId, identityRegistry, agentId). OptionalsupportedTrust: ["kya","zk-kya"], aKYAservices entry, a"kya"metadata key, and a KYA Bridge that acts as an 8004 validator and mirrors levels to 0–100 undertag = "kya:<8 hex of schemeId>", so 8004-only clients see KYA outcomes with zero changes to 8004.
The framework never defines a KYA algorithm or a credit rule. That is the point: like 8004 with reputation math, fixing rules on-chain would be obsolete before Final; a container for rules is not.
What is in the repo
Full ERC text; reference contracts (KYASchemeRegistry, KYARegistry, KYAPolicyRegistry, KYABridge8004, a Groth16→IKYAVerifier adapter); JSON Schemas for scheme / policy / discovery documents; deterministic vectors (ids, EIP-712 digests, ERC-165 ids); a 17-case end-to-end suite on an in-process EVM covering attested and proved flows, revocation/expiry, policy evaluation and the full 8004 bridge round-trip.
Where I would most like feedback
- Subject abstraction — is
(subjectType, subjectData)witherc8004as MUST andaccount/erc721/didas optional the right cut, or should v1 be 8004-only? - Verifier-as-issuer in proved mode — relying parties trust a verifier address the same way they trust an attester. Is that vocabulary acceptable, or should proved assertions carry a separate
verifierfield? - Bridge design — a curated validator with operator-configured issuers and level→0–100 map, deterministic
requestHashbound to(agentId, schemeId). Is mirroring into Validation (not Reputation) the right choice? - Nullifier scoping —
schemevsscheme-epoch; should domain separation (chainId + registry) be MUST rather than SHOULD? - Relationship to ERC-8143 and to generic attestation services — this draft positions itself as the agent-KYA semantic layer that can sit on top of either. Push back welcome.
Prior work from the same author: ERC-8338 (Token-Bound Executable Skills), ERC-8414 (Token-Bound Task Tenders). Those appear here only as informative use cases; nothing in this ERC depends on them.