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