区块链技术一直处于金融巨头们的灼热目光之下,类似联盟链的共享账簿帮助银行之间节省了大量的成本,但他们依然想要保护隐私数据,因此零知识证明是金融机构的一个可能帮助实现这一愿景的工具。Zcash首先提出一种零知识证明的实现方式,通过这种方式银行可以在不泄露他们的信息或损害客户机密的情况下将资产转移到这些网络上。
如何实现交易过程完全匿名?匿名交易的实现依赖于一种叫做“零知识证明”的密码学手段,本文为你清晰讲述ZCash的交易原理,以及零知识证明在交易过程中的运用。
1 、什么是零知识证明?
20世纪80年代MIT首次提出零知识证明——证明方A向验证方B证明某事的真实性的方法,除了特定具体陈述的事实以外,不透露任何额外的信息。例如登录网站时,现如今通用做法是web服务器储存了原有密码哈希值,用户在登录时进行哈希计算结果比对,但是这种方式会使得服务器遭受攻击时,用户的密码也就暴露无疑。如果能够实现零知识证明,就可以在不知道用户密码的前提下,只进行随机验证即可登录,即使服务器被攻击,由于并未存储用户明文密码,有效的保证用户安全。
基本的零知识证明是交互的,需要验证方B向证明方A不断询问一系列有关其所掌握的数据的相关问题,如果均能够给出正确回答,大概率证明方A的确拥有相关数据。例如某人声称知道一个数独难题的答案,一种零知识证明的方式是验证方随机指定这一次按列、按行还是按九宫格来检测,每次检测不需要看到数字摆的具体位置,只需要检测出来是否包含了1-9个数字即可,只要验证的次数足够多,那么可以大概率相信证明方是知道数独题目的解的。但是这样简单的方式还不能让人相信证明方A和验证方B均没有作假,在数独的案例中,两者有可能事先串通好,从而使得证明方A在不知道答案的前提下通过验证。如果他们想让第三方信服,验证方B必须也要证明自己每次的检测方案是随机的且自己没有和证明方A串通。
非交互式的零知识证明顾名思义,不需要互动过程,避免了串通的可能性,但是可能会额外需要一些机器和程序来决定试验的序列:例如在数独的例子中,通过程序的方式来决定哪一次按行、哪一次按列来检测,但是这个试验序列必须保密,否则验证方预先知道了试验的序列就有可能利用这个信息,提前准备,在并不知情下通过验证。
零知识证明的随机验证可以概括为两类:
事实类陈述:例如“证明一个数N是合数”。
数据呈现陈述:例如“知道N的因式分解”。
但并不是所有的问题都有零知识证明的加密方案,Goldreich, Micali 和 Wigderson 给出了理论上存在零知识证明解的有效范围。他们发现对于在多项式时间内可以验证解的决策问题(问题的答案仅为是/否),存在已知的零知识证明方案。只需要在这样问题中找到想要证明的论述,并转化为图的3-着色问题的一个实例,那么就可以利用已有的协议实现零知识证明。
2、区块链中的零知识证明应用
实际零知识证明的技术涉及非常深入的数学与密码学基础知识,因此为了更加形象的讲述零知识证明的交易过程,我们请到了数字货币界最著名CP:Alice和Bob,以Qtum的交易为例演示零知识证明如何运用在区块链中。
交易场景:Alice转1个QTUM给Bob
转账前,Alice要事先准备1个QTUM。为了方便理解,我们把Alice准备转出的这1个QTUM看成一张面额为1个QTUM的权益票据。
从这张票据已知:
Alice确实有1个QTUM
Alice使用私钥证明Alice拥有对这笔资产转账的权力。
票据的面额和转账权都已经明确,Alice就可以给Bob转账了。转账的原理很简单,就是给Bob新建一张一样的票据,证明Bob拥有了1个QTUM。同时撕掉Alice手中那张的票据,通过这样的方式,实现资产所有权的转移。
以上逻辑其实不难理解,与日常生活中的银行转账是一个道理。通过银行转账,我们在交易时不必对实物货币进行转移,而是以银行记账的方式,实现“资产所有权”的转移。
ZCash的转账原理与QTUM一样,ZCash的交易过程也是 “资产所有权”的转移。继续沿用票据的比方。
交易场景:Alice转1个ZEC给Bob。
转账前,Alice创建一张面额为1个ZEC的票据。
能从该凭证中已知:
Alice确实拥有1个ZEC,Alice使用私钥证明Alice拥有对这笔资产转账的权力。
这张“凭证”上多了一串随机数,用符号 r 表示。这串随机数的作用好比发票据代号,用来唯一识别该票据。Alice的票据代号为r1。明确以上信息,Alice就可以进行ZEC转账了。
1、QTUM一样,要先为Bob新建一张“票据”。Bob的票据代号(r2)与Alice的票据代号(r1)不相同。
2、新的“资产所有权”生成的同时,必须要想办法销毁原来的“资产所有权”。即必须想办法让Alice手中的“票据”失效。与QTUM的“直接撕毁”不同,而是采用“备注作废”的手段,达到同样的效果。怎么理解呢就是在不对原先票据作任何处理的前提下,新建一个作废文件列表,录入需要作废的“发票据代号”。
从上图可以看出,原先的Alice持有的票据仍旧存在,并没有消失,只是这张票据已经被记入“作废列表”。在确定资产所有权时要同时读取两个列表的信息,能确定Bob拥有资产所有权的判断方法是:作废列表中不存在Bob所持“票据”的代号。
可是为什么要这样设计呢?其实这样设计的目的是为了在交易过程中运用 “零知识证明”。
我们再回顾QTUM和ZCash的例子。
Alice要向Bob转一个单位的数字货币(QTUM/ZEC),即Alice要向Bob转移一个单位的资产所有权。这时有以下两个方法:
(一)QTUM:Alice拥有一张1QTUM的票据,要转账给Bob时,先给Bob新建一张1QTUM的票据,同时当着Bob的面将自己原先的票据撕毁。
(二)ZCash:Alice拥有一张1ZEC的票据,要转账给Bob时,先给Bob新建一张1ZEC的票据,然后在一张约定有效的作废列表中,记录下Alice的发票据的代号,证明Alice的票据已经失效。
ZCash的方法属于零知识证明。整个交易过程中,Bob并没有见过Alice的票据,但是还是实现了资产所有权的转移。在ZCash的整个交易系统中,Alice和Bob的交易还有其他见证者,即负责记录交易信息的矿工。同样道理,矿工也不必看到Alice的票据,只要能确定代号为r1的票据已经作废了就行。
进一步解释ZCash的匿名交易过程了。还是那个例子:Alice转1 个ZEC给Bob。这个例子中有涉及到的角色有转账双方Alice和Bob,以及记账者(矿工)。
首先是Alice和Bob都有了一张票据。
这两张“票据”都是有效的。Alice的票据开始就存在于整个ZCash网络,Bob的票据在生成后也会被广播到全网。为了隐藏交易者信息,要对两张票据进行加密处理,信息都是被加密的,可以通过拥有者的私钥解密。
同时,因为资产只能有一份,所有矿工手里还有一个作废列表。Alice要同时广播自己的“发票代号”,录入作废列表中。发票代号也是加密的。所以矿工们能看到的信息其实是这样的。其中Alice的票据是原先存在的,Alice的票据代号r1和Bob的票据是在交易过程中被Alice广播的。
矿工们能获取的信息相当有限,但是这并不影响对矿工对交易有效性的判断。
判断的逻辑相当简单:矿工拿到Alice给的票据代号r1,去作废列表中检索,假如作废列表中已经存在r1,则证明r1所对应的的票据早已失效;若作废列表中并不存在r1,则证明r1对应的票据仍旧有效,此时矿工把r1录入作废列表中,把新生成的票据录入票据列表中。所以记账的过程就是对原有票据登记失效,并存入现有票据票据的过程。
在这个过程中,我们不难发现,每笔交易矿工能接收到的东西只有一个发票据代号,和一张新的发票据,而且这两样东西都是被加密的。所以矿工并不知道转账双方是谁,也不知道转账金额是多少。
现有区块链上的交易中,除了使用地址来替换交易双方的真实身份,使得交易具有部分匿名性以外,发送、接收地址和金额都是已知的,别人有可能通过网络上的各种信息、和现实世界发生的交互记录等将地址和真实身份对应起来,也因此具有隐私暴露的隐患。
零知识证明可以在不透露花费了具体哪个货币的基础上,验证出你的确花了这笔钱。为了将这笔钱转给他人,逻辑上需要我们使得这枚隐私币不能再被别人花费,隐私币的办法是大家共同维护一个作废列表,存着所有已经花费的隐私币的序列号。
矿工在验证这笔花费交易时运用零知识证明的方法,不需要知道具体花掉哪一个隐私币,也可以验证隐私币的序列号是否在作废列表里。由于花费交易并没有输入地址和签名的信息,整个交易过程中,矿工也并不知道这个隐私币的来源,因此也就难以对交易历史进行分析而获取用户身份。