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:
- A Signature done with the Passport
- A zkProof as:
- the publicKey signing, has an assigned SIK on the Root merkle-tree
- The application nullifier, which is constructed by hash(secret + somethingElse)
- 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.