Skip to content

Commit

Permalink
Merge pull request #3 from luckyyang/luckyyang-patch-1
Browse files Browse the repository at this point in the history
Luckyyang patch 1
  • Loading branch information
luckyyang authored Aug 15, 2023
2 parents 375d67f + 7f84cf3 commit 1e12ef9
Show file tree
Hide file tree
Showing 8 changed files with 797 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ $$
\end{array}
$$

这个表格只有一行,因此我们可以用一个向量 $U=(0,1,1,0,0)$ 来代替,表示乘法门的左输入连接了两个变量,$x1$ 和 $x_2$。记住,所有的加法门都会被展开成多个变量的相加(或线性组合)。
这个表格只有一行,因此我们可以用一个向量 $U=(0,1,1,0,0)$ 来代替,表示乘法门的左输入连接了两个变量, $x_1$ 和 $x_2$。记住,所有的加法门都会被展开成多个变量的相加(或线性组合)。

再看看其右输入,连接了一个变量 $x_3$ 和一个常数值,等价于连接了 $x_3$ 的两倍,那么右输入的选择子矩阵可以记为

Expand Down Expand Up @@ -96,7 +96,7 @@ $$

左边运算结果为 $0$,右边运算结果为 $70$。当然,我们可以验证 $(1,3,4,0,0)$ 也是一组合法(满足电路约束)的赋值。

并不是任何一个电路都存在赋值向量。凡是存在合法的赋值向量的电路,被称为可被满足的电路。判断一个电路是否可被满足,是一个 NP-Complete 问题,即NP 困难问题。
并不是任何一个电路都存在赋值向量。凡是存在合法的赋值向量的电路,被称为可被满足的电路。判断一个电路是否可被满足,是一个 NP-Complete 问题,也是一个 NP 困难问题。

这里例子中的两个乘法门并不相同,上面的乘法门是左右输入中都含有变量,而下面的乘法门只有一边的输入为变量,另一边为常数。对于后者这类「常数乘法门」,后续我们也把他们看作为特殊的「加法门」,如下图所示,左边电路右下的乘法门等价于右边电路的右下加法门。

Expand Down Expand Up @@ -364,7 +364,7 @@ $$

这正好是三个算术门的计算约束。

总结下,Plonkish 需要一个矩阵 $Q$ 来描述电路空白态,而所有的赋值则写入了 $W$ 矩阵。对于 Prover 和 Verifier 的交换协议,$W$ 是 Prover 的 witness,属于秘密知识,对 Verifier 保密, $Q$ 矩阵代表了一个实现双方约定共识的电路描述。
总结下,Plonkish 需要一个矩阵 $Q$ 来描述电路空白态,而所有的赋值则写入了 $W$ 矩阵。对于 Prover 和 Verifier 的交换协议, $W$ 是 Prover 的 witness,属于秘密知识,对 Verifier 保密, $Q$ 矩阵代表了一个实现双方约定共识的电路描述。

不过仅仅有 $Q$ 矩阵是不足以精确描述上面的例子电路。

Expand All @@ -388,7 +388,7 @@ $$

我们需要增加新的约束,强制要求右边电路图中 $x_6=x_7$ 和 $x_5=x_8$。这等价于我们要求 Prover 把同一个变量填入表格多个位置时,**必须填入相等的值**

这就需要一类新的约束——「拷贝约束」,即 Copy Contraint。Plonk 采用「置换证明」保证 $W$ 表格中多个位置上的值满足拷贝关系。我们继续用上面这个电路图的案例来说明其基本思路:
这就需要一类新的约束——「拷贝约束」,即 Copy Constraint。Plonk 采用「置换证明」保证 $W$ 表格中多个位置上的值满足拷贝关系。我们继续用上面这个电路图的案例来说明其基本思路:

设想我们把 $W$ 表格中的所有位置索引排成一个向量:

Expand Down Expand Up @@ -418,7 +418,7 @@ $$

在经过置换的向量 $A'$ 中, $a_1, a_2, a_3$ 依次右移交换,即 $a_1$ 放到了原来 $a_2$ 的位置,而 $a_2$ 放到了 $a_3$ 的位置, $a_3$ 则放到了 $a_1$ 的位置。

如果 $A'=A$ ,那么 $A'$ 和 $A$ 所有对应位置上的值都应该相等,可得: $a_1=a_4$, $a_2=a_1$, $a_3=a_2$,即 $a_1=a_2=a_3$。这个方法可以适用于任意数量的等价关系。(后续证明两个向量相等的方法请见下章)
如果 $A'=A$ ,那么 $A'$ 和 $A$ 所有对应位置上的值都应该相等,可得: $a_1=a_3$, $a_2=a_1$, $a_3=a_2$,即 $a_1=a_2=a_3$。这个方法可以适用于任意数量的等价关系。(后续证明两个向量相等的方法请见下章)

那么如何描述电路赋值表格中的交换呢?我们只需要记录 $\sigma$ 向量即可,当然 $\sigma$ 向量也可以写成表格的形式:

Expand Down Expand Up @@ -512,7 +512,7 @@ $$
协议验证阶段:Verifier 与 Prover 通过进一步的交互,验证下面的等式是否成立:

$$
q_{L}(X) \circ w_{a}(X) + q_{R}(X) \circ w_{b}(X) + q_{M}(X)\circ(w_{a}(X)\cdot w_{b}(X)) + q_{C}(X) - q_{O}(X)\circ w_{c}(X) \overset{?}{=} 0
q_{L}(X) \cdot w_{a}(X) + q_{R}(X) \cdot w_{b}(X) + q_{M}(X)\cdot(w_{a}(X)\cdot w_{b}(X)) + q_{C}(X) - q_{O}(X)\cdot w_{c}(X) \overset{?}{=} 0
$$

当然这个验证还不够,还要验证 $(\sigma_a(X),\sigma_b(X),\sigma_c(X))$ 与 $(w_a(X),w_b(X),w_c(X))$ 之间的关系。还有,Verifier 如何通过多项式来验证电路的运算,请看后续章节。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ $$
\mathbb{F}_{13}=(0,1,2,3,4,5,6,7,8,9,10,11,12)
$$

其中乘法群的生成元为 $g=2$。由于 $13-1=3*2*2$,所以存在一个阶数为 $4$ 的乘法子群,其生成元为 $\omega=5$:
其中乘法群的生成元为 $g=2$。由于 $13-1=3\*2\*2$,所以存在一个阶数为 $4$ 的乘法子群,其生成元为 $\omega=5$:

$$
H=(\omega^0=1,\omega^1=5,\omega^2=12,\omega^3=8)
Expand Down Expand Up @@ -177,7 +177,7 @@ $$

利用 Lagrange Basis 我们可以方便地对各种向量计算进行约束。

比如我们想约束 $\vec{a}=(h,a_1,a_2,\ldots,a_{N-1})$ 向量的第一个元素为 $h$。那么我们可以这个向量进行编码,得到 $a(X)$,并且进行如下约束:
比如我们想约束 $\vec{a}=(h,a_1,a_2,\ldots,a_{N-1})$ 向量的第一个元素为 $h$。那么我们可以对这个向量进行编码,得到 $a(X)$,并且进行如下约束:

$$
L_0(X)(a(X)-h) = 0, \quad \forall X\in H
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ $$

## 从 Grand Product 到 Multiset 等价

假设有两个向量,其中一个向量是另一个向量的乱序重排,那么如何证明它们在集合意义(注意:集合无序)上的等价呢?最直接的做法是依次枚举其中一个向量中的每个元素,并证明该元素属于另一个向量。但这个方法有个限制,就是无法处理向量会中出现两个相同元素的情况,也即不支持「多重集合」(Multiset)的判等。例如 $\\{1,1,2\\}$ 就属于一个多重集合(Multiset),那么它显然不等于 $\\{1, 2, 2\\}$,也不等于 $\\{2,1\\}$。
假设有两个向量,其中一个向量是另一个向量的乱序重排,那么如何证明它们在集合意义(注意:集合无序)上的等价呢?最直接的做法是依次枚举其中一个向量中的每个元素,并证明该元素属于另一个向量。但这个方法有个限制,就是无法处理向量中会出现两个相同元素的情况,也即不支持「多重集合」(Multiset)的判等。例如 $\\{1,1,2\\}$ 就属于一个多重集合(Multiset),那么它显然不等于 $\\{1, 2, 2\\}$,也不等于 $\\{2,1\\}$。

另一个直接的想法是将两个向量中的所有元素都连乘起来,然后判断两个向量的连乘值是否相等。但这个方法同样有一个严重的限制,就是向量元素必须都为素数,比如 $3\cdot6=9\cdot2$ ,但 $\\{3,6\\}\neq\\{9,2\\}$。

Expand Down Expand Up @@ -217,7 +217,7 @@ a_{n-1} & n-1 & b_{n-1}=a_{n} & n \\
\end{array}
$$

接下来,我们要把上表的左边两列,还有右边两列分别「折叠」在一起。换句话说,我们把 $(a_i, i)$ 视为一列元素,把 $(b_i, \sigma(i))$ 视为一个元素,这样上面表格就变成了:
接下来,我们要把上表的左边两列,还有右边两列分别「折叠」在一起。换句话说,我们把 $(a_i, i)$ 视为一个元素,把 $(b_i, \sigma(i))$ 视为一个元素,这样上面表格就变成了:

<!-- hack for buggy mathjax on github -->

Expand Down Expand Up @@ -257,16 +257,17 @@ $$

## 完整的置换协议

公共输入:置换关系 $\sigma$
公共输入:置换关系 $\sigma$

秘密输入:两个向量 $\vec{a}$ 与 $\vec{b}$
秘密输入:两个向量 $\vec{a}$ 与 $\vec{b}$

预处理:Prover 和 Verifier 构造 $id(X)$ 与 $\sigma(X)$,
第一步:Prover 构造并发送 $[a(X)]$ 与 $[b(X)]$,
预处理:Prover 和 Verifier 构造 $[id(X)]$ 与 $[\sigma(X)]$

第二步:Verifier 发送挑战数 $\beta$ 与 $\gamma$,
第一步:Prover 构造并发送 $[a(X)]$ 与 $[b(X)]$

第三步:Prover 构造辅助向量 $\vec{z}$,
第二步:Verifier 发送挑战数 $\beta$ 与 $\gamma$

第三步:Prover 构造辅助向量 $\vec{z}$,构造多项式 $z(X)$ 并发送 $[z(X)]$

$$
\begin{split}
Expand All @@ -275,9 +276,7 @@ z_{i+1} &= z_i\cdot \frac{a_i+\beta\cdot i + \gamma}{b_i+\beta\cdot \sigma(i) +
\end{split}
$$

构造多项式 $z(X)$ 并发送 $[z(X)]$;

第四步:Verifier 发送挑战数 $\alpha$;
第四步:Verifier 发送挑战数 $\alpha$

第五步:Prover 构造 $f(X)$ 与 $q(X)$,并发送 $[q(X)]$

Expand All @@ -289,7 +288,7 @@ $$
q(X) = \frac{f(X)}{z_H(X)}
$$

第四步:Verifier 向 $[a(X)],[b(X)],[z(X)]$ 查询 发送 $\zeta$,得到 $a(\zeta)$, $b(\zeta)$, $z(\zeta)$, $id(\zeta)$ 与 $\sigma(\omega\cdot \zeta)$, $q(\zeta)$,计算 $z_H(\zeta)$, $L_0(\zeta)$$\sigma(\zeta)$ 与 $id(\zeta)$
第六步:Verifier 向 $[a(X)],[b(X)],[q(X)]$ 查询这三个多项式在 $X=\zeta$ 处的取值 ,得到 $a(\zeta)$, $b(\zeta)$, $q(\zeta)$;向 $[z(X)]$ 查询 $X=\zeta, X=\omega\cdot\zeta$ 两个位置处的取值,即 $z(\zeta), z(\omega\cdot\zeta)$;向 $[\sigma(X)]$ 与 $[id(X)]$ 这两个多项式发送求值查询 $X=\zeta$ ,得到 $id(\zeta)$$\sigma(\zeta)$;Verifier 自行计算 $z_H(\zeta)$, $L_0(\zeta)$

验证步:Verifier 验证

Expand All @@ -303,4 +302,4 @@ $$

- [WIP] Copy constraint for arbitrary number of wires. https://hackmd.io/CfFCbA0TTJ6X08vHg0-9_g
- Alin Tomescu. Feist-Khovratovich technique for computing KZG proofs fast. https://alinush.github.io/2021/06/17/Feist-Khovratovich-technique-for-computing-KZG-proofs-fast.html#fn:FK20
- Ariel Gabizon. Multiset checks in PLONK and Plookup. https://hackmd.io/@arielg/ByFgSDA7D
- Ariel Gabizon. Multiset checks in PLONK and Plookup. https://hackmd.io/@arielg/ByFgSDA7D
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ $$

如果在 Prover 承诺多项式之后,Verifier 可以根据这个承诺,对被锁定的多项式进行求值,并希望 Prover 可以证明求值的正确性。假设 $C=Commit(f(X))$,Verifier 可以向提供承诺的 Prover 询问多项式在 $X=\zeta$ 处的取值。Prover 除了回复一个计算结果之外(如 $f(\zeta) = y$) ,还能提供一个证明 $\pi$,证明 $C$ 所对应的多项式 $f(X)$ 在 $X=\zeta$ 处的取值 $y$ 的正确性。

多项式承诺的这个「携带证明的求值」特性非常有用,它可以被看成是一种轻量级的「可验证计算」。即 Verifier 需要把多项式 $f(X)$ 的运算代理给一个远程的机器(Prover),然后验证计算(计算量要小于直接计算$f(X)$)结果 $y$ 的正确性;多项式承诺还能用来证明秘密数据(来自Prover)的性质,比如满足某个多项式,Prover 可以在不泄漏隐私的情况下向 Verifier 证明这个性质。
多项式承诺的这个「携带证明的求值」特性非常有用,它可以被看成是一种轻量级的「可验证计算」。即 Verifier 需要把多项式 $f(X)$ 的运算代理给一个远程的机器(Prover),然后验证计算(计算量要小于直接计算 $f(X)$)结果 $y$ 的正确性;多项式承诺还能用来证明秘密数据(来自Prover)的性质,比如满足某个多项式,Prover 可以在不泄漏隐私的情况下向 Verifier 证明这个性质。

虽然这种可验证计算只是局限在多项式运算上,而非通用计算。但通用计算可以通过各种方式转换成多项式计算,从而依托多项式承诺来最终实现通用的可验证计算。

Expand Down Expand Up @@ -89,7 +89,7 @@ $$
而 Prover 则可以提供 $q(X)$ 多项式的承诺,记为 $C_q$,作为 $f(\zeta)=y$ 的证明,Verifier 可以检查 $[q(\chi)]$ 是否满足整除性来验证证明。因为如果 $f(\zeta)\neq y$,那么 $g(X)$ 则无法被 $(X-\zeta)$ 整除,即使 Prover 提供的承诺将无法通过整除性检查:

$$
(f(X)-y)\cdot 1 \overset{?}{=} q(X) \cdot (X-x)
(f(X)-y)\cdot 1 \overset{?}{=} q(X) \cdot (X-\zeta)
$$

承诺 $C_{f(X)}$ 是群 $\mathbb{G}_1$ 上的一个元素,通过承诺的加法同态映射关系,以及双线性映射关系 $e\in \mathbb{G}_1\times\mathbb{G}_2\to \mathbb{G}_T$,Verifier 可以在 $\mathbb{G}_T$ 上验证整除性关系:
Expand All @@ -105,7 +105,7 @@ f(X) + \zeta\cdot q(X) - y = q(X)\cdot X
$$

$$
e(C\_{f(X)} + \zeta\cdot C\_{q(X)} -y, [1]_2)\overset{?}{=} e(C\_{q(X)}, [\chi]_2)
e(C\_{f(X)} + \zeta\cdot C\_{q(X)} -y\cdot[1]_1,\ [1]_2)\overset{?}{=} e(C\_{q(X)},\ [\chi]_2)
$$

## 同点 Open 的证明聚合
Expand Down
19 changes: 19 additions & 0 deletions plonk-intro-cn/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# 理解 Plonk 协议

一个简单的 Plonk 协议入门教程,请大家留下宝贵意见。

- [(一)计算的算术化](plonk-arithmetization.md)
- [(二)拉格朗日插值](plonk-lagrange-basis.md)
- [(三)置换证明](plonk-permutation.md)
- [(四)算术约束与拷贝约束](plonk-constraints.md)
- [(五)多项式承诺](plonk-polycom.md)
- [(六)实现零知识](plonk-randomizing.md)
- [(七)查表约束](plonk-lookup.md)


**感谢**:内容源于 Antalpha-Hackhouse@ChiangMai 的讨论,还有 [@Antalpha-Labs](https://github.com/Antalpha-Labs/zkp-co-learn) 共学课程讨论。

**其他贡献者**
- [even](https://github.com/10to4)
- [@luckyyang](https://github.com/luckyyang)
- [@Chris-Howard](https://www.github.com/Chris-Howard)
6 changes: 3 additions & 3 deletions plonk-intro-cn/plonk-constraints.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,10 +167,10 @@ $$
z_{N} = z_0 = 1
$$

而又因为 $\omega^{N} = \omega^1$ 。这恰好使我们可以把 $(z_0, z_1, z_2, \ldots, z_{N-1})$ 完整地编码在乘法子群 $H$ 上。因此如果它满足下面两个多项式约束,我们就能根据数学归纳法得出 $z_{N} = 1$,这是我们最终想要的「拷贝约束」:
而又因为 $\omega^{N} = 1$ 。这恰好使我们可以把 $(z_0, z_1, z_2, \ldots, z_{N-1})$ 完整地编码在乘法子群 $H$ 上。因此如果它满足下面两个多项式约束,我们就能根据数学归纳法得出 $z_{N} = 1$,这是我们最终想要的「拷贝约束」:

$$
z(\omega) = 1
z(\omega^0) = 1
$$

$$
Expand Down Expand Up @@ -325,4 +325,4 @@ $$
\end{split}
$$

## 参考文献
## 参考文献
Loading

0 comments on commit 1e12ef9

Please sign in to comment.