Semaphore ============= merkle tree + Groth16 + Poseidon use case ------------ anonymous group identity and voting 在不泄露自身ID的前提下,匿名的证明自身属于某个group,且message未经篡改。 message内容公开,禁止重放/多发。 v3 -------------- tree ######### Incremental Merkle Tree (IMT) reg ################## 本地随机生成IdentityTrapdoor, IdentityNullifier secret = Poseidon(IdentityTrapdoor, IdentityNullifier) Identity Commitment = Poseidon(secret) 在merkle tree 登记 Identity Commitment Groth16 ################### externalNullifier 用于标识业务 NullifierHash = Poseidon(externalNullifier, IdentityNullifier) 用于绑定单用户,防重放/多发 注意signalHash无需签名 private input: secret, merkle treeSiblings & treeIndices public input: signalHash, externalNullifier public output: merkleRoot, NullifierHash v4 ----------------- tree ####### Lean Incremental Merkle Tree (LeanIMT) reg ######### 本地随机生成eddsa keypair,私钥为32byte secret 基于secret派生s,参考RFC8032;也可直接将secret置为s PK = s * G Identity Commitment = Poseidon(PK_x, PK_y) 在merkle tree 登记 Identity Commitment Groth16 ################### Scope 用于标识业务 Nullifier = Poseidon(Scope, secret) 用于绑定单用户,防重放/多发 注意message无需签名 private input: secret, merkle treeSiblings & treeIndices public input: message, Scope public output: merkleRoot, Nullifier