今天想跟大家分享的是关于区块链的一点基础知识——零知识证明(Zero Knowledge Proof),说到零知识证明,不得不提一个数字货币zcash,这个数字货币的系统思想便是交易过程完全匿名,这使得它在提出以来便备受关注。
本文主要是讲零知识证明的知识,关于zcash数字货币如何根据零知识证明实现区块链体系架构,可以自行搜索了解,也可等以后小编整理进行分享。
什么是零知识证明
“零知识证明”(被称为“zk-SNARK”)的定义是:证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。举个简单的例子:
甲想向乙证明他拥有开启某个宝箱的钥匙,而这钥匙只能开启这个宝箱,不能开启其他宝箱,现在有两种方式进行证明:
A.甲把钥匙给乙,乙拿过去打开宝箱的锁,从而证明了甲是真的拥有开启宝箱的钥匙。
B.乙知道宝箱中含有某样东西,然后甲开启宝箱从里面把东西拿出来,就能证明甲的确有开启宝箱的钥匙。
第二种方法就是零知识证明,在证明的过程中,乙不知道开启宝箱的钥匙的模样,从而避免了钥匙的泄露。
零知识证明的性质
(1)完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。
(2)合理性。没有人能够假冒证明方,使这个证明成功。即开宝箱的钥匙是唯一的。
(3)零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。
零知识证明的过程
零知识证明过程中,有两个参与者,一个是证明者,一个是验证者。证明者拥有某个秘密,想让验证者相信他真的拥有着某个秘密,却不想让他知道这个秘密是什么。
因此双方需要通过一个协议进行一系列的交互,最后验证者会获得一个结果,根据这个结果可以确定证明者是否拥有个秘密,而不需要确认秘密的内容是什么。
证明交互协议
一.零知识
放在比特币中就是隐私交易,在比特币网络中,用户需要将交易明文广播给所有矿工,由他们来校验交易的合法性。但是有些情况下,基于隐私的考虑,又不想把交易的具体内容公布出来。这就形成了一对矛盾。
解决这个矛盾的核心就是,证明这个事件本身正确与否,而不再需要验证者重视整个事件。就像软件测试中的黑盒测试,需要的是把软件中所有的功能的输入输出确认一遍,而不是把软件分解查看里面的功能实践细节。
对于比特币交易的例子,只需要证明:
发送方的钱属于发起交易的人
发送发的钱跟接收方收到的钱相等
发送方的钱在交易结束后确实被销毁了
整个证明过程中,矿工其实并不关心具体花掉了多少钱,发送者具体是谁,接受者具体是谁。矿工只关心系统的钱是不是守恒的。
二.测试方式
测试不能完全由证明方给出,就如写代码的时候不能让自己进行代码验收。
通常这种情况下会采用 cut and choose 的策略。这个策略最简单的例子就是两人分粥。无论谁来分粥,都会给自己分的多,解决方法就是一个人分,另外一个人先挑。
在交易验证的时候,证明者会根据系统要求的一些必要的验证内容,作为问题的范围,而验证者则像一个挑战者,对证明者进行多轮交互,等待证明者的回应。
样的证明是一种交互的证明方式。双方需要实时交互,交流信息。对于比特币隐私转帐来说,这种证明方式就不太好了。还有就是,证明者需要向所有矿工进行广播交易,交互在一对一的情况下,效率可想而知。
另外一个问题是,既然需要交互,就要求证明过程中双方都在线,这个也会给用户代码很大的不便。最好是有一种非交互式的证明方式,只要证明者给出了证明,后续就不再需要交互,任何人都可以验证这个证明是否正确。但是这明显跟我们一开始说的不能完全由证明者给出矛盾。
一个解决方案就是用公共参考串 Common Reference String。
证明者给出的证明里面虽然不像 cut and choose 策略一样,由验证者挑选问题来决定。但是也不是完全由证明者自己来决定,而是根据事先定好的一个种子产生的随机序列决定的。这样就相当于有一个中立的第三方来出题目,同样也能达到效果。当然前提是这个第三方确实是中立的。
就像分粥的例子,一个人先分,但不是另外一个人先挑,而是中立第三方产生一个随机数来决定谁拿哪碗粥。同样可以保证结果尽量公平。
三.测试内容
证明者天然具有信息优势,验证者必须要主动出击,才能防止被证明者欺骗。但其实还有一点是验证者自己需要注意的。
那就是测试题目的难度要有区分度。
就像一个软件项目的验收测试一样,不能说只是编译通过,跑起来不会冲突就算验收通过了。一定要让真正掌握秘密的证明者通过的难度不大,而假的证明者无论有多强大的算力也无法蒙混过关。
在计算机领域,一般做法是把原始问题映射到NP问题。验证者只要验证证明者给出的NP问题的解即可,这个计算量需求不大。
如果某人掌握秘密,能解原始问题,那么转换一下就可以解对应的NP问题。如果不掌握秘密,绕过原始问题,直接暴力求解NP问题,一般可以认为是不可能的。