什么是零知识证明?
一种证明方法,可以证明陈述的合法性,而不需要暴露陈述本身的内容。零知识证明协议是一种方法,该方法中prover可以证明给verifier一些事情是真实的,而prover无需提供任何被证明方的个人信息。
为什么需要零知识证明?
零知识证明代表加密应用的一个突破,提升个人信息的安全性。你如何向第三方证明你是某个国家的公民?通常是使用护照或者驾照。这种方式将个人隐私信息共享给了第三方,这是不安全的。人们希望使用一种可以保护隐私的方式来共享敏感信息。
零知识证明不需要展示个人信息来证明身份的有效性。使用statement(called a ‘witness’)作为输入,生成一个有效性的简洁证明。通过这个证明,就可以保证这个statement的真实性,而无需暴露生成这个证明时使用的statement的隐私信息。所以,能够证明你公民身份的证据应该是一个“零知识证明”。
零知识证明是如何工作的?
零知识证明协议依赖一个算法,这个算法输入参数是一些数据,输出参数是“true”或者“false”。
零知识证明协议满足一下规则:
- completeness(完整性):如果输入是合法的,零知识证明协议总是返回“true”
- soundness(健全性、稳固性):如果输入是非法的,零知识证明协议理论上将不可能被欺骗返回“true”。prover不可能欺骗一个honested verifier让其认为一个非法的statement是合法的。
- zero-knowledge:除了statement的有效性,verifier对statement一无所知。阻止verifier从导出原始的输入。
在基本形式中,零知识证明由三个元素组成:
- witness:prover通过零知识证明来证明knowledge的一些隐藏的信息。这个隐私信息就是证明的witness,prover对witness的假定知识,建立了一系列问题,这些问题只能被了解信息的一方回答。
- challenge:verifier随机的挑选问题,由prover进行回答
- response:prover接受提问,计算答案后返回给verifier。verifier通过检查prover的response来确定prover是否真的有权限反问witness。为了确保prover不是盲猜的答案,verifier还会问一些问题,就这样一直交互,知道verifier认为prover真的有权访问。
非交互式零知识证明
交互式的证明过程,在应用方面有很多局限性,因为需要两方保持可用并持续交互。即时verifier确信prover是诚实,也不能被独立的验证这个证明。为了解决这个问题,非交互式的零知识证明被提出来,非交互式协议中要求prover和verifier共同拥有一个shared key。不像交互式证明过程,非交互式证明只需要一轮通信。prover将私密信息(witness)传给一个特殊的算法来计算一个零知识证明,这个证明发送给verifier,verifier使用另一个算法检查prover是否知道私密信息(witness)。一旦生证明之后,只要拥有shared key以及验证算法的任何人,都可以使用该证明进行验证。非交互式零知识证明的提出推动了验证系统的使用进程。
ZK-SNARKs(Zero-Knowledge Succinct None-Interactive Argument of Knowledge)
有如下特点:
- zero-knowledge:verifier不需要知道statement的任何相关信息而可以对statement的完整性进行验证。
- succinct:零知识证明要比witness小,可以很快的进行验证
- None-interactive:证明过程是非交互式的,因为prover和verifier只进行一次通信
- Argument:证明满足soundness(稳固性、健全性)要求,欺骗是不太可能发生的
- (Of)knowledge:如果不访问私密信息(witness),prover很难(或者不可能)计算出一个有效的证明
前面提到的shared key是prover和verifier商议后的一个公共参数CRS(通常称为Common Reference String),用于生成和验证证明。这个公共参数的生成是敏感操作,它是这个协议安全性的主要部分。生成CRS的随机性要足够大,不然让不诚实的prover猜到,就可以计算出假的证明。可以采用Multi-Party computation(MPC)来降低生成CRS的风险。
Trusted setups需要用户相信参数生成的参与者,ZK-STARKs让证明协议能够在none-trusted setups下工作。
ZK-STARKs(Zero-Knowledge Scalable Transparent Argument of Knowledge)
与ZA-SNARKs类型,除了:
- Scalable:当witness的size比较大时,ZK-STARK在生成证明、验证证明时比ZK-SNARK快。随着witness的size的增长,ZK-STARK的证明和验证时间增长很小,但是ZK-SNARK的证明和验证时间线性增长。
- Transparent:ZK-STARKS使用公开的、可验证的随机性来生成公共参数,更透明。
ZK-STARK生成的证明更大,这就意味着会有更高的验证开销。然后,有例子(证明超大的数据集)证明ZK-STARK可能比ZK-SNARK更高效
零知识证明的应用案例
匿名支付
信用卡支付通常是对多方可见的包括支付方式提供方、银行以及其他相关机构。虽然金融监管有利于识别非法活动,但是也损害了公民的隐私。同时,大多数的加密货币交易,在链上也是可见的。有一种专门为匿名交易设计的隐私货币“privacy coins”。专注于隐私的区块链比如Zcash和Monero,隐藏交易细节,包括发送者/接收者,地址、资产类型、数量、交易时间等。
通过使用零知识证明技术,专注于隐私的区块链网络允许节点在不访问交易数据的情况下,验证交易。
零知识证明技术也被应用到公链上的匿名交易。比如:Tornado Cash,一种去中心化的非托管服务,允许用户在以太坊上进行私密交易。使用零知识证明技术来模糊交易细节,保证金融隐私。不幸的是这个会一个可选的隐私工具,并且与非法活动有关系。
Identity protection 身份保护
传统的身份管理系统,把个人信息置于风险中。零知识证明技术可以帮助个人身份验证,同时保护敏感细节信息。零知识证明在DID(去中心化身份)的背景下很有用,DID让个人可以控制个人信息的访问权限。能够证明你的公民身份,而又不用暴力您的个人隐私信息(护照等)就是零知识证明在DID中的应用。
Authentication身份验证
在使用线上服务是,我们需要证明身份和访问平台的权限。经常需要提供个人信息名字、邮箱地址、生日等等。还需要记住登陆密码。零知识证明可以简化这个验证过程。使用公开的输入(证明用户是平台会员的数据)和保密的输入(用户自己的信息)来生成零知识证明,当用户访问平台时,只需要提供零知识证明。这样即提升了用户体验,也可以让组织无需存储大量的用户信息。
Verifiable computation可验证计算
可验证计算是另一个零知识证明技术的应用,用于提升区块链的设计。把计算外包给第三方,同时保持可验证结果。第三方需要将计算结果以及程序正确执行的证明一同提交返回。可验证计算对提高区块链交易处理速度而又不降低安全性至关重要。主要用户区块链的链下扩展方案中。以太坊不在处理所有的交易,而是将交易交给一条单独的链来执行,这条链执行交易完毕后将结果返回给以太坊,应道以太坊的状态改变中。
这种链下扩展方案,使得以太坊无需进行任何交易执行计算,只需要将外包的计算结果应用到状态中。既减少了网络拥塞,又提高了交易速度。这就需要可验证计算来保证链下的执行时准确的。当节点进行完成链下交易的执行后,需要提交一个零知识证明,以验证交易执行的正确性。这个证明保证交易的合法性,允许以太坊将其应用到状态中而无需等待任何其他节点提出异议。
zero-knowledge rollups和validiums是两种链下扩展方案,通过验证证明来提供安全扩展。这些协议在链下执行数千笔交易,并提交证明以在以太坊上进行验证。一旦证明得到验证,这些结果就可以立即应用,从而允许以太坊处理更多交易,而无需增加基础层的计算
减少链上投票中的贿赂和勾结
区块链投票方案是安全的、可审计的、抗审查的、不受地域限制的,但是也没有办法避免贿赂勾结的问题。恶意的人可能通过欺骗、误导、贿赂的方式影响投票的公平。Alice可能会收到Bob的贿赂去投票给optionB,然而她其实想投票给optionA。
MACI (Minimum Anti-Collusion Infrastructure) 被提出来,用以解决区块链上的贿赂勾结问题。MACI是一系列合约,允许中心化的管理员手机投票,计算结果,同时不需要暴露个人的投票(采用零知识证明技术)。可以保证投票计算的正确性,还可以确定特定的个人是否参与了投票。
MACI是如何利用零知识证明技术工作的?
协调员部署智能合约到以太坊,用户注册自己的公钥到智能合约。用户通过发送用公钥加密的消息到智能合约来投票。必须使用用户最新的公钥进行投票(只统计最新的公钥对应的投票)。投票结束后,协调员计数投票,验证结果。
在 MACI 中,零知识证明用于通过使协调员不可能错误地处理选票和计票结果,来确保计算的正确性。这要求协调员生成ZK-SNARK证明,用以验证所有的消息都被正确处理,并且最终结果对应于所有有效投票的总和。
所以无需暴露每个投票员的投票细节,MACI就能够保证投票记录计算过程的完整性。此功能有助于降低勾结的有效性。还是举例子,在MACI机制下,Bob贿赂了Alice之后,Alice投票给了optionB。但是后来,Alice发送加密的交易,变更了自己的公钥,Alice在发送加密的交易用于投票给optionA。然而Alice展示给Bob的交易是投给optionB的。
使用 MACI 确实需要相信协调员不会与贿赂者勾结,或者试图自己贿赂选民。协调员可以解密用户消息(创建证明时所必需的),这样他们可以准确地验证每个人是如何投票的。但在协调员保持诚实的情况下,MACI 是保证链上投票公正性的强大工具。
使用零知识证明的缺点
硬件消耗:生成零知识证明涉及非常复杂的计算,最好是在专门的机器上执行。这些机器对于个人来讲,是比较昂贵的。
证明的验证消耗:验证证明也需要复杂的计算,也增加了在应用程序中实时零知识证明技术的成本。例如,在以太坊中,ZK-rollup需要支付大约500000gas以验证一个ZK-SNARK证明,而ZK-STARK可能需要更多的gas
信任假设:在ZK-SNARK中,Common Reference String(CRS)是一次生成,多次被多方重复使用的。这个公共参数是以trusted setup的形式创建的,这其中就需要假设参与者是诚实的。用户没有办法评估参与者的忠诚度,只能选择相信开发者。当然,ZK-STARK是无需信任假设的。
量子计算威胁:ZK-SNARK使用ECDSA进行加密,如果量子计算机出现,这个安全模型将被打破。ZK-STARK考虑了量子计算的威胁,使用了抗碰撞哈希加密,不像elliptic curve cryptography中使用公私钥对,collision-resistent hashing对于量子计算来说更难以突破。
评论(0)