白话零知识证明(一)

白话零知识证明(一)

作者:秘猿科技

发表于 2017 年 8 月


阿里巴巴知道打开藏着财宝的山洞的咒语。强盗抓住他,让他说出咒语。 如果阿里巴巴说出咒语,就会因为没有利用价值而被杀死。如果阿里巴巴坚持不说,强盗不会相信他真的掌握咒语,也会杀死他。

但阿里巴巴想了一个好办法,他对强盗说:“你们离我一箭之地,用弓箭指着我,你们举起右手我就念咒语打开石门,举起左手我就念咒语关上石门,如果我做不到或逃跑,你们就用弓箭射死我。”


零知识证明过程有两个参与方,一方叫证明者,一方叫验证者。证明者掌握着某个秘密,他想让验证者相信他掌握着秘密,但是又不想泄漏这个秘密给验证者。


双方按照一个协议,通过一系列交互,最终验证者会得出一个明确的结论,证明者是或不掌握这个秘密。

整个协议有三个要点:



1. 零知识


故事中的阿里巴巴的遭遇并不鲜见。在文学作品中,还有阿诗玛等众多的主人公,都遇到了类似的情况。


抛开文学作品中,说了真相就变石头这类神奇的设定。现实中最主要的原因就是怕信息被盗用。因为现实中大量的秘密被用来鉴别用户的身份,如果披露了某个秘密给对方,通常意味着对方有能力冒充你的身份。因此,虽然直接把秘密提供给对方是最简单的验证方式,但是大部分情况下都不能这样做。


一个更具体的例子是在比特币中实现隐私交易


在比特币网络中,用户需要将交易明文广播给所有矿工,由他们来校验交易的合法性。但是有些情况下,基于隐私的考虑,又不想把交易的具体内容公布出来。这就形成了一对矛盾。


解决这个矛盾的关键思路是:校验一个事件正确与否,并不需要验证者重现整个事件


比如,验收一款软件,通常只要看最终测试结果是否通过即可,并不需要把整个软件开发过程的每一个细节都重放一遍。阿里巴巴给强盗的提议,其实也是类似一个验收测试。


对于比特币的例子,一笔转帐交易合法与否,其实只要证明三件事

1. 发送的钱属于发送交易的人
2. 发送者发送的金额等于接收者收到金额
3. 发送者的钱确实被销毁了


整个证明过程中,矿工其实并不关心具体花掉了多少钱,发送者具体是谁,接受者具体是谁。矿工只关心系统的钱是不是守恒的。


zcash 就是用这个思路实现了隐私交易。


2. 测试方式


上一节讲到证明者面临的困境,然后提出了一个验收测试的解决方案。接下来的问题就是测试的方式。


稍有常识就可以知道,测试不能完全由证明者给出。毕竟不能让一个人既当运动员又当裁判。通常这种情况下会采用 cut and choose 的策略。这个策略最简单的例子就是两人分粥。无论谁来分粥,都会给自己分的多,解决方法就是一个人分,另外一个人先挑。


故事里也是采用了这样的策略,强盗(验证者)以一个挑战者的姿态,每轮提出一个问题,验证者做出回应。


虽然验证者有瞎蒙的可能,但是多轮交互下来,这种可能会越来越小。这样的证明是一种交互的证明方式。双方需要实时交互,交流信息。对于比特币隐私转帐来说,这种证明方式就不太好了。


一个问题是,交互方式是一对一的,发交易的人要向所有矿工证明交易是合法的,一个一个证明效率太低了。


另外一个问题是,既然需要交互,就要求证明过程中双方都在线,这个也会给用户代码很大的不便。

最好是有一种非交互式的证明方式,只要证明者给出了证明,后续就不再需要交互,任何人都可以验证这个证明是否正确。但是这明显跟我们一开始说的不能完全由证明者给出矛盾。


一个解决方案就是用公共参考串 Common Reference String


证明者给出的证明里面虽然不像 cut and choose 策略一样,由验证者挑选问题来决定。但是也不是完全由证明者自己来决定,而是根据事先定好的一个种子产生的随机序列决定的。这样就相当于有一个中立的第三方来出题目,同样也能达到效果。当然前提是这个第三方确实是中立的。


就像分粥的例子,一个人先分,但不是另外一个人先挑,而是中立第三方产生一个随机数来决定谁拿哪碗粥。同样可以保证结果尽量公平。


zcash 系统也是采用了这样的方案。详细信息可以搜索 zcash trust setup



3. 测试内容


上一节其实讲的是验证者的困境。证明者天然具有信息优势,验证者必须要主动出击,才能防止被证明者欺骗。但其实还有一点是验证者自己需要注意的。


那就是测试题目的难度要有区分度


就像一个软件项目的验收测试一样,不能说只是编译通过,跑起来不会 crash 就算验收通过了。一定要让真正掌握秘密的证明者通过的难度不大,而假的证明者无论有多强大的算力也无法蒙混过关。


阿里巴巴故事里的验证方法,其实是有漏洞的。


比如阿里巴巴并不真的掌握咒语,而是跟一个真正掌握咒语的人事先串通好。强盗举手之后,阿里巴巴偷偷把要不要开门的信息传递给暗中真正掌握咒语的人,由他来念咒语开门,就把强盗给骗过去了。所以强盗还应该增加难度,限制阿里巴巴做除了念咒语之外其他多余的动作。


在计算机领域,一般做法是把原始问题映射到NP问题。验证者只要验证证明者给出的NP问题的解即可,这个计算量需求不大。


如果某人掌握秘密,能解原始问题,那么转换一下就可以解对应的NP问题。如果不掌握秘密,绕过原始问题,直接暴力求解NP问题,一般可以认为是不可能的。


zcash 使用的 NP 问题是 QAP,更详细的内容可以参考 zcash 的一系列博客 z.cash/blog/snark-expla

以上三点,其实刚好跟零知识证明的三条性质对应:


(1)完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。

(2)合理性。没有人能够假冒证明方,使这个证明成功。

(3)零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。



下回分解


后续文章将会介绍 snark 的一些背景知识,并给出一个利用 jsnark 来做零知识证明的完整例子。敬请期待!更多的介绍可以阅读 cita的白皮书,或者关注我们公众号阅读下一篇文章~


p.s. 文章首发于秘猿官方微信:秘猿科技 Cryptape(微信公众号 ID:Cryptape)。未经授权,禁止转载。

编辑于 2018-02-12 16:43