Privacy preserving nullifiers for proof of identity applications

I’m not fully up-to-date regarding this discussion, sorry if I’m not providing a realistic solution.

Would it make sense to create a global zk identity registry? Where identities are zk and nullifier friendly?

Let’s call this new identities “SIK” (secret identity key) which acts as user commitment. Each SIK is linked to a Public Key.

The SIK is forged through hash(pubKey || secret). The secret can manifest as a password, a hashed ECDSA signature or any deterministic entropy input.

The SIK compilation resides in a Snark-Friendly Merkle tree (i.e Circom SMT). In this Merkle tree, the hash of the passport public key delineates the path to a specific leaf where the SIK is stored. The Root of the tree is stored by the Ethereum smart contract.

To add or update a SIK, the user needs to provide:

  • a signature over its new SIK
  • the publicKey
  • the government proof (a signature over the publickey?)
  • the new root of the merkle-tree
  • a zkProof as the transition to the new root is correct (only adds/updates its SIK)
  • something else I’m probably missing…

The smart contract verifies everything and if so, updates the root.

So at this point we have a Merkle-Tree with SIKs (user commitments).

Then any application can make use of this registry. For instance, a voting application might require:

  1. A Signature done with the Passport
  2. A zkProof as:
    1. the publicKey signing, has an assigned SIK on the Root merkle-tree
    2. The application nullifier, which is constructed by hash(secret + somethingElse)
    3. The user knows the secret which, together with the publicKey generates the SIK

At Vocdoni we have been using a similar approach to this for anonymous voting on ECDSA signatures. But as I said, sorry if it does not actually solve the issue you are facing.