Flow
1
The verifier issues a challenge
The verifier picks a random, single-use challenge and names itself:
2
The user proves one record
proof is plain JSON:3
The verifier checks it
What the verifier checks
- the challenge is the one it issued, and the proof names this verifier;
expiresAt(unix seconds) has not passed;- the EIP-712 signature recovers to
owner; - on Arkiv, the entity’s current
$owneris that address (so the record still exists).
What it reveals
The verifier learns that the holder of the proof controls that record’s one-time owner. It learns nothing about the user’s other records: each has a different owner, and nothing links them. If the user proves several records to the same verifier, the verifier can of course link those.proveOwnership finds the record’s key through myEntities() if needed, so it works on any
device signed in with the same wallet.