Title: 不是程序员也能看懂的ZCash零知识证明 Post by: 007eminem on March 18, 2017, 01:49:28 PM 交易过程完全匿名是数字货币ZCash最大的亮点,正是这一点使得ZCash自提出以来便备受关注。ZCash匿名交易的实现依赖于一种叫做零知识证明的密码学手段。本文将通过打比方的手法,用通俗的语言,解释清楚ZCash的交易原理,以及零知识证明是如何运用到ZCash交易过程中的。
本文的嘉宾是数字货币界最著名CP:Alice和Bob。 一、从比特币说起 直接讲解ZCash的交易过程可能会比较抽象。为了有助于理解,我们不妨先分析比特币,作为铺垫。 我们先来打个比方说明比特币的转账原理。 演示场景:Alice转1个比特币给Bob。 转账前,Alice要事先准备1个比特币。为了方便理解,我们把Alice准备转出的这1个比特币看成一张面额为1个比特币的支票,如图1。 http://img.weiyangx.com/2016/12/14b75c2d38d88b747c19.png 图1 从这张支票中我们可以获取到如下信息:Alice确实拥有1个BTC。 Alice使用私钥对这张支票签名,证明Alice拥有对这笔资产转账的权力。 支票的面额和转账权都已经明确,Alice就可以给Bob转账了。转账的原理很简单,就是给Bob新建一张一样的支票,证明Bob拥有了1个比特币。同时撕掉Alice手中那张的支票,通过这破旧并立新的方式,实现资产所有权的转移。如图2。 http://img.weiyangx.com/2016/12/c58ec9af29371058432c.png 图2 以上逻辑其实不难理解,因为这和日常生活中的银行转账是一个道理。通过银行转账,我们在交易时不必对实物货币进行转移,而是以银行记账的方式,实现资产所有权的转移。比特币交易的过程实质上就是一个资产所有权的转移过程,转入比特币的那一方新建一份资产所有权,而转出方需要销毁原先的资产所有权,被销毁的那张支票永远不会再出现。 二、ZCash的转账原理 与比特币一样,ZCash的交易过程也是资产所有权的转移。继续沿用前文支票的比方。 演示场景:Alice转1个ZEC给Bob。 转账前,Alice创建一张面额为1个ZEC的支票,如图3。 http:// 图3 能从该凭证中获取的信息:Alice确实拥有1个ZEC。 Alice使用私钥对这张支票签名,证明Alice拥有对这笔资产转账的权力。 这张凭证上多了一串随机数,用符号 r 表示。这串随机数的作用好比支票代号,用来唯一识别该支票。Alice的支票代号为r1。 明确以上信息,Alice就可以进行ZEC转账了。 第一步:比特币一样,要先为Bob新建一张支票。Bob的支票代号(r2)与Alice的支票代号(r1)不相同,如图4。 http://img.weiyangx.com/2016/12/d76fd0a4809a5be8a22e.png 图4 第二步:新的资产所有权生成的同时,必须要想办法销毁原来的资产所有权。即必须想办法让Alice手中的支票失效。与比特币简单粗暴的直接撕毁不同,ZCash采用备注作废的手段,达到同样的效果。怎么理解呢?就是在不对原先支票作任何处理的前提下,新建一个作废文件列表,录入需要作废的发票代号。如图5, http://img.weiyangx.com/2016/12/2b1a9e41c7cb15669337.png 图5 从上图可以看出,原先的Alice持有的支票仍旧存在,并没有消失,只是这张支票已经被记入作废列表。在确定资产所有权时要同时读取两个列表的信息,能确定Bob拥有资产所有权的判断方法是:作废列表中不存在Bob所持支票的代号。 可是为什么要这样设计呢?其实这样设计的目的是为了在交易过程中运用零知识证明。 三、零知识证明 什么是零知识证明? 零知识证明(被称为zk-SNARK)是实现Zcash的匿名特性的核心技术。零知识证明的定义是:证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。举个简单的例子: A要向B证明自己拥有某个房间的钥匙,假设该房间只能用钥匙打开锁,而其他任何方法都打不开。这时有2个方法: (一)A把钥匙出示给B,B用这把钥匙打开该房间的锁,从而证明A拥有该房间的正确的钥匙。 (二)B确定该房间内有某一物体,A用自己拥有的钥匙打开该房间的门,然后把物体拿出来出示给B,从而证明自己确实拥有该房间的钥匙。 后面这个方法属于零知识证明。好处在于在整个证明的过程中,B始终不能看到钥匙的样子,从而避免了钥匙的泄露。 那么零知识证明怎么运用到ZCash交易过程中呢? 我们再回顾比特币和ZCash的例子。 Alice要向Bob转一个单位的数字货币(BTC/ZEC),即Alice要向Bob转移一个单位的资产所有权。这时有以下两个方法: (一)比特币中的做法:Alice拥有一张1BTC的支票,要转账给Bob时,先给Bob新建一张1BTC的支票,同时当着Bob的面将自己原先的支票撕毁。 (二)ZCash中的做法:Alice拥有一张1ZEC的支票,要转账给Bob时,先给Bob新建一张1ZEC的支票,然后在一张约定有效的作废列表中,记录下Alice的发票的代号,证明Alice的支票已经失效。 ZCash的方法属于零知识证明。整个交易过程中,Bob并没有见过Alice的支票,但是还是实现了资产所有权的转移。在ZCash的整个交易系统中,Alice和Bob的交易还有其他见证者,即负责记录交易信息的矿工。同样道理,矿工也不必看到Alice的支票,只要能确定代号为r1的支票已经作废了就行。 四、ZCash完整的匿名交易系统 有了上述铺垫,就可以进一步解释ZCash的匿名交易过程了。 还是那个例子:Alice转1个ZEC给Bob。这个例子中有涉及到的角色有转账双方Alice和Bob,以及记账者(矿工)。 首先是Alice和Bob都有了一张支票,如图6。 http://img.weiyangx.com/2016/12/58be687cd9a13d7776b1.png 图6 这两张支票都是有效的。Alice的支票开始就存在于整个ZCash网络,Bob的支票在生成后也会被广播到全网。 为了隐藏交易者信息,要对两张支票进行加密处理。在全网中存在的支票其实是这样子的,如图7。 http://img.weiyangx.com/2016/12/8c84974a7c5b56145b54.png 图7 信息都是被加密的,可以通过拥有者的私钥解密 同时,因为资产只能有一份,所有矿工手里还有一个作废列表。Alice要同时广播自己的发票代号,录入作废列表中。发票代号也是加密的。所以矿工们能看到的信息其实是这样的。其中Alice的支票是原先存在的,Alice的支票代号r1和Bob的支票是在交易过程中被Alice广播的。如图8。 http://img.weiyangx.com/2016/12/27dbb28ea03fd64ae84f.png 图8 矿工们能获取的信息相当有限,但是这并不影响对矿工对交易有效性的判断。 判断的逻辑相当简单:矿工拿到Alice给的支票代号r1,去作废列表中检索,假如作废列表中已经存在r1,则证明r1所对应的的支票早已失效;若作废列表中并不存在r1,则证明r1对应的支票仍旧有效,此时矿工把r1录入作废列表中,把新生成的支票录入支票列表中。所以记账的过程就是对原有支票登记失效,并存入现有支票的过程。 在这个过程中,我们不难发现,每笔交易矿工能接收到的东西只有一个发票代号,和一张新的发票,而且这两样东西都是被加密的。所以矿工并不知道转账双方是谁,也不知道转账金额是多少。 五、数据库 其实有心人可以发现,按照上文的思路,能写一个用于ZCash匿名交易的数据库。笔者后续的文章中会另起一文专门写数据库的构建。 |