# 深入浅出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. 多次验证变为一次验证
### 零知识证明问题 转化为 门电路问题


### 门电路问题 转化为多项式问题
Vitalik 在《Quadratic Arithmetic Programs: from Zero to Hero》一文中详细介绍了这个转换过程



本来验证者需要验证的是:输入通过用作证明的数学运算电路,输出为真;但现在验证者需要验证的是,当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,就是在验证输入和输出是否满足用作证明的数学运算电路。**
### 多次验证变为一次验证

推理式证明变成了交互式证明:verifier 在一个随机点上提出挑战,prover 给出这个点上的解响应挑战;prover 需要有「知识」才能计算出随机点上的解,但这个解本身不会泄露「知识」。
## 使用zksnark完成零知识证明
1. verifier 加密
2. prover 加密
3. 非交互
4. 还原
### verifier 加密
### prover 加密
### 非交互模式
### 还原成最初的形式
{"metaMigratedAt":"2023-06-17T01:45:00.968Z","metaMigratedFrom":"Content","title":"深入浅出0知识证明","breaks":true,"description":"椭圆曲线加密算法 P = p*G","contributors":"[{\"id\":\"5d4f3377-7646-4450-aeaf-95f3fa7e5be3\",\"add\":1040,\"del\":94,\"latestUpdatedAt\":null}]"}