Skip to content

Commit

Permalink
0810
Browse files Browse the repository at this point in the history
  • Loading branch information
Huowuge committed Aug 10, 2024
1 parent e733390 commit 487c879
Showing 1 changed file with 135 additions and 0 deletions.
135 changes: 135 additions & 0 deletions Zemmer_ZICL1st.md
Original file line number Diff line number Diff line change
Expand Up @@ -971,5 +971,140 @@ r的作用:随机数,就是为了保密私钥sk的。作用等价于sk。

Tornado cash的原理是,通过zk证明知道Merkle Tree中的保密随机数r,就等于知道了私钥sk,就可以提资产了(也就是不必直接知道sk)

### 2024.08.09
请假
### 2024.08.10
## ZK-snarks电路例子

等价转化的意思:将复杂问题简单化,最终转化为可以高效验证的形式。

zk-snark的过程:并不是将一个P问题转化为一个NP问题。而是找到了高效验证复杂问题是否满足某些条件的机制。

理论上任何只要能转化成电路约束的需求都可以最终转化为zk-snark,也就是实现零知识证明。

| 关系 | 原理简述或公式 |
| ------------------------------------------------------------ | ------------------------------------ |
| 计算关系 | y=F(ω),初始参数ω,F包含任意运算关系 |
| R1CS(电路约束) | 将算法用电路表达出来,初始参数还是ω |
| 向量s与多维向量/电路向量(u~m~, v~m~, w~m~)的内积 | 多变量多项式的零点对应R1CS约束的解 |
| 向量s与电路矩阵U,V,W的内积 | |
| 向量s与三组多项式U(x),V(x),W(x)的线性组合运算(系数) | |
| 目标多项式整除QAP或QSP多项式 | 构成NP问题 |
| QAP多项式、目标多项式、商多项式的多指数运算 | 构成零知识证明 |
| 基于这三个多项式UVW的系数计算椭圆曲线离散对数点(双线性映射) | 验证 |



#### 一、场景需求描述

1、需求:未知?

2、结果是x = 3 为解

#### 二、数学公式化

$$
x^4 + x^3 + x^2 + x = 120
$$

#### 三、电路化:变为R1CS

第一种R1CS逻辑

| R1CS | 逻辑 || 加法门强制转化乘法门 |
| ------------- | ---------------------------- | ---- | -------------------- |
| s1 = x * x | x^2^ | 乘法 | |
| s2 = s1 * x | x^3^ | 乘法 | |
| s3 = s2 * x | x^4^ | 乘法 | |
| s4 = s1 + x | x^2^ + x | 加法 | s4 = (s1 + x) * 1 |
| s5 = s4 + s2 | x^3^ + x^2^ + x | 加法 | s5 = (s4 + s2) *1 |
| 120 = s5 + s3 | 120 = x^4^ + x^3^ + x^2^ + x | 加法 | 120 = (s5 + s3) *1 |

优化的第二种R1CS逻辑

| R1CS | 逻辑 ||
| --------------------------- | ------------------------------ | ---- |
| s1 = x * x | x^2^ | 乘法 |
| s2 = s1 * x | x^3^ | 乘法 |
| 120 - (s2 + s1 +x) = s2 * x | 120 - (x^3^ + x^2^ + x) = x^4^ | 乘法 |

#### 四、向量化(升维:将实数域转化为向量域)

前三步是最难的,之后全用snarkjs自动实现。

以优化后的第二种R1CS为例

##### 1、构建向量s

1、解为x = 3

2、s表示为一个数组。

3、s的第一个元素是1,表示为任意常量

4、s = [1, output, input1, input2,...inputN]

5、其中output为公开的输出数据,即(1, output)就是statement。

6、其中input均为保密数据,即(input1,...inputN)就是witness。

7、所以zk-snark协议核心就是构造数据s = (statement; witness)

##### 2、获取向量中的值

1、要获取向量中的某一个值,则点乘一个布尔向量c。

2、例如:获取 s = [1, out, x, s1, s2] 的s1,则s1 = s.c = [1, out, x, s1, s2] . [0, 0, 0, 1, 0]

##### 3、构建多维向量

1、由于电路的基础是乘法门,即a*b=c,或称为U.V = W

2、对于s1 = x * x 这个乘法门,需要计算两边,用s来表达。

3、即s.w1 = s.u1 * s.v1。从实数域转化为向量域,后者包含前者。

4、s1 = s.c = [1, out, x, s1, s2] . [0, 0, 0, 1, 0] ,此时w = c = [0, 0, 0, 1, 0]

5、第一个x = s.c = [1, out, x, s1, s2] . [0, 0, 1, 0, 0] ,此时u = c = [0, 0, 1, 0, 0]

6、第二个x = s.c = [1, out, x, s1, s2] . [0, 0, 1, 0, 0] ,此时v = c = [0, 0, 1, 0, 0]

7、总结,如果将s1 = x * x 设为第一组约束的话,那么其向量为w~1~ = [0, 0, 0, 1, 0],u~1~ = [0, 0, 1, 0, 0] ,v~1~ = [0, 0, 1, 0, 0]

8、同理对于s2 = s1 * x和120 - (s2 + s1 +x) = s2 * x,分别构建一维的向量为:w~2~ = [0, 0, 0, 0, 1],u~2~ = [0, 0, 0, 1, 0] ,v~2~ = [0, 0, 1, 0, 0] ,w~3~ = [0, 1, -1, -1, -1],u~3~ = [0, 0, 0, 0, 1] ,v~3~ = [0, 0, 1, 0, 0]

##### 4、构建UVW矩阵

1、将三组约束变为一个UVW矩阵,其中:

2、W = [w~1~, w~2~, w~3~] = [[0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [0, 1, -1, -1, -1]]

3、U = [u~1~, u~2~, u~3~] = [[0, 0, 1, 0, 0], [0, 0, 0, 1, 0] , [0, 0, 0, 0, 1] ]

4、V = [v~1~, v~2~, v~3~] = [ [0, 0, 1, 0, 0] , [0, 0, 1, 0, 0] ,[0, 0, 1, 0, 0] ]

#### 五、向量与矩阵内积运算

1、将向量s与向量w~i~、u~i~、v~i~的分别多维内积计算,转化为s与矩阵UVW的内积计算。

2、即从s.w~1~ = s.u~1~ * s.v~1~,及s.w~2~ = s.u~2~ * s.v~2~, 及 s.w~3~ = s.u~3~ * s.v~3~

3、转化为:s.W = s.U * s.V

4、根据Schwartz–Zippel lemma:s.W(x) - s.U(x) * s.V(x) = 0

4、计算的目的:将WUV视为多项式的值,反求多项式的系数。

5、计算的方法:可选:拉格朗日插值法、最优:快速傅里叶变换FTT的变体:基4时分的Cooley-Tukey蝶形变化。

#### 六、多项式线性组合化

z(x)整除QAP多项式

基于电路多项式W(x),U(x), V(x)生成局部系统参数CRS2

Prover将QAP多项式、目标多项式、商多项式放置到椭圆曲线的离散对数点上,并对外暴露此公钥。

Verifier进行双线性映射,重构整除关系,验证s是否正确但不知道s。
<!-- Content_END -->

0 comments on commit 487c879

Please sign in to comment.