# 零知识证明（ZKP）

By [julian](https://paragraph.com/@noage-2) · 2022-06-30

---

什么是零知识证明
--------

### 定义

它指的是**证明者**能够在不向**验证者**提供任何有用的信息的情况下，使验证者相信某个结论是正确的。顾名思义，证明者给验证者有关的信息为0，所以称为ZKP。顾名思义，证明者给验证者有关的信息为0，所以称为ZKP。

### 分类

*   交互式（Interactive）：证明方与验证方都需要同时在场，不管是在线还是面对面，同时需要双方需要交换相关信息。
    

![交互式零知识证明](https://storage.googleapis.com/papyrus_images/2474bf77793a4a346a0d0400ea49e4c919b70d77e9c62192e63deaf1f2130343.png)

交互式零知识证明

缺陷：每次验证都需要进行整个冗长的过程。证明方与验证方都需要同时在场，不管是在线还是面对面。

*   非交互式（Non-interactive）：只需要生成一次证明信息，其他验证者拿到后都能做验证，无需同时在线。
    

![非交互式零知识证明](https://storage.googleapis.com/papyrus_images/55e4daead97fd6bec9d288662df38cb5116cd2e63d0734505102062f4022b5c7.png)

非交互式零知识证明

### 性质

ZKP满足性质，一是无法作假（可靠性），二是足够有说服力（完备性）

1.  可靠性：P无法欺骗V。换言之，若P不知道一个定理的证明方法，则P使V相信他会证明定理的概率很低。假的真不了。
    
2.  完备性：V无法欺骗P。若P知道一个定理的证明方法，则P使V以绝对优势的概率相信他能证明。真的假不了。
    
3.  零知识性：V无法获取任何额外的知识。
    

**强调一点**：零知识证明并不是数学意义上的证明，因为它存在小概率的误差，欺骗者有可能通过虚假陈述骗过验证者。换句话来说，零知识证明是概率证明而不是确定性证明。但是也存在有技术能将误差降低到可以忽略的值。

### 构造ZKP的三段论

引用网上一例子：

`相信通过上面的介绍，大家已经对零知识证明有了一个直观的认识，那么我们如何针对一个特定的论断构造一个满足上述三条件的零知识证明呢？写到这里，我不禁想起了一段难倒无数英雄汉的古老对话： 女：你爱我吗？ 男：爱！ 女：怎么证明？ 男：…… 其实所有的证明方面临和此男相同的窘境，当然解决方法也是类似的，那便是一个古老的套路：试探。男生无法把自己的脑回路拿出来给女生看，也不敢把自己的聊天记录发给女生，所以女生需要在日常生活中出其不意地试探男生，观察男生反应，以此判定男生是否是真心的。试探的强度不能太狠，否则容易冤枉老实木讷的直男，不满足完备性；试探也不能做的太明显，否则被渣男发现了规律容易上当受骗，不满足可靠性；试探的内容也不能过度，否则窥探了过多男生的隐私容易出事，不满足零知识性。由此我们引出构零知识证明构造方法的三段论：`

1.  `证明方先根据论断内容向验证方发个交底材料，这个样例论断需要是随机的或加密的；`
    
2.  `验证方随机生成一个试探（学术名词是挑战，challenge），发给证明方；`
    
3.  `证明方根据该试探和交底材料生成证明信息发给验证方。验证方自己将信息和交底材料一合计，判断证明方是否通过了该试探。 这里第一步的交底材料是非常必要的，它有两个作用：一是可以防止证明方根据试探的内容临时造假；二是可以帮助证明方掩盖敏感信息，保证证明过程的零知识性。第二步的试探也必须是随机的，否则如果证明方能提前知道试探的内容，那即便他不知道原论断背后的答案他也能提前准备好交底材料和返回的信息。最后，这个过程必须重复多次，因为通过一次或少数试探可能是运气，但如果一直能通过，则说明是实力了。 现以前面的男女之间相互试探为例来说明上面的三段论：`
    

*   `男生将自己的聊天记录尽数加密发给女生；`
    
*   `女生随机选择一个日期和一位漂亮妹子，让男生解密相应的聊天记录；`
    
*   `男生将那段聊天记录的解密方法发给女生，女生解密后，根据聊天的内容、朋友圈的点赞情况、以及私下询问聊天对象获取的必要信息，来判断该聊天记录是否符合事实以及男生是否有不轨的想法。`
    
    `注意，女生的试探次数不能太少，否则男生可能因为侥幸而逃过一劫，所得结果也无说服力。当然有人会说，男生在一开始就直接发一个假的聊天记录过去不就行了。这样理论上当然可行，但真这样做的话成本太高，因为他如果想躲过所有的随机试探，他势必需要将所有聊天记录和相关信息全部造假，并且还要和所有可能被查的漂亮妹子串供，所谓说一句谎言就要用一百句谎言来弥补，我们认为这种情况在实际上是很难发生的，这也正好映衬了前面在介绍可靠性的时候特意注明的“极低概率”。`
    

应用场景
----

### 扩容

目前存在很多公链，这些公链都绕不开一个不可能三角（trilemma），即不可能同时满足Security、decentralization、scalability，所有的公链都是在这三者中做了平衡。ETH、BTC非常好的解决了前两者，但scalability一直是大众诟病的。所以衍生出不同的扩容方案，解决区块链交易速度的问题。

![](https://storage.googleapis.com/papyrus_images/e68173573c461b9ecb0fbc879911ab5d594da36c4910d6ca9bd94f0e31eb3d9a.png)

### 保护隐私

区块链本身的一个关键优势就是透明性，任何在区块链网络中运行的节点都可以查看并下载所有储存在账本中的数据，然而在许多情况下，智能合约应用却出于各种商业或法律原因需要保障数据隐私，比如传入专有数据触发智能合约执行。区块链结合了零知识证明技术，可以让用户和企业用隐私数据来执行智能合约，并且不透露具体的数据内容。现在，越来越多项目都采用零知识证明（ZKP）技术在公链上保护隐私。

另外，联盟链的出现可以有效保护机构交易数据隐私，但联盟链在网络规模上却逊色于公链，公链可以覆盖全世界各地的用户，并形成巨大的网络效应。而零知识证明可以使这些机构安全地与公链网络交互，并同时保护内部敏感数据隐私。因此，零知识证明成功为传统企业激活了一些列公链的应用场景，推动创新，并建立更高效的全球经济体系。

落地方案
----

![](https://storage.googleapis.com/papyrus_images/afbbfc8e78f7dc9b78d1f400c81c37c42cf9e9d0af109bc8bd1a4d1b9e5a3d51.png)

技术细节
----

零知识证明库
------

**libsnark**: C++语言编写，支持GGPR13、BCTV14a等zk-SNARKs方案；

**bellman**: Rust语言编写，支持Groth16方案（该方案已经用在了Zcash 2.0 - Sapling升级中）；

**snarkjs**：JS语言编写，支持GGPR13、Groth16方案；

**dalek-cryptography/bulletproofs**： 支持Bulletproof零知识方案。

参考资料
----

[https://www.ethereum.cn/Layer2/what-the-heck-is-zero-knowledge-zk-proof](https://www.ethereum.cn/Layer2/what-the-heck-is-zero-knowledge-zk-proof)

[https://vitalik.ca/general/2021/01/26/snarks.html](https://vitalik.ca/general/2021/01/26/snarks.html)

[https://vitalik.ca/general/2022/06/15/using\_snarks.html](https://vitalik.ca/general/2022/06/15/using_snarks.html)

[https://academy.binance.com/en/articles/zk-snarks-and-zk-starks-explained](https://academy.binance.com/en/articles/zk-snarks-and-zk-starks-explained)

---

*Originally published on [julian](https://paragraph.com/@noage-2/zkp)*
