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