🐣 【笔记】SHPLONK
在Plonk协议中,多项式承诺是非常重要的一个环节,协议中的多项式承诺实现了多个多项式在两个点上的open。但是在实际的应用场景下,有可能会出现需要多个多项式在多个不同点处open的场景,如果能通过改进多项式承诺协议来使得plonk支持多个多项式在不同的子集点处的open。
若 $ z \in S $,那么 $Z_S(x) = \prod_{z \in S} (X-z)$。
假设有一个数据集$T = {z_1, z_2, …, z_t}$,并且它的子集$S_1,S_2,…,S_k \subset T$。如果有k个多项式$f_1(x), f_2(x),…,f_k(x)$,它们的承诺分别为$cm_1, cm_2,…,cm_k$,要分别在$S_1,S_2,…,S_k $上open。
首先若要使用KZG10对一个多项式做验证的话,那么
prover计算多项式 $$ h(x) = \frac{f_i(x) - r_i(x)}{Z_{S_i}(x)} $$
其中$r_i(x)$ 是一个$|s_i|$ 阶的多项式,且满足再$f_i(x) = r_i(x), x \in S_i$。
再使用srs参数计算证明$W =[h(x)]_1 = g^{h(x)}$,发送给verifier。
Verifier 拿到证明W后进行验证,这里需要两次pairing运算。
$$ e(cm_i - [r_i(x)]_1, g_2) = e(W,g_2 ^ {k}) $$
其中 $k = Z_{S_i}(x)$
如果要一次性得对这k个多项式进行验证,只需要引入一个随机数
verifier 生成一个随机数$\gamma$,并发送给prover
prover 拿着随机数将k组多项式的证明计算 $$ h_i(x) = \frac{f_i(x) - r_i(x)}{Z_{S_i}(x)} $$
2022-12-10