What the system actually proves
At a high level, the system proves:
“There exists a wallet address, a signature, and a challenge message such that:
They hash to these public commitments, and
The ECDSA signature is valid for that wallet and challenge.”
Critically, the verifier only ever sees Poseidon hashes and a Groth16 proof – never the raw wallet, signature, or UnifiedID.
Public vs private circuit inputs
The WalletOwnership.circom circuit is designed so that:
Public inputs (visible to any verifier, on- or off-chain):
walletAddressHash – Poseidon hash of the 20-byte wallet address
challengeHash – Poseidon hash of the padded 32-byte challenge message
Private inputs (known only to the prover / witness generator):
walletAddress[20] – raw Ethereum address bytes
signature[65] – ECDSA signature bytes (r || s || v)
challengeMessage[32] – padded challenge bytes (contains the UnifiedID text)
Outputs:
signatureHash – Poseidon hash of the 65-byte signature
ownershipProof – Poseidon hash of (walletHash, messageHash, signatureHash)
Circuit logic (WalletOwnership)
Conceptually:
Key point:
Verifiers see only walletAddressHash, challengeHash, signatureHash, ownershipProof and the Groth16 proof.
They never see:
walletAddress[20]
signature[65]
challengeMessage[32] (which contains the UnifiedID)
Last updated