本系列专题将基于@郭宇老师的视频、讲义及相关论文,系统梳理一下PlonkSNARK的各个组件,尽量做到代码级地剖析深度。预期将涵盖以下几个章节:PlonkIOP协议实现zerokownledge实现Non-Interactivelookup特性Thanks感谢@郭宇老师
本系列专题将基于@郭宇 老师的视频、讲义及相关论文,系统梳理一下Plonk SNARK的各个组件,尽量做到代码级地剖析深度。「如果让我实现一个plonk zkp该如何做」以这样一个角度去看的话,预期将涵盖以下几个章节:
R1CS 只有乘法gate,也就是说只有乘法才占用一个约束,加法操作不占用约束;与R1CS不同的是,Plonk 电路加法和乘法gate都会占用一个约束 <br />
plonk 采用的PCS 方案是kzg10,是一种trust setup 的模式,需要大概了解它与pairing 的勾迹关系 <br />
Lagrange 插值法可以把一个scalar 向量以evaluation的形式编码成一个多项式 <br />
对composite 连乘多项式或者说非线性化多项式进行commit 是一个困难问题,很难满足每个sub-polynomial 的binding 特性 <br />
Vanishing Polynomial 根据Roots of unity 特性很容易算出来,对于Verifier 来说是公开的信息 <br />
Quotient Polynomail Prover借助Vanishing Polynomial 也很容易算出来,对于Verifier 来说是未知的信息,需要进行commit
我们要detail的电路结构图如:
<br />
电路gate evaluation 矩阵:
$$ \def\arraystretch{1.5}
\begin{array}{c:c:c:c}
\text{i} & w_a & w_b & w_c \ \hline 0 & \textcolor{red} {x_6} & \textcolor{blue} {x_5} & \textcolor{green} {out} \ \hdashline 1 & x_1 & x_2 & \textcolor{red} {x_6} \ \hdashline 2 & x_3 & x_4 & \textcolor{blue} {x_5} \ \hdashline \end{array} $$
<br />
一个完整的电路描述由三个矩阵来实现。其中,gate 的描述矩阵Q:
$$ \def\arraystretch{1.5}
\begin{array}{c:c:c:c:c}
q_L & q_R & q_M & q_C & q_O \ \hline
0 & 0 & 1 & 0 & 1 \ \hdashline
1 & 1 & 0 & 0 & 1 \ \hdashline
0 & 0 & 1 & 0 & 1 \ \hdashline
\end{array} $$
<br />
gate id的编码矩阵:
$$ \def\arraystretch{1.5}
\begin{array}{c:c:c:c}
i & id_a & id_b & id_c \ \hline
0 & \textcolor{red} {w^0} & \textcolor{blue} {k w^0} & k^2 w^0 \ \hdashline
1 & w^1 & k w^1 & \textcolor{red} {k^2 w^1} \ \hdashline
2 & w^2 & k w^1 & \textcolor{blue} {k^2 w^2} \ \hdashline
\end{array} $$
<br />
wiring 的描述矩阵:
$$ \def\arraystretch{1.5}
\begin{array}{c:c:c:c}
i & \sigma_a & \sigma_b & \sigma_c \ \hline
0 & \textcolor{red} {k^2 w^1} & \textcolor{blue} {k^2 w^2} & k^2 * w^0 \ \hdashline
1 & w^1 & k * w^1 & \textcolor{red} {w^0} \ \hdashline
2 & w^2 & k w^1 & \textcolor{blue} {k w^0} \ \hdashline
\end{array} $$
<br />
鉴于gate 的个数或者constrain 实例的个数为3,多项式编码用的循环乘法子群$H$ 就简化为:
$$ H = (w^0, w^1, w^2) $$ <br />
为了保证wiring 的约束能够顺利进行,gate evaluation 矩阵的三列必须统一编码,为了三列之间不会出现重合的编码,gate id 的编码如下:
$$ \begin{aligned}
id_a &= H = (w^0, w^1, w^2) \
id_b &= k H = (k w^0, k w^1, k w^2) \
id _c &= k^2 H = (k^2 w^0, k^2 w^1, k^2 w^2) \
\end{aligned} $$
<br />
基于gate id 矩阵的三组编码,通过插值的方式,为每列生成相应的多项式:
$$ w_a(X) : H_a \longrightarrow w_a \
w_b(X): H_b \longrightarrow w_b \
w_c(X): H_c \longrightarrow w_c \ $$ <br />
基于$H$ 通过插值的方式,为每列生成相应的多项式:
$$ q_L(X): H \longrightarrow q_L \
q_R(X): H \longrightarrow q_R \
q_M(X): H \longrightarrow q_M \
q_C(X): H \longrightarrow q_C\
q_O(X): H \longrightarrow q_O \ $$ <br />
基于gate id 矩阵的三组编码,通过插值的方式,为每列生成相应的多项式:
$$ \sigma_a(X): H_a \longrightarrow \sigma_a \
\sigma_b(X): H_b \longrightarrow \sigma_b \
\sigma_c(X): H_c \longrightarrow \sigma_c \ $$ <br />
Prover 为了向Verifier 证明它的gate evaluation 矩阵填写的是合法的,需要提供两方面的proof 或者约束。其一,是否满足gate的运算规则;其二,gate的关联或者说wiring 是否合法。 <br />
$$ q_L(X) w_a(X) + q_R(X) w_b(k X) + q_M(X) (w_a(X) w_b(k X)) \
便于理解,实例化之后展开变成三个约束:
$$ 1 (x_6 x_5) - 1 * out = 0 \
1 x_1 + 1 x_2 - 1 * x_6 = 0 \
1 (x_3 x_4) - 1 * x_5 = 0 \ $$ <br />
$$ \begin{aligned} \prod_{X \in H}
&\frac{(w_a(X) + \beta id_a(X) + \gamma)} {(w_a(X) + \beta \sigma_a(X) + \gamma)} \
& \frac{(w_b(k X) + \beta id_b(k X) + \gamma)} {(w_b(k X) + \beta \sigma_b(k * X) + \gamma)} \
& \frac{(w_c(k^2 X) + \beta id_c(k^2 X) + \gamma)} {(w_c(k^2 X) + \beta \sigma_c(k^2 * X) + \gamma)} \
&= 1
\end{aligned} $$
<br /> 便于理解,实例化之后展开:
$$ \begin{aligned}
&[ \textcolor{red} {\frac{(x_6 + \beta w^0 + \gamma)}{(x^6 + \beta (k^2 * w^1) + \gamma)}}
\textcolor{blue} {\frac{(x_5 + \beta (k w^0) + \gamma)}{(x^5 + \beta (k^2 w^2) + \gamma)}}
\frac{(out + \beta (k^2 w^0) + \gamma)}{(out + \beta (k^2 w^0) + \gamma)} ] \
\ & *
[ \frac{(x_1 + \beta w^1 + \gamma)}{(x_1 + \beta w^1 + \gamma)}
\frac{(x_2 + \beta (k w^1) + \gamma)}{(x_2 + \beta (k w^1) + \gamma)}
\textcolor{red} {\frac{(x_6 + \beta (k^2 w^1) + \gamma)}{(x_6 + \beta * w^0 + \gamma)}} ] \
\ & *
[ \frac{(x_3 + \beta w^2 + \gamma)}{(x_3 + \beta w^2 + \gamma)}
\frac{(x_4 + \beta (k w^2) + \gamma)}{(x_4 + \beta (k w^2) + \gamma)}
\textcolor{blue} {\frac{(x_5 + \beta (k^2 w^2) + \gamma)}{(x_5 + \beta (k w^0) + \gamma)}} ] \
\ &= 1
\end{aligned} $$
<br /> 简化一下:
$$
\prod_{X \in H}\frac{f(X)}{g(X)} = 1
\textcolor{red} {\Longleftarrow}
\begin{cases} \begin{aligned}
f(X) &= (w_a(X) + \beta * id_a(X) + \gamma) \
& (w_b(X) + \beta id_b(k * X) + \gamma) \
& (w_c(X) + \beta id_c(X) + \gamma), X \in H \
\
g(X) &= (w_a(X) + \beta * \sigma_a(X) + \gamma) \
& (w_b(X) + \beta \sigma_b(k * X) + \gamma) \
& (w_c(X) + \beta \sigma_c(X) + \gamma), X \in H\
\end{aligned} \ \end{cases} $$
<br />
连乘的trace 过程我们用一个中间向量$z_i$ 来表示:
$$ \def\arraystretch{1.5}
\begin{array}{c:c:c:c}
i & X & \frac{f(X)}{g(X)}& z_i \ \hline
0 & w^0 &
\textcolor{red} {\frac{(x_6 + \beta w^0 + \gamma)}{(x^6 + \beta (k^2 * w^1) + \gamma)}}
\textcolor{blue} {\frac{(x_5 + \beta (k w^0) + \gamma)}{(x^5 + \beta (k^2 w^2) + \gamma)}}
\frac{(out + \beta (k^2 w^0) + \gamma)}{(out + \beta (k^2 w^0) + \gamma)}
& 1 \ \hdashline
1 & w^1 &
\frac{(x_1 + \beta w^1 + \gamma)}{(x_1 + \beta w^1 + \gamma)}
\frac{(x_2 + \beta (k w^1) + \gamma)}{(x_2 + \beta (k w^1) + \gamma)}
\textcolor{red} {\frac{(x_6 + \beta (k^2 w^1) + \gamma)}{(x_6 + \beta * w^0 + \gamma)}}
& 1 \frac{f(w^0)}{g(w^0)} = \textcolor{red} {\frac{(x_6 + \beta w^0 + \gamma)}{(x^6 + \beta (k^2 w^1) + \gamma)}}
\textcolor{blue} {\frac{(x_5 + \beta (k w^0) + \gamma)}{(x^5 + \beta (k^2 w^2) + \gamma)}}
\frac{(out + \beta (k^2 w^0) + \gamma)}{(out + \beta (k^2 w^0) + \gamma)} \ \hdashline
2 & w^2 &
\frac{(x_3 + \beta w^2 + \gamma)}{(x_3 + \beta w^2 + \gamma)}
\frac{(x_4 + \beta (k w^2) + \gamma)}{(x_4 + \beta (k w^2) + \gamma)}
\textcolor{blue} {\frac{(x_5 + \beta (k^2 w^2) + \gamma)}{(x_5 + \beta (k w^0) + \gamma)}}
& 1 \frac{f(w^0)}{g(w^0)} \frac{f(w^1)}{g(w^1)} = \textcolor{blue} {\frac{(x_5 + \beta (k w^0) + \gamma)}{(x^5 + \beta (k^2 w^2) + \gamma)}} \ \hdashline
3 & w^3 = w^0 & - & 1 \frac{f(w^0)}{g(w^0)} \frac{f(w^1)}{g(w^1)} * \frac{f(w^2)}{g(w^2)} = 1
\end{array} $$
<br />
同样,我们通过$H $把向量 $z_i $进行多项式编码,只要满足两条件:
$$ \begin{aligned}
z_0 &= z(w^0) = 1 \textcolor{red} {\Leftrightarrow} L_0(X)(z(X) - 1) = 0 \
z_{i + 1} &= z_i \frac{f_i}{g_i} \textcolor{red} {\Leftrightarrow} z(w X) g(X) - z(X) f(X) = 0 \in H \
\end{aligned} $$
就一定可以推导出$z_3 = 1 \frac{f(w^0)}{g(w^0)} \frac{f(w^1)}{g(w^1)} * \frac{f(w^2)}{g(w^2)} = 1$,也就是说wiring 是合法的。
<br />
gate 运算规则有一条约束,wiring 规则有两条约束,现在通过一个challenge factor 把它们整合起来:
$$ \begin{aligned}
&q_L(X) w_a(X) + q_R(X) w_b(k X) + q_M(X) (w_a(X) w_b(k X)) \ &+ q_C(X) - q_O(X) w_c(k^2 X) \
\
&+ \alpha * (L_0(X)(z(X) - 1)) \
\
&+ \alpha^2 (z(w X) g(X) - z(X) f(X)) \
& = 0, X \in H \
&= t(X) * z_H(X), X \in F \
\end{aligned} $$
<br />
简化一下:
$$ \begin{aligned}
h(X) &= q_L(X) w_a(X) + q_R(X) w_b(k X) + q_M(X) (w_a(X) w_b(k X)) \ &+ q_C(X) - q_O(X) w_c(k^2 X) \
\
&+ \alpha * (L_0(X)(z(X) - 1)) \
\
&+ \alpha^2 (z(w X) g(X) - z(X) f(X)) \
\textcolor{red} {\Downarrow} \ h(X) &= t(X) * z_H(X), X \in \mathbb{F} \
\end{aligned} $$
所以,整个电路的验证对象就变成上面这一个等式了。 <br />
最终我们需要验证:
$$ t(X) * z_H(X) = h(X) $$
有多种解决方案:其一,直接通过pairing 的方式来验证:
$$ e([t(X)]_1, [z_H(X)]_2) = e([h(X)]_1, [1]_2) $$
其中$[t(X)]_1$ 和 $[h(X)]_1$ 可以直接拿到,但$z_H(X)_2$不一定,所以还有另外一种方案。
<br />
其二,鉴于Verifier 可以自行计算$z_H(X)$,为了验证上面这个等式成立,最intuitive 的方式是,Verifier 向 Prover 发送一个challenge factor $ξ$或者一个opening,Prover 把$t(X) $和$ h(X)$ 在opening $ξ $上的evaluation 值回传过来。那如何保证两个evaluation 的正确性?需要Prover 分别提供相应的proof,便于Verfier 验证,所以,分两步进行。
<br />
第一步:验证evaluation 的正确性
$$ t(\xi) = K_t \
\Longrightarrow t(X) - K_t = q_t(X)(X - \xi) \
h(\xi) = K_h \
\Longrightarrow h(X) - K_h = q_h(X)(X - \xi) \ $$ <br />
引入challenge factor $ν$ 我们可以把这两个等式fold 在一起:
$$ (t(X) - K_t) + \nu (h(X) - K_h) = (X - \xi) (q_t(X) + \nu * q_h(X)) \
\Updownarrow \
(t(X) + \nu h(X)) - (K_t + \nu K_h) = (X - \xi) (q_t(X) + \nu q_h(X)) $$
<br />
然后再通过pairing 来进行验证,Prover 需要提供$[t(X)]_1、[h(X)]_1、[q_t(X)]_1、[q_h(X)]_1$:
$$ e([(t(X) + \nu h(X)) - (K_t + \nu K_h)]_1, [1]_2) = e([q_t(X) + \nu * q_h(X)]_1, [X - \xi]_2) \
\Updownarrow \
e([t(X)]_1 + v[h(X)]_1 - [K_t + \nu K_h]_1, [1]_2) = e([q_t(X)]_1 + \nu [q_h(X)]_1, [X]_2 - [\xi]_2 ) $$ <br />
第二步:验证目标等式的成立
鉴于Vanishing Polynomial 的evaluation $z_H(\xi)$ Verifier 可以自行解决,在上面两个多项式在同一个opening 上的evaluation验证通过的情况下,Verifier 才能拿着两个多项式的evaluation 值 $K_t、K_h$ 去验证最开始的等式是否成立:
$$ t(\xi) * z_H(\xi) \textcolor{red} {\overset{?} =} h(\xi) \
\Updownarrow \
K_t * z_H(\xi) \textcolor{red} {\overset{?} =} K_h \ $$ <br />
$$ \boxed{h(X) = t(X) * z_H(X)} \textcolor{red} {\Longleftarrow}
\begin{cases}
\begin{aligned}
f(X) &= (w_a(X) + \beta * id_a(X) + \gamma) \
& (w_b(k X) + \beta id_b(k * X) + \gamma) \
& (w_c(k^2 X) + \beta id_c(k^2 X) + \gamma) \
\
g(X) &= (w_a(X) + \beta * \sigma_a(X) + \gamma) \
& (w_b(k X) + \beta \sigma_b(k * X) + \gamma) \
& (w_c(k^2 X) + \beta \sigma_c(k^2 X) + \gamma) \
\
h(X) &= q_L(X) w_a(X) + q_R(X) w_b(k X) + q_M(X) (w_a(X) w_b(k X)) \
&+ q_C(X) - q_O(X) * w_c(k^2 X) \
&+ \alpha (L_0(X)(z(X) - 1)) \ &+ \alpha^2 (z(w X) g(X) - z(X) f(X)) \
\
z_H(X) &= X^N - 1 \
\end{aligned}
\end{cases} $$
<br />
为了验证左右方框中的等式成立之前,需要验证$h(X)$ 与$t(X)$ 在opening$ ξ$ 上的evaluation $K_h=h(ξ)$ 与$ K_t=t(ξ)$ 是否正确,为此Prover需要提供四个commitment$ [t(X)]_1、[h(X)]_1、[qt(X)]_1、[qh(X)]_1$。我们深入分析一下Prover 是如何一步一步完成的:
$t(X)$ 首先面临的一个问题是,多项式阶数过高。多项式$f(X)$ 阶数为3N,$z(X)$ 的阶数为N,因此$h(X)$ 的阶数为4N,而$z_H(X)$ 阶数又为N,最后拿到的 $t(X)$ 阶数为3N。如果直接对多项式$t(X)$ 进行commit,必然会加大 SRS 的长度,增大成本。这里我们把多项式$t(X)$ 一分为三,拆分成三个长度为N的多项式,分别用SRS进行commit,SRS的长度不变:
$$ t(X) = t{low}(X) + X^N * t{mid}(X) + X^{2N} * t_{high}(X) $$ <br />
最后Verifier 拿到的是三个多项式的commitment$[t_{low}(X)]1、[t{mid}(X)]1、[t{high}(X)]_1$,整合一下就是:
$$ [t(X)]1 = [t{low}(X)]1 + X^N * [t{mid}(X)]1 + X^{2N} * [t{high}(X)]_1 $$ <br />
如何证明$t(ξ)=K_t$?仍然用pairing的方式来解决:
$$ t(X) - K_t = q_t(X)(X - \xi) \
e([t(X)]_1 - [K_t]_1, [1]2) = e(\pi{t(\tau)}, [X]_2 - [\xi]_2) $$
<br />
完成evaluation 的证明之后,$K_t$ 就可以正式拿来用了。因为Verifier $z_H(ξ)$ 可以自行算出来,所以我们只需要验证:
$$ h(\xi) = K_t * z_H(\xi) $$
<br />
如何证明$ h(ξ)=K_t∗z_H(ξ)$?可以直接用pairing 的方式来解决吗?
$$ \begin{aligned}
h(X) &= q_L(X) w_a(X) + q_R(X) w_b(k X) + q_M(X) (w_a(X) w_b(k X)) + q_C(X) - q_O(X) * w_c(k^2 X) \
&+ \alpha (L_0(X)(z(X) - 1)) \ &+ \textcolor{red} {\alpha^2 (z(w X) g(X) - z(X) f(X))} \
\end{aligned} $$
不行,因为$h(X)$ 多项式过于复杂,是一种composite 多项式的乘法,对它进行commit是很困难的。可以仔细观察一下式子中每个item,会发现最后一个item 中$z(X)$ 是一个阶数为N的多项式,$f(X)$ 是由三个阶数为N的多项式的连乘。怎么办?我们先把问题简化一下
<br />
简化一下问题,假定有这么一个等式需要证明,三个等式对于Verifier 都是未知的:
$$ a(X) * b(X) = c(X) $$ <br />
最intuitive 的思路是,Verfier 发送challenge factor 或者 opening$ ξ$ 给Prover,Prover 提供三个多项式的evaluation 值$K_a、K_b、K_c$,但如何保证这些evaluation 是正确的,需要额外提供proof,Verfier 拿到这些proof 后先验证evaluation 是否正确,再代入上面的等式去验证:
$$ \begin{aligned}
a(\xi) = K_a &\Longrightarrow a(X) - K_a = q_a(X) * (X - \xi) \
&\Longrightarrow e([a(X)]_1 - [K_a]_1, [1]2) = e(\pi{a(X)}, [X]_2 - [\xi]_2) \
\
b(\xi) = K_b &\Longrightarrow b(X) - K_b = q_b(X) * (X - \xi) \
&\Longrightarrow e([b(X)]_1 - [K_b]_1, [1]2) = e(\pi{b(X)}, [X]_2 - [\xi]_2) \
\
c(\xi) = K_c &\Longrightarrow c(X) - K_c = q_c(X) * (X - \xi) \
&\Longrightarrow e([c(X)]_1 - [K_c]_1, [1]2) = e(\pi{c(X)}, [X]_2 - [\xi]_2) \
\end{aligned} $$
<br />
为了进一步简化问题,我们假定$c(ξ)$ 已知了,只需要 $a(ξ)∗b(ξ)=K_c$ 的正确性,直观上看Prover 分别提供两个多项式的commitment $[a(X)]_1、[b(X)]1$ 和 evaluation的对应的proof $π{a(X)}、π_{b(X)}$,避免误解,这里的两个proof简单展开一下,其实就是两个quotient polynomial 的commitment:
$$ q_a(X) = \frac{a(X) - va}{X - \xi} \Longrightarrow \pi{a(X)} = [q_a(X)]_1 \
q_b(X) = \frac{b(X) - vb}{X - \xi} \Longrightarrow \pi{b(X)} = [q_b(X)]_1 \ $$
<br />
这里一共打开了两个opening,Verifier 需要做两次evaluation的验证,其实只需要打开一次opening就够了。比如只打开$ a(ξ)=K_a$ ,这个evaluation 验证通过之后,接下来需要验证:
$$ K_a * b(X) = K_c \
\Updownarrow \
L(\xi) = K_a * b(\xi) - K_c = 0 $$ <br />
这是一个线性的多项式,直接用pairing 来验证就可以了:
$$ L(X) - 0 = q_L(X) * (X - \xi) \
\Updownarrow \
e([L(X)]_1, [1]2) = e(\pi{L(X)}, [X]_2 - [\xi]_2) \
\Updownarrow \
e(K_a [b(X)]_1 - [K_c]_1, [1]2) = e(\pi{L(X)}, [X]_2 - [\xi]_2) \ $$ <br />
需要Prover 提供$b(X)$的commitment$ [b(X)]1$ 和 evaluation 的proof $π{L(X)}$。到这里,这么一个含composite 多项式等式的验证过程就完成了。关于这里的优化技巧有个专业名词,线性化。
再回到我们的主题:
$$ \begin{aligned}
h(X) &= q_L(X) w_a(X) + q_R(X) w_b(k X) + q_M(X) (w_a(X) w_b(k X)) + q_C(X) - q_O(X) * w_c(k^2 X) \
\
&+ \alpha * (L_0(X)(z(X) - 1)) \
\
&+ \alpha^2 (z(w X) g(X) - z(X) * f(X)) \
\end{aligned} $$ <br />
同样参照多项式线性化的思路,为了验证 $h(ξ)=K_t∗z_H(ξ)$,Verifier 没有必要把$h(X)$ 中的每个多项式都打开,然后对每个多项式的evaluation都验证一遍,其实只需要打开部分多项式,保证打开之后的多项式$h(X)′$ 是一个线性多项式就行:
$$ \begin{aligned}
h(X) &= q_L(X) \textcolor{red} {w_a(X)} + q_R(X) \textcolor{red} {w_b(k X)} \
&+ q_M(X) ( \textcolor{red} {w_a(X)} \textcolor{red} {w_b(k X))} + q_C(X) - q_O(X) * \textcolor{red} {w_c(k^2 X)} \
\
&+ \alpha (L_0(X) (z(X) - 1)) \
\
&+ \alpha^2 (z(w X) (\textcolor{red} {w_a(X)} + \beta * \textcolor{red} {\sigma_a(X)} + \gamma) \
& (\textcolor{red} {w_b(k X)} + \beta \textcolor{red} {\sigma_b(k X)} + \gamma) \
& (\textcolor{red} {w_c(k^2 X)} + \beta \textcolor{red} {\sigma_c(k^2 X)} + \gamma)) \
\
&- \alpha^2 (z(X) (\textcolor{red} {w_a(X)} + \beta * X + \gamma) \
& (\textcolor{red} {w_b(k X)} + \beta k X + \gamma) \
& (\textcolor{red} {w_c(k^2 X)} + \beta k^2 X + \gamma)) \
\end{aligned} $$
<br />
另外,Lagrange basis polynomial $L_0(ξ) $Verifier 可以自己算出来,其中,红色部分的多项式都是需要被打开并验证的,Verifier 打开部分多项式后拿到的$h(X)$ 变成:
$$ \begin{aligned}
h(X)' &= K_{w_a} \textcolor{green} {qL(X)} + K{w_b} \textcolor{green} {qR(X)} + K{w_{ab}} \textcolor{green} {q_M(X)} + \textcolor{green} {qC(X)} - K{w_c} \textcolor{green} {q_O(X)} \
\
&+ \alpha (L_0(\xi) (\textcolor{green} {z(X)} - 1)) \
\
&+ \alpha^2 * (\textcolor{green} {z(w X)} \
& (K_{w_a} + \beta K_{\sigma_a} + \gamma) \
& (K_{w_b} + \beta K_{\sigma_b} + \gamma) \
& (K_{w_c} + \beta K_{\sigma_c} + \gamma)) \
\
&- \alpha^2 * (\textcolor{green} {z(X)} \
& (K_{w_a} + \beta \xi + \gamma) \
& (K_{w_b} + \beta k * \xi + \gamma) \
& (K_{w_c} + \beta k^2 * \xi + \gamma)) \
\end{aligned} $$ <br />
最后除了$ q_L(X)、q_R(X)、q_M(X)、q_C(X)、q_O(X)、z(X)、z(wX)$ 等七个多项式在opening $ξ $上的evaluation 未知,其余的都变成了这些多项式的常量系数,最后Verifier 需要验证:
$$ h(\xi)' = K_t * z_H(\xi) $$
现在左边的多项式已经变成线性的了,所以直接用pairing 的方式来验证:
$$ h(X)' - K_t z_H(\xi) = q_h(X) (X - \xi) \
\Updownarrow \
e([h(X)']_1 - [K_t * z_H(\xi)]_1, [1]2) = e(\pi{h(X)'}, [X]_2 - [\xi]_2) \
$$
其中:
$$ \begin{aligned}
[h(X)']1 &= K{w_a} \textcolor{green} {[q_L(X)]1} + K{w_b} \textcolor{green} {[q_R(X)]1} + K{w_{ab}} \textcolor{green} {[q_M(X)]_1} + \textcolor{green} {qC(X)} - K{w_c} \textcolor{green} {q_O(X)} \
\
&+ \alpha (L_0(\xi) (\textcolor{green} {[z(X)]_1} - 1)) \
\
&+ \alpha^2 * (\textcolor{green} {[z(w X)]_1} \
& (K_{w_a} + \beta K_{\sigma_a} + \gamma) \
& (K_{w_b} + \beta K_{\sigma_b} + \gamma) \
& (K_{w_c} + \beta K_{\sigma_c} + \gamma)) \
\
&- \alpha^2 * (\textcolor{green} {[z(X)]_1} \
& (K_{w_a} + \beta \xi + \gamma) \
& (K_{w_b} + \beta k * \xi + \gamma) \
& (K_{w_c} + \beta k^2 * \xi + \gamma)) \
\end{aligned} $$
所以Prover 只需要提供上面七个还未打开的多项式的commitment $[q_L(X)]_1 、[q_R(X)]_1 、[q_M(X)]_1、[q_C(X)]_1、[q_O(X)]_1、[z(X)]_1、[z(wX)]_1$ 就可以了。到此为止,plonk IOP 协议的整个过程就描述完整了。
<br />
@郭宇 老师的讲义:https\://github.com/sec-bit/learning-zkp/tree/develop/plonk-intro-cn
@郭宇 老师的视频讲解:https\://www.youtube.com/watch?v=O5HGp3EHDI0
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!