---
# System prepended metadata

title: 深入浅出0知识证明

---

# 深入浅出0知识证明

## 前置知识：
1. 椭圆曲线加密算法 P = p*G    
2. 双线性映射 e(a*G,b*G) == e(a*b*G,G)
3. 门电路问题与NPC问题
4. 零知识证明的概念
5. 全同态

## 准备工作
1. 门电路问题 是 NPC问题
2. 零知识证明问题 转化为 门电路问题
3. 门电路问题 转化为多项式问题
4. 多次验证变为一次验证
### 零知识证明问题 转化为 门电路问题
![](https://i.imgur.com/1JlctxJ.png)
![](https://i.imgur.com/S1aHpbZ.png)

### 门电路问题 转化为多项式问题
Vitalik 在《Quadratic Arithmetic Programs: from Zero to Hero》一文中详细介绍了这个转换过程
![](https://i.imgur.com/8m1nLal.png)
![](https://i.imgur.com/HbVrB1H.png)
![](https://i.imgur.com/Aal263p.png)

本来验证者需要验证的是：输入通过用作证明的数学运算电路，输出为真；但现在验证者需要验证的是，当x=1、x=2、x=3、x=4时，A(x) * B(x)–C(x) = 0。
**A(x) * B(x)–C(x) 中包含了解向量s，它是把输入、输出、电路绑定在一起的；验证A(x) * B(x)–C(x) = 0，就是在验证输入和输出是否满足用作证明的数学运算电路。**
### 多次验证变为一次验证
![](https://i.imgur.com/2WSi9u2.png)

推理式证明变成了交互式证明：verifier 在一个随机点上提出挑战，prover 给出这个点上的解响应挑战；prover 需要有「知识」才能计算出随机点上的解，但这个解本身不会泄露「知识」。

## 使用zksnark完成零知识证明
1. verifier 加密
2. prover 加密
3. 非交互
4. 还原

### verifier 加密
### prover 加密
### 非交互模式
### 还原成最初的形式