Zcash核心:零知识证明

Zcash:黑夜中潜行一文中曾提到Zcash的突破之处在于使用了零知识证明(zero knowledge proof)实现了私密交易与去中心化共存,那么,零知识证明究竟是什么?

它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。比如证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。 其中又分为交互式零知识证明和非交互式零知识证明。

交互式证明

举个例子,如何向色盲证明两个球颜色不同。

假设A有一个红球和黄球,她的一个色盲朋友B不相信A的球颜色不同,A如何才能让B相信这是真的呢?一个简单的办法如下:

  1. A把两个球给B,B每只手拿一个球
  2. A转过身背对B
  3. B抛一枚硬币,如果正面朝上,则保持不动,否则交换左右手的球
  4. A转过身,B问A是否交换过球
  5. 如果A回答错误,则B不相信;否则,重复100次实验,如果A都回答正确,则B相信这两个球是不同颜色的

为什么?如果两个球颜色不一样,那么A每次都应该能分辨;如果两个球颜色一样,则不管B有没有交换过,A都无法分辨,只能乱猜。这样每次猜对的概率只有1/2,重复100次,都猜对的概率将小到可以忽略,所以A将必然猜错。

这就是交互式零知识证明的一个例子,上述证明有三个特点:1)交互过程,整个证明需要A和B进行交互才能完成;2)具有随机性,即B需要抛一枚硬币,来决定是否交换球;3)零知识,虽然B最终相信了这两个球是不同颜色的,但B还是不知道这两个球是什么颜色的。

非交互式零知识证明

顾名思义,非交互式即证明过程不需要反复本文由币乎社区(bihu.com)内容支持计划赞助

微博上总有读者私信询问关于区块链出海的问题,所以建了个芥末圈子(非知识星球)『区块之殇』,方便大家交流,内容也会优先在里面发布。原创不易,因为知乎和微信的限制,目前只能在微信中扫码进入,欢迎点击加入本文由币乎社区(bihu.com)内容支持计划赞助

的问题,所以建了个芥末圈子(非知识星球)『区块之殇』,方便大家交流,内容也会优先在里面发布。原创不易,因为知乎和微信的限制,目前只能在微信中扫码进入,欢迎点击加入。在双方间传递信息,这个如何实现?我们以Zcash为例:

Alice要向Bob转一个ZEC,此时Alice拥有一张1ZEC的支票,要转账给Bob时,先给Bob新建一张1ZEC的支票,这时Alice和Bob都有了一张支票。

这两张“支票”都是有效的。Alice的支票开始就存在于整个Zcash网络,Bob的支票在生成后也会被广播到全网。

为了隐藏交易者信息,要对两张支票进行加密处理,在全网中存在的“支票”其实是这样子的。

同时,因为资产只能有一份,所有矿工手里还有一个作废列表。Alice要同时广播自己的“发票代号”,录入作废列表中。发票代号也是加密的。所以矿工们能看到的信息其实是这样的。其中Alice的支票是原先存在的,Alice的支票代号r1和Bob的支票是在交易过程中被Alice广播的。

矿工们能获取的信息相当有限,但是这并不影响对矿工对交易有效性的判断。

判断的逻辑相当简单:矿工拿到Alice给的支票代号r1,去作废列表中检索,假如作废列表中已经存在r1,则证明r1所对应的的支票早已失效;若作废列表中并不存在r1,则证明r1对应的支票仍旧有效,此时矿工把r1录入作废列表中,把新生成的支票录入支票列表中。所以记账的过程就是对原有支票登记失效,并存入现有支票的过程。

在这个过程中,我们不难发现,每笔交易矿工能接收到的东西只有一个发票代号,和一张新的发票,而且这两样东西都是被加密的。所以矿工并不知道转账双方是谁,也不知道转账金额是多少。Bob也不知道是谁转的账,但只要Alice把解锁支票的查看私钥通过私信给Bob,Bob就可以知道这笔交易的所有信息。

这种方法就属于非交互式零知识证明。整个交易过程中,Bob并没有见过Alice的支票,但是还是实现了资产所有权的转移。同时,Alice也可以通过发送查看密钥的方式向Bob证明自己身份。

猜你喜欢

转载自blog.csdn.net/shangsongwww/article/details/89598030