# 零知识证明，关于ZCASH的零知识证明

By [Cheng](https://paragraph.com/@98989) · 2021-11-08

---

> 2016 年 10 月 29 日，由美国密码学科学家们研发的，首个使用“零知识证明”技术开发的匿名密码学货币，Zcash 发布了创世块。
> 
> Zcash 所使用的零知识证明技术，能够保证证明者在不向验证者提供身份信息的情况下，使验证者相信某个论断的正确性。而针对 Zcash 使用场景，也就是保证了交易的匿名性。这项突破性的技术，解决了比特币本身的可替换性问题。这项功能有利于大型金融服务行业更好的使用区块链技术，保护用户个人隐私。

为了让用户能够更好的理解零知识证明技术，本文转载自雷盈特邀作者 Carlos 对于零知识证明的解释文章。雷盈（公众号: RadarWinChina ）是上海区块链标杆企业，为区块链全产业链提供技术与咨询服务。

交易过程完全匿名是数字货币ZCash最大的亮点，正是这一点使得ZCash自提出以来便备受关注。ZCash匿名交易的实现依赖于一种叫做“零知识证明”的密码学手段。本文将通过打比方的手法，用通俗的语言，解释清楚ZCash的交易原理，以及零知识证明是如何运用到ZCash交易过程中的。

本文的嘉宾是数字货币界最著名 CP：Alice 和 Bob 。

### 一、从比特币说起

直接讲解ZCash的交易过程可能会比较抽象。为了有助于理解，我们不妨先分析比特币，作为铺垫。

我们先来打个比方说明比特币的转账原理。

演示场景：Alice 转 1 个比特币给 Bob 。

转账前，Alice 要事先准备 1 个比特币。为了方便理解，我们把 Alice 准备转出的这 1 个比特币看成一张面额为 1 个比特币的“支票”，如图 1 。

![](https://storage.googleapis.com/papyrus_images/5d17aae9073ce7cefe190584d4416d629b57f789e38c55c3e1d35b2eda90b84c.jpg)

图一

从这张“支票”中我们可以获取到如下信息：

1.Alice 确实拥有 1 个 BTC。

2.Alice 使用私钥对这张支票签名，证明 Alice 拥有对这笔资产转账的权力。

支票的面额和转账权都已经明确，Alice 就可以给 Bob 转账了。转账的原理很简单，就 是给 Bob 新建一张一样的“支票”，证明 Bob 拥有了 1 个比特币。同时撕掉 Alice 手中那张的“支票”，通过这“破旧”并“立新”的方式，实现资产所有权的转移。如图2。

![](https://storage.googleapis.com/papyrus_images/a2a3ffeb0f3c9f591ce028493087e9485e9d5dacf173c14a6382c1e7fcf1ccd8.jpg)

图二

以上逻辑其实不难理解，因为这和日常生活中的银行转账是一个道理。通过银行转账，我们在交易时不必对实物货币进行转移，而是以银行记账的方式，实现“资产所有权”的转移。比特币交易的过程实质上就是一个“资产所有权”的转移过程，转入比特币的那一方“新建”一份资产所有权，而转出方需要“销毁”原先的资产所有权，被销毁的那张“支票”永远不会再出现。

### 二、ZCash 的转账原理

与比特币一样，ZCash 的交易过程也是 “资产所有权”的转移。继续沿用前文“支票”的比方。

演示场景：Alice 转 1 个 ZEC 给 Bob。

转账前，Alice 创建一张面额为 1 个 ZEC 的“支票”，如图3。

![](https://storage.googleapis.com/papyrus_images/595c3e998422c7fb6a8ab29b449ba695fb5db17365f3224040e96c0186d68429.jpg)

图三

能从该凭证中获取的信息：

1.Alice 确实拥有 1 个 ZEC。

2.Alice 使用私钥对这张支票签名，证明 Alice 拥有对这笔资产转账的权力。

3.这张“凭证”上多了一串随机数，用符号 r 表示。这串随机数的作用好比 “支票代号”，用来唯一识别该支票。Alice 的“支票代号”为 r1。

明确以上信息，Alice 就可以进行 ZEC 转账了。

第一步:比特币一样，要先为 Bob 新建一张“支票”。Bob 的支票代号（r2）与 Alice 的支 票代号（r1）不相同，如图4。

![](https://storage.googleapis.com/papyrus_images/f4dd4893146e4676a56ac8a60faa240d28308cb2cb6a469d55311350c63faa92.jpg)

图四

第二步：新的“资产所有权”生成的同时，必须要想办法销毁原来的“资产所有权”。即必须想办法让 Alice 手中的“支票”失效。与比特币简单粗暴的“直接撕毁”不同，ZCash 采用“备注作废”的手段，达到同样的效果。怎么理解呢？就是在不对原先“支票”作任何处理的前提下，新建一个作废文件列表，录入需要作废的“发票代号”。如图5。

![](https://storage.googleapis.com/papyrus_images/ad8ffdfe57e3a1183362a2e2004b69ebe34c44435b4d4d78e3add695fc8fd485.jpg)

图五

从上图可以看出，原先的 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 拥有一张 1 BTC 的支票，要转账给 Bob 时，先给 Bob 新建一张 1 BTC 的支票，同时当着 Bob 的面将自己原先的支票撕毁。

（二）ZCash 中的做法：Alice 拥有一张 1 ZEC 的支票，要转账给 Bob 时，先给 Bob 新建一张 1 ZEC 的支票，然后在一张约定有效的作废列表中，记录下 Alice 的发票的代号，证明 Alice 的支票已经失效。

ZCash 的方法属于零知识证明。整个交易过程中，Bob 并没有见过 Alice 的支票，但是还是实现了资产所有权的转移。在 ZCash 的整个交易系统中， 、Alice 和 Bob 的交易还有其他见证者，即负责记录交易信息的矿工。同样道理，矿工也不必看到 Alice 的支票，只要能确定代号为 r1 的支票已经作废了就行。

四、ZCash 完整的匿名交易系统

有了上述铺垫，就可以进一步解释 ZCash 的匿名交易过程了。

还是那个例子：Alice 转 1 个 ZEC 给 Bob。这个例子中有涉及到的角色有转账双方 Alice 和 Bob，以及记账者（矿工）。

首先是 Alice 和 Bob 都有了一张支票，如图 6。

![](https://storage.googleapis.com/papyrus_images/ea162aefda05dce107323a4eb1e926e9d51faa3914d718b4945f24a4562bfc96.jpg)

图六

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

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

![](https://storage.googleapis.com/papyrus_images/facf1d8587ca0c7725a65afe8d4abf1bc8743b2d7acc34ecba49837c82c68505.jpg)

图七

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

![](https://storage.googleapis.com/papyrus_images/07ec3d4db246bbc8c1f700552ff2171a04ce33e5a0deade20c98e50ca47e7311.jpg)

图八

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

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

在这个过程中，我们不难发现，每笔交易矿工能接收到的东西只有一个发票代号，和一张新的发票，而且这两样东西都是被加密的。所以矿工并不知道转账双方是谁，也不知道转账金额是多少。

---

*Originally published on [Cheng](https://paragraph.com/@98989/zcash)*
