文章介绍了以太坊隐私应用的核心模式——匿名成员证明。通过注册承诺(Commitment)、构建默克尔树匿名集,以及结合零知识证明与作废票据(Nullifier)技术,开发者可以实现匿名投票、混币器及匿名空投,在不泄露原始钱包地址的情况下安全地证明成员身份并防止重复操作。

以太坊在设计上是极度公开的。每一个地址、每一笔余额、每一张选票对任何拥有 RPC endpoint 的人都是可见的。然而,你可以在不暴露身份的情况下进行投票,在不暴露存款者的情况下进行提款,并且在不与特定钱包关联的情况下领取 Airdrop 或加入 DAO。
一种可重用的模式驱动了一大类隐私应用:匿名成员系统。在这些系统中,用户先进行注册,随后证明自己属于该群体,而无需透露自己是其中的哪一个成员。其核心在于,这种模式打破了注册钱包与行动钱包之间的链上联系。Zero-knowledge proof(ZKP)充当了两者之间的桥梁,且不会泄露身份。这种模式是隐私投票、混币器、匿名 Airdrop 和成员系统的基础。
理解这种模式最清晰的方式是通过匿名投票的角度。
每个投票者选择两个随机数并保持私密:secret 和 nullifier。投票者将它们哈希在一起,形成一个称为 commitment 的单一值,然后在链上发布该 commitment,同时安全地存储原始数字。commitment 充当注册记录,允许未来从不同的地址进行匿名投票。因为 commitment 是一个哈希值,它不会泄露关于 secret 或 nullifier 的任何信息。
随着更多投票者注册,他们的 commitment 被收集到一个共享的 Merkle tree 中。Merkle tree 将许多 commitment 汇总为一个称为 root 的主哈希值。通过重复对 commitment 进行两两哈希,直到达到一个单一值,该树允许用户证明他们的 commitment 已包含在集合中,而无需透露是哪一个。

这棵树就是你的 anonymity set。当你随后证明你在树中时,观察者只能确定你是“这棵树中的某个人”。这种保护的强度随人群规模而扩展;一个拥有一万名成员的树所提供的隐私显著高于只有三名成员的树。
当投票开始时,你不需要使用注册地址登录。相反,你创建一个 zero-knowledge proof (ZKP)。该证明表明你知晓 Merkle tree 中某个 commitment 背后的 secret 和 nullifier,而无需透露这些值本身。
secret 证明了资格,而 nullifier 防止了重复投票。你将证明提交给投票合约,合约使用一个 verifier(从你的电路生成的智能合约)根据规则检查证明。合约在不知道你身份的情况下确认你是一名注册投票者。
在证明的同时,你会发布一个 nullifier hash。合约存储这个哈希值以确保投票仅投出一次。如果你尝试使用同一个 commitment 再次投票,nullifier 将产生相同的哈希值,合约将拒绝该重复项。
将 ZK proof 想象成一个密封的信封。里面是你的私密值(secret 和 nullifier)。外面是一张数学收据。收据实际上是在说:“密封这个信封的人知道满足规则的值。” verifier 检查收据并接受交易,而无需打开信封。
如果用户粗心大意,即使是完美的证明也会失败。如果你从钱包 A 注册,然后从钱包 A 投票,这两笔交易就会公开关联,从而抵消了证明所提供的隐私。
解决方案是从一个钱包注册,然后从一个新的 burner wallet 执行操作。为了避免通过 Gas 资金建立联系,Relayer 或 ERC-4337 Paymaster 可以支付 burner 的 Gas 费用。证明仍然是两个身份之间唯一的桥梁,而这个桥梁是加密的且无法观察的。
这种模式是一个可重用的门,可以应用于各种智能合约功能:验证证明,确认 nullifier hash 未被使用,将其标记为已使用,然后执行功能。
逻辑保持不变:commitment 树、nullifier 和证明。只有功能主体和周围的应用逻辑会发生变化。
这些系统的工具已经显著成熟:
如今,一个隐私 MVP 通常由几个合约、一个电路和一个前端组成——这使得快速构建这些系统的原型成为可能。
构建资源:
- 原文链接: x.com/phipsae/status/204...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!