聚焦:ZK-SNARK 技术
Vitalik建议他的订阅者关注ZK-SNARK技术,那今天就让我们仔细看看这一切都是如何运作的吧。
一些使用ZK-SNARK来保护隐私的方法
ZK-SNARK是一种强大的加密工具,它在区块链和区块链以外构建的应用程序中变成日益重要的一部分。但它们是复杂的,无论是从它们的工作原理,还是从我们如何使用它的角度来看,都是复杂的。
这篇文章将关注ZK-SNARK如何适应现有的应用程序,有哪些例子说明它们能做什么,不能做什么,以及有哪些通用的指导方针来判断ZK-SNARK是否适合某些特定的应用程序。
这篇文章特别关注ZK-SNARK在保护隐私中的应用。
ZK-SNARK是做什么的?
假设有一个公共输入x,一个私有输入w,和一个(公共)函数f(x,w)→{True,False},其会对输入执行某种验证。使用ZK-SNARK,就可以证明你知道一个w,对于某些给定的 f 和 x,f(x,w)=True,在此过程中不用透露w到底是什么。另外,验证者可以更快地验证证明,这比他们自己计算f(x,w)要快得多,就算他们知道w。
这赋予了ZK-SNARK两个属性:隐私性和可扩展性。如上所述,在这篇文章中,我们的例子将聚焦于隐私。
成员资格的证明
假设你有一个以太坊钱包,你想要证明这个钱包是人性证明(proof-of-humanity)注册,同时不透露注册的到底是哪个人。我们可以用数学方法描述这个函数:
- 私有输入(w):你的地址A,你的地址私钥k
- 公共输入(x):所有经过验证的人性证明配置文件{H1…Hn}的地址集合
- 验证函数f(x,w)
- 将w解释为一对(A,σ), x为有效配置文件列表 {H1…Hn}
- 验证A是 {H1…Hn} 中的一个地址
- 验证 privtoaddr (k) = A
- 如果两个验证都通过,则返回True,如果任何一个验证失败则返回False
证明者生成他们的地址A和相关的密钥k,并提供w=(A,k)作为f的私有输入。他们从链中获取公共输入,就是当前已验证的人性证明配置文件集{H1…Hn}。他们运行ZK-SNARK证明算法,此算法(假设输入是正确的)生成证明。证明者将证明发送给验证者,并且提供他们获得验证配置文件列表的区块高度。
验证者还会读取链,获取证明者指定高度的列表{H1…Hn},并检查证明。如果检查通过,验证者就相信证明者有一些已验证的人性证明文件。
在我们继续讨论更复杂的例子之前,我强烈建议先看看上面的示例,直到完全理解其中的所有内容。
使成员证明更有效
上述证明系统的一个缺点是验证者需要知道整个配置文件集{H1…Hn},他们需要花费O(n)时间将这组配置文件“输入”到ZK-SNARK机制中。
我们可以通过将包含所有配置文件的链上Merkle根作为公共输入(这可能只是状态根)来解决这个问题。我们添加另一个私有输入,一个Merkle证明M,证明证明者的帐户A在树的相关部分。
用于 ZK 证明成员资格的 Merkle 证明的一个非常新且更有