Hi,
We’re building a ZK-based identity protocol that derives cryptographic keys from biometric data in a non-storage, reproducible manner.
We’re exploring how to integrate Tunnel ID as a registrar on top of ERC-7812. The registry structure aligns really well with our design, especially the use of Poseidon-based SMT, commitment isolation, and the delegated ZK verifier model.
We had a few questions to ensure we’re implementing this correctly and future-proofing our registrar integration:
1. For inputs that may slightly vary between sessions (but still map to the same identity or key via ZK verification), is it acceptable to:
- Always register a fixed commitment, and let ZK proofs handle verification of equivalence/proximity?
- Or are registrars expected to allow updating/replacing commitments when drift is anticipated?
We’re asking this to determine whether the registry should act as a persistent anchor or a periodically rotated state point.
2. Can the value
field in addStatement(key, value)
be used by registrars to encode auxiliary metadata, such as circuit versioning, verification parameters, or commitment type identifiers?
Or is it assumed that all semantic information is handled off-chain by the ZK proof and verifier logic?
3. Is there a canonical pattern for linking specific verifier circuits to a registrar or statement type?
For example, if different registrars use different verification semantics (e.g., proof-of-ownership, proof-of-age, proof-of-proximity), how should dApps or wallets know:
- what circuit applies to which commitment?
- what inputs or public signals are expected?
4. Should this be externalized via IPFS, ENS, or would it make sense to suggest a verifier registry pattern in a future spec?
How should registrars handle users who want to register multiple statements (e.g., different modalities or backup factors) that all represent the same identity?
Should this be modeled via:
- One commitment per modality (e.g.,
key1
,key2
) and an external linkage circuit? - Or a Merkle tree of sub-commitments as the stored value?
5. Credential Refresh & Recovery
In scenarios where a user loses access to the original input used to generate their statement (e.g., hardware change, sensor drift, or theft of auxiliary material), what is the recommended pattern for refreshing or recovering their credential?
- Should registrars implement a
replaceStatement()
flow with ZK linkability to the previous statement? - Or is the expectation that the user simply registers a new statement, and recovery or linkage is handled off-chain?
- Is there scope in the registry to formally support “rotatable credentials” or mark older statements as revoked/expired?
We’re asking this in the context of identity systems where users may not be able to reproduce the exact statement, but can still prove linkage to the original in zero-knowledge.
6. Backup & Recovery Patterns
For identity systems where users generate their commitments from private, non-stored inputs, what are the best practices for supporting backup and recovery?
Specifically:
- Is it advisable for registrars to allow a user to register multiple recovery commitments under their namespace (e.g.,
main
,backup1
,backup2
)? - Should recovery be handled via a ZK proof of linkage to the original statement (e.g., same preimage, same derived key)?
- Is there value in formalizing a recovery framework (e.g., a substandard for credential fallback and delegation)?
We’re designing with the assumption that no original input is stored, so we want to ensure users can securely reassert their identity or keys in case of device loss or corruption.