零知识证明(ZKP)改善区块链上的隐私问题

使用零知识证明,可以在保持在用户匿名的同时验证区块链交易。
密码学是区块链技术最重要的组成部分之一,在过去几年中得到了广泛的应用。在这里,我们讨论零知识证明(ZKP)——一种与密码学密切相关的机制。接下来您将了解ZKP的一般概念和非交互式零知识证明,了解在区块链中使用协议的一些用例,并从密码学的角度深入了解ZKP。
什么是零知识证明?
零知识证明是当今应用密码学中最抽象、最吸引人的概念之一。从可能用于核裁军到为公共区块链网络提供匿名和安全的交易,零知识证明是密码技术创新的一个深刻例子。
在密码学中,零知识证明或零知识协议是一个方法,一个政党(验证)可以向另一方(校验)证明他们知道一个值x。一个零知识证明的本质在于它可以揭示某些信息。挑战在于如何在不披露信息本身或任何额外信息的情况下证明拥有这些信息是合理的。
零知识证明必须满足以下三个参数:
· 完整性。如果这个陈述是真的,诚实的验证者——正确地遵循协议的验证者——将被诚实的验证者说服。
· 可靠性。如果陈述是假的,没有任何作弊证明可以说服诚实的验证者它是真的。
· 零知识性。如果该语句为真,则除了该语句为真之外,验证者不会学到任何东西。换句话说,仅仅知道语句(而不是秘密)就足以想象一个场景,表明验证者知道秘密。这是通过每个验证者都有一个模拟器来实现的,模拟器可以生成一个“看起来”是诚实的验证者和普通验证者之间交互的记录。模拟器应该能够生成文本,但只能访问要证明的语句,而不能访问验证者本身。
完整性是更一般的交互式证明系统的性质。零知识的加法使验证过程变成零知识的证明。
零知识证明不是数学意义上的证明,因为有很小的概率,即可靠误差,一个作弊证明者能够说服一个虚假陈述的验证者。换句话说,零知识证明是概率证明而不是确定性证明。然而,有一些技术可以将可靠性错误降低到可以忽略的值。
ZKP的一般结构
零知识证明的一般结构包括参与者a和参与者b之间的三个连续动作。这些动作被称为目击、挑战和回应。

见证人 。A知道这个秘密的事实决定了一些问题,这些问题总是可以被A正确地回答。首先,A从集合中随机选择任何问题并计算一个证明。然后,A将证明发送给B。

A随机选择一个问题并将证明发送给B。

挑战。然后,B从集合中选择一个问题,让A回答。

B随机选择一个问题,让A回答。

响应。A计算答案并将其发送回B。

A计算出答案并发送给B,

接收到的答案允许B检查A是否真的知道这个秘密。
这个过程可以重复很多次,直到A猜测而不是知道正确答案的概率变得足够低。
为了说明ZKP在实践中是如何工作的,维基百科引用了 Ali Baba山洞的故事,这个故事最初是由Jean-Jacques Quisquater发表的。在这个例子中,Peggy和Victor扮演了验证者。
在这个故事里,洞的形状像一个圆环。入口在左边,有一扇神奇的门挡住了右边。Peggy想向Victor证明她知道打开魔法门的秘密词。然而,Peggy不想透露这个秘密词。

Victor在外面等着,Peggy选择了一条路来证明Peggy知道这个秘密单词,他们在洞口的左右两边做了记号,分别是a和b。在Victor的视线之外,Peggy沿着A或b路走着。Victor走进山洞,喊着A或b路的名字,他想让Peggy回去。既然Peggy真的知道这个秘密,如果需要的话,她可以很容易地打开魔法门,走Victor选择的那条路回到入口。

如果Peggy现在知道了这个秘密字,她只有在Victor叫出她进去后走的那条路的时候,才能从门口回到门口。因为Victor选择的路径是随机的,Peggy不知道关键字的概率是1/2。如果你重复这个过程,那么概率(½)^ k。通过这种方式,例如,重复这个过程20次就足以证明Peggy知道关键字。

Peggy回到入口时走的是维克多喊出来的那条路。如果Victor把一切都记录在相机里,拍摄下来的视频就不会成为其他任何一方的证据,因为他们可以事先商定Peggy要去哪里。这意味着她可以在不知道关键字本身的情况下找到正确的方法。
正如我们所看到的,示例满足以下属性:完整性、可靠性和零知识。
注意,ZKP需要用户之间的交互。虽然在单轮和常量协议中交互的数量很少,但是两个用户必须同时参与。

一个非交互式ZKP
考虑这样一种情况,用户P和V都是数学家,他们使用普通(蜗牛)邮件彼此通信。数学家P想周游世界,向数学家V证明新的定理,而不揭示证明的本质。在这个场景中,我们需要提出一些非交互式协议,因为数学家P可能没有固定的地址,并且可能在收到下一个答案之前移动。
Blum、Feldman和Micali提出了一种非交互式ZKP,其中用户P和V有一个共享的密钥,这足以证明P在不泄露信息本身的情况下知道一些秘密信息。
与常规的零知识证明不同,非交互式ZKP的一般结构只包含参与者P和V之间的单个动作,而这个动作是一个目击者。
P将秘密信息作为参数传递给一个特殊的函数——“make a proof”(见下图)。输出是“证明”的某个值。

ZKP可以应用在哪里?
身份验证系统。ZKP证明的研究是由身份验证系统推动的,其中一方希望通过一些秘密信息(如密码)向另一方证明其身份,但不希望另一方了解任何关于该秘密的信息。
道德行为。ZKP在加密协议中的一个用例是在保持隐私的同时强制执行诚实的行为。粗略地说,这个想法是强迫用户使用ZKP来证明它的行为是符合协议的。由于可靠性,我们知道用户必须诚实行事才能提供有效的证明。由于零知识,我们知道用户在提供证据的过程中不会损害其秘密的隐私。
机密性。ZKP的另一个用例是需要保密的交易。考虑一个简单的公共区块链(例如以太坊),它与某种加密货币或令牌相关联。当用户之间发生通常的交易时,区块链记录详细的传输信息:谁、向谁传输以及传输多少。因此,如果您知道特定的交易地址或用户地址,您可以做出一些财务结论。对于当今的企业来说,为某些交易保留一些细节是至关重要的。在这种情况下,ZKP可以隐藏交易细节,并识别它们对于添加到新块是有效的。(区块链的一个例子是Zcash。)
检查个人信息。如果你想从银行贷款,有必要提供收入证明。此证书包含机密信息。在这种情况下,您的一些个人数据将对其他人开放,这是我们希望避免的。银行只要知道一个人的收入是偿还贷款的最低要求就足够了。
我们可以实现一个分布式系统,其中每个用户都有一个包含一些个人数据的特殊加密数字标识符。在这个系统中,为了获得贷款,你可以从你的公司获得相应的数字收入证明,其合法性是加密的,很容易检查。然后你可以申请贷款。然后,银行可能会核实你使用ZKP的最低收入要求,没有必要透露敏感的细节。其中的一个例子是HyperledgerIndy。

Indy的点对点账外代理交互匿名。有时候,在区块链上匿名是必要的。例如,在没有公开您的身份的情况下进行交易或没有连接的交易。用户还可以进行多个交易,同时对身份保密。
出于这些目的,您可以从版本1.2开始使用Hyperledger Fabric,该版本支持一种特殊的基于zkp的加密协议-身份混合器(Idemix)。


ZKP是一种强大的加密方法,它在区块链中的应用似乎很有前途,因为现有的区块链技术可以对ZKP进行调整,以满足关注数据隐私的特定业务需求。