Zhuang's Diary

言之有物,持之以恒

论文原文 ==> 953.pdf (iacr.org)PlonK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge

摘要

利用可更新的通用结构化参考字符串的zk-SNARK构造消除了部署zk-SNARKs [GKM +]的主要障碍之一。 Maller等人的重要工作,[MBKM19]提出了Sonic-第一个具有实用性的zk-SNARK,具有完全简洁的验证,可用于带有这种SRS(structured reference string)的通用算术电路。但是,支持完全简洁验证的Sonic版本仍然需要相对较高的证明建造费用。 我们提出了一种具有完全简洁验证的通用SNARK结构,并且大大减少了证明方的运行时间(根据电路结构的不同,证明者的运行时间比完全简洁验证程序模式下的[MBKM19]少7.5-20倍)。与[MBKM19]类似,我们依赖于基于Bayer和Groth [BG12]的置换参数。但是,我们专注于“评估亚组而不是单项式系数”; 这样可以简化置换参数和算术化步骤。

=================以下为本人对 Plonk 的理解和总结=================

PlonK(以及更早但更复杂的SONIC、以及最近的Marlin)带来的是一系列的改进,这些改进可能会总体上大大提高这类证明的可用性及进展。

第一个改进:虽然PlonK仍需要一个类似Zcash SNARKs的可信设置过程,但它是一个“通用且可更新”的可信设置。这意味着两件事:首先,不需要为每一个你想证明的程序都设置一个单独的可信设置,而是为整个方案设置一个单独的可信设置,之后你可以将该方案与任何程序一起使用(在进行设置时可选择最大大小)。第二,有一种方法可以让多方参与可信设置,这样只要其中任何一方是诚实的,那这个可信设置就是安全的,而且这种多方过程是完全连续的:首先是第一个人参与,然后是第二个人,然后是第三个……参与者们甚至不需要提前知道,新的参与者可以把自己添加到最后。这使得可信设置很容易拥有大量参与者,从而在实践中确保设置是非常安全的。

第二个改进:它所依赖的“奇特密码学”是一个单一的标准化组件,称为“polynomial commitment”(多项式承诺)。PLONK使用基于可信设置和椭圆曲线对的“Kate commitments”(Kate承诺),但也可以用其它方案替换它,例如FRI(这将使PLONK变成一种STARK)或者DARK(基于隐藏顺序组)。这意味着该方案在理论上与证明大小和安全性假设之间的任何(可实现的)权衡兼容。

下图为Vitalik对PlonK的定位:

​ 这意味着需要在证明大小与安全性假设之间进行不同权衡的用例,仍然可以为“算术化”共享大部分相同的工具(把一个程序转换成一组多项式方程的过程,然后用多项式承诺来检验)。如果这种方案被广泛采用,那我们可期待在改进共享算术化技术方面的快速进展。

PlonK的工作原理

​ PLONK的一个关键组成部分,就像SNARKs中使用的QAP一样,这是一个转换问题的过程,形式是“给我一个值X,我给你一个特定的程序P,这样当X作为输入进行计算时,给出一些具体的结果Y”,放到问题中:“给我一组满足一组数学方程的值“。程序P可以表示很多东西,例如,问题可能是“给我一个数独的解决方案”,你可以通过将P设置为数独验证器加上一些编码的初始值并将Y设置为1(即“是的,这个解决方案是正确的”)来对其进行编码,一个令人满意的输入X将是数独的有效解决方案。这是通过将P表示为一个带有逻辑门的加法和乘法电路,并将其转换为一个方程组来完成的,其中变量是所有线上的值,每个门有一个方程(例如,乘法为x6 = x4 * x7,加法为x8 = x5 + x9)。

​ 下面是一个求x问题的例子,这样P(x) = x**3 + x + 5 = 35 (提示: x = 3):

我们按如下方式给门和线贴上标签:

​ 门和线上,我们有两种类型的约束:门约束(连接到相同门之间线的方程,例如a1 * b1 = c1)和复制约束(关于电路中任何位置的不同线相等的声明,例如a0 = a1 = b1 = b2 = a3 或者c0 = a1)。我们需要创建一个结构化的方程组,它最终将减少到一个非常少数量的多项式方程组,来表示这两个方程组。

在PlonK中,这些方程的设置和形式如下(其中,L = 左,R=右,O=输出,M=乘法,C=常数):
$$
({Q_L}_i)a_i + ({Q_R}_i)b_i + ({Q_O}_i)c_i + ({Q_M}_i)a_ib_i + {Q_C}_i = 0
$$
​ 每个Q值都是一个常数,每个方程中的常数(和方程数)对于每个程序都是不同的。每个小写字母值都是一个变量,由用户提供:ai 是第i个门的左输入线,bi是右输入线,ci是第i个门的输出线。

​ 对于加法门,我们设置:
$$
{Q_L}_i=1, {Q_R}_i=1, {Q_O}_i=-1, {Q_M}_i=0, {Q_C}_i=0
$$
​ 将这些常数插入方程并进行简化,得到ai+bi-oi=0,这正是我们想要的约束条件。

​ 对于乘法门,我们设置:

$$
{Q_L}_i=0, {Q_R}_i=0, {Q_O}_i=-1, {Q_M}_i=1, {Q_C}_i=0
$$
​ 对于将ai设置为某个常数x的常数门,我们设置:
$$
Q_L=1, Q_R=0, Q_O=1, Q_M=0, Q_C=-x
$$
​ 你可能已注意到线的每一端,以及一组线中的每根线,显然必须具有相同的值(例如x)对应于一个不同的变量;到目前为止,没有什么能强迫一个门的输出与另一个门的输入相同(我们称之为“复制约束”)。Plonk有一种强制复制约束的方法。所以现在我们有一个问题,证明者想要证明他们有一堆Xai, Xbi以及Xci值满足了一堆相同形式的方程。这仍然是一个大问题,但不像“找到这个计算机程序的一个令人满意的输入”,这是一个非常结构化的大问题,我们有数学工具可用于“压缩”它。

从线性系统到多项式

​ 这里的主要内容是将多项式理解为一种数学工具,用于将大量值封装到单个对象中。通常,我们是以“系数形式”来看待多项式,即如下表达式:
$$
y = x^3 - 5x^2 + 7x -2
$$
​ 但我们也可用“定值形式”来看待多项式。例如,我们可以认为上面是在坐标(0,1,2,3)处分别定值(-2,1,0,1)的“阶数<4的多项式:

​ 下一步:许多形式相同的方程组可重新解释为多项式上的一个方程组。例如,假设我们有一个系统:
$$
2x_1-x_2+3x_3=8 \
x_1+4x_2-5x_3=5\
8x_1-x_2-x_3=-2
$$
​ 我们用定值形式定义四个多项式:L(x)是在坐标 (0, 1, 2)处定值为(2,1,8)的阶数< 3的多项式,在同样的坐标系下,M(x) 定值为 (-1, 4, -1), R(w)定值为(3, -5, -1) 以及O(x)定值为(8, 5, -2)(用这种方法直接定义多项式是可以的,可以使用拉格朗日插值来转换成系数形式)。现在,考虑下面这个等式:
$$
L(x)*x_1 + M(x)*x_2 + R(x)*x_3 - O(x) = Z(x)H(x)
$$
​ 在这里,Z(x)(x-0) * (x-1) * (x-2)的简写,它是在定值域 (0, 1, 2)上返回零的最小(非零)多项式。这个方程的解 (x1 = 1, x2 = 6, x3 = 4, H(x) = 0)也是原方程组的解,只是原方程组不需要H(x)。还要注意,在这种情况下,H(x)很方便为零,但在更复杂的情况下,H可能需要为非零。

所以现在我们知道,我们可以在少数数学对象(多项式)中表示一个大的约束集。但在我们上面建立的表示门线约束的方程中,x1, x2, x3变量在每个方程中是不同的。我们可以用同样的方法使变量本身成为多项式而不是常数来处理这个问题。所以我们得到:
$$
Q_L(x)a(x) + Q_R(x)b(x) + Q_O(x)c(x) + Q_M(x)a(x)b(x) + Q_C(x) = 0
$$
​ 如前所述,每个Q多项式是由正在验证的程序生成的参数,a, b, c多项式是用户提供的输入。

复制约束(Copy constraints)

​ 现在,让我们回到“连接”线上。到目前为止,我们所拥有的是一组关于不相交值的不相交方程,这些方程独立且易于满足:常数门可通过将值设置为常数来满足,加法和乘法门可通过将所有线设置为零来满足!为了使问题具有实际的挑战性(并实际表示原始电路中编码的问题),我们需要添加一个验证“复制约束”(如a(5) = c(7), c(10) = c(12)等约束)的等式,这需要一些巧妙的技巧。

​ 我们的策略是设计一个“坐标对累加器”,一个多项式p(x) 的工作原理如下:首先,让X(x)Y(x)两个多项式表示一组点的xy坐标(例如表示集合((0, -2), (1, 1), (2, 0), (3, 1)), 你可设置X(x) = x以及Y(x) = x^3 - 5x^2 + 7x - 2)。我们的目标是让p(x) 代表所有点,直到(但不包括)给定的位置,所以 p(0)从1开始,p(1)只代表第一个点,p(2)是第一个点和第二个点,诸如此类。我们将通过“随机”选择两个常数v1和v2,并使用约束p(0) = 1以及p(x+1) = p(x) * (v1 + X(x) + v2 * Y(x)) 构造p(x),至少在域(0,1,2,3)内。例如,让v1=3和v2=2,我们得到:

$$
\qquad \qquad X(x) \qquad 0 \qquad 1 \qquad 2 \qquad 3 \qquad 4 \
\qquad \qquad Y(x) \quad -2 \qquad 1 \qquad 2 \qquad 1 \qquad \
v1+X(x)_V^2*Y(x) \quad -1 \qquad 6 \qquad 5 \qquad 8 \qquad \qquad \
\qquad \qquad \qquad p(x) \qquad 1 \quad -1 \quad -6 \quad -30 \ -240
$$
​ 注意(除了第一列)每个p(x) 值,等于它左边的值乘以它左上面的值。

​ 我们关心的结果是p(4) = -240 。现在,考虑这样的情况,我们设置X(x) = 2⁄3 x^3 - 4x^2 + 19⁄3 x(即,在坐标(0,1,2,3)处定值为(0,3,2,1)的多项式),而不是X(x) = x。

​ 如果你运行同样的过程,你会发现你也会得到p(4) = -240

​ 这不是巧合(事实上,如果你随机从一个足够大的域中选择v1v2,则几乎永远不会巧合地发生)。相反,这是因为 Y(1) = Y(3),所以如果你“交换”点 (1, 1) 和(3,1)的X坐标,你就不会改变点的集合,并且因为累加器对集合进行编码(因为乘法不关心顺序),所以最后的值将是相同的。

​ 现在,我们可以开始了解我们将用来证明复制约束的基本技术。首先,考虑一个简单的例子,我们只想证明在一组线中的复制约束(例如,我们想证明a(1)=a(3))。我们将生成两个坐标累加器:一个是X(x) = x 和Y(x) = a(x),另一个是Y(x) = a(x),而X’(x)是对每个复制约束中的值的翻转排列(或重新排列)定值的多项式。在a(1) = a(3)的情况下,这意味着排列将开始于0 3 2 1 4…. 第一个累加器将压缩 ((0, a(0)), (1, a(1)), (2, a(2)), (3, a(3)), (4, a(4))…,第二个压缩((0,A(0)),(3,A(1)),(2,A(2)),(1,A(3)),(4,A(4))……只有当a(1) = a(3)时,两者才能给出相同的结果。

​ 为了证明abc之间的约束,我们使用了相同的过程,但是我们将所有三个多项式的点“累加”在一起。我们给a, b, c赋值一些X坐标(例如a为Xa(x) = x 即0...n-1, b为Xb(x) = n+x,即n…2n-1c 为Xc(x) = 2n+x,即2n…3n-1。为了证明在不同线集之间跳跃的复制约束,“替换”X坐标将是所有三个集合上的排列片段。例如,如果我们想用n = 5 证明a(2)=b(4),那么X’a(x) 将有定值0 1 9 3 4,X’b(x)将有定值5 6 7 8 2(注意2和9翻转,其中9对应于b4线)。 然后,我们将不再像以前那样检查一次过程中的相等性(即检查p(4) = p’(4)),而是检查每侧三次不同运行的乘积:
$$
p_a(n)*p_b(n)*p_c(n) = p’_a(n)*p’_b(n)*p’_c(n)
$$
​ 两边的三个 p(n)定值的乘积将abc中的所有坐标对累加在一起,因此这允许我们像以前一样进行检查,除此之外,我们现在不仅可检查三组线A、B或C中一组内的位置之间的复制约束,还可以检查一组线与另一组线之间的复制约束(例如,在a(2) = b(4)中)。

多项式承诺

多项式承诺(polynomial commitment)是一个短对象,其“代表”一个多项式,并允许你验证该多项式的计算,而不需要实际包含多项式中的所有数据。也就是说,如果有人给你一个代表P(x)的承诺c,他们可以给你一个证明,然后说服你对于某个特定的z,P(z) 值是多少。还有一个进一步的数学结果表明,在一个足够大的域上,如果关于在随机z上定值的多项式的某些类型的方程(在z已知之前选择)是真的,那么这些相同的方程对整个多项式也是真的。例如,如果P(z) * Q(z) + R(z) = S(z) + 5,那么我们知道P(x) * Q(x) + R(x) = S(x) + 5通常是极有可能的。使用这样的多项式承诺,我们可以很容易地检查上面所有的多项式方程。作出承诺,使用它们作为输入生成z,证明在z上每个多项式的定值是什么,然后用这些定值来运行方程,而不是原来的多项式。那这些承诺是如何运作的呢?

​ 有两部分:对多项式P(x) -> c的承诺,以及在某个z处对值P(z)的opening。而要作出承诺,有很多技术,一个例子是FRI,另一个是Kate承诺,我将在下面描述。为了证明一个 opening,有一个简单的通用“减除”技巧:为了证明P(z) = a,你要证明
$$
\frac{P(x)-a}{x-z}
$$
​ 也是一个多项式(使用另一个多项式承诺)。这是因为如果商是一个多项式(即它不是分数),那么x - zP(x) - a的一个因子,所以(P(x) - a)(z) = 0,所以 P(z) = a。用一些多项式试试,比如P(x) = x^3 + 2*x^2+5 (z=6,a=293),然后试试 (z = 6, a = 292),看看它是如何失败的

​ 另请注意一个一般优化:为了同时证明多个多项式的多个opening,在提交输出后,对多项式和输出的随机线性组合执行减除技巧。

​ 那么,承诺本身是如何运作的呢?幸运的是,Kate 承诺要比FRI简单得多。可信设置过程生成一组椭圆曲线点G, G * s, G * s^2 …. G * s^n,以及G2 * s,其中G 和G2是两个椭圆曲线组的生成器,而s则是一个一旦程序完成就会被遗忘的秘密(注意,这个设置有多个版本,它是安全的,只要至少有一个参与者忘记了他们分享的秘密)。这些点会被公布,并被认为是方案的“证明关键”,任何需要作出多项式承诺的人都需要使用这些点。通过将证明密钥中的前d+1个点中的每一点乘以多项式中的相应系数,并将结果相加,对d次多项式作出承诺。

​ 注意,这提供了在s处的多项式的“定值”,而不知道s。例如,x^3 + 2x^2+5 将由(G * s^3) + 2 * (G * s^2) + 5 * G表示。我们可以用符号[P]来表示用这种方式(即G * P(s))编码的P。在做减除技巧时,可以使用椭圆曲线对来证明这两个多项式实际上满足关系:检查e([P] - G * a, G2) = e([Q], [x] - G2 * z)是否作为检查P(x) - a = Q(x) * (x - z)的代理。

总结

​ 最后,再讨论一下这个方案,给定一个程序P,将其转换为一个电路,并生成一组如下所示的方程:
$$
({Q_L}_i)a_i + ({Q_R}_i)b_i + ({Q_O}_i)c_i + ({Q_M}_i)a_ib_i + {Q_C}_i = 0
$$
​ 然后将这组方程转换为一个多项式方程:
$$
Q_L(x)a(x) + Q_R(x)b(x) + Q_O(x)c(x) + Q_M(x)a(x)b(x) + Q_C(x) = 0
$$
​ 还可以从回路中生成复制约束的列表。从这些复制约束生成表示排列线指数的三个多项式:σa(x), σb(x), σc(x)。要生成证明,需要计算所有线的值,并将其转换为三个多项式:a(x), b(x), c(x)。作为置换检查参数的一部分,还可以计算六个“坐标对累加器”多项式。最后计算辅因子Hi(x)。

​ 多项式之间有一组方程需要检查,可以通过对多项式作出承诺,在某些随机z处打开它们(同时证明这些opening是正确的),并在这些求值结果上运行方程,而不是在原始多项式上运行方程来完成这项工作。证明本身只是一些承诺和opening,可以用几个方程式来检查。

论文原文 ==> 953.pdf (iacr.org)PlonK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge

6 约束系统Constraint systems

​ 给定整数m,n,且n≤m≤2n我们提出一种约束系统,该系统捕获扇入的两个算术电路,这些算术电路具有n个门和m条导线,不受限制地扇出。

​ 约束系统 C=(V,Q) 定义如下:

  • V的约束是 V=(a,b,c),其中a,b,c∈[m],[m]的阶数为n。我们将a,b,c分别视为C的左,右和输出序列。

  • Q=(qL,qR,qO,qM,qC)∈(Fn),其中(Fn)的阶数为5,qL,qR,qO,qM,qC∈Fn 为选择器向量,每个选择器向量的阶数为n。

x∈Fm,i∈[n],为了满足C,需要满足以下条件:
$$
(qL)i \cdot X{a_i} + (qR)i \cdot X{b_i} + (qO)i \cdot X{c_i} + (qM)i \cdot (X{a_i}X_{b_i}) + (qC)_i = 0
$$
​ 为了定义基于C的关系,我们将其扩展为包括正整数l≤m和“公共输入”的子集 I⊂[m]。在不失一般性的前提下,假设I= {1,…,l}。

​ 定义Rc为一组集合对(x,ω),其中x∈Fl,l为阶数,ω∈Fm_l,m-l 为阶数,则 x:=(x,ω)满足C。

​ 我们将继续展示此类约束的一些有用实例。

算术电路:n个门且扇入为2的电路,每个门是加法门或乘法门,约束系统可以如下:

1.m设置为线路数,每根线路与索引i∈[m]相关联。

​ 针对每一个i∈[n],

2.设定ai,bi,ci为第i个门的左、右、输出线路。

3.设定(qL)i=0,(qR)i=0,(qM)i=1,(qO)i=-1,当第i个门是乘法门。

4.设定(qL)i=1,(qR)i=1,(qM)i=0,(qO)i=-1,当第i个门是加法门。(同时可以使用线性组合门,(qL)i,(qR)i为非零整数值)

5.(qC)i=0。

布尔约束:证明系统中常见的一种情况是需要强制执行 Xj∈{0,1},其中j∈[m],i∈[n],则:

ai=bi=j,(qL)i=-1,(qM)i=1,(qR)i=(qO)i=(qC)i=0

增强公共输入:非常方便直接,强制执行公共输入值X1,…,Xl:强制约束Xj=Xj,i∈[n],则:

ai=j,(qL)i=1,(qM)i=(qR)i=(qO)i=0,(qC)i=-xj

7 主协议Main protocol

​ 令C=(V,Q)为第6节所述形式的约束系统。我们介绍关系Rc的主要协议。首先,如下定义C的分区(称为Tc)将很方便。

​ 令 V=(a,b,c),认为V是[m]中的一个向量V,[m]的阶数为3n。令i∈[m],Ti⊂[3n]为是索引集j∈[3n],如Vj=i。现在定义:
$$
T_c := {T_i}_{i∈[m]}
$$
​ 在介绍本协议之前,我们先做一个最终定义。如果i∈[l],我们说C为l个公共输入做好了准备。

ai=i,(qL)i=1,(qM)i=(qR)i=(qO)i=0,(qC)i=0

​ 回顾 H∈{g,. . .,gn},我们提出用于Rc的H范围多项式协议

前处理:令 σ = σ(Tc)

​ 如5.1节所讲,多项式SID1,SID2,SID3,Sσ1,Sσ2,Sσ3∈ F <n[X]。

​ 多项式qL,qR,qO,qM,qC ∈ F <n[X],针对每一个i∈[n]均满足:
$$
q_L(g^i):=(q_L)_i,q_R(g^i):=(q_R)_i,q_O(g^i):=(q_O)_i,q_M(g^i):=(q_M)_i,q_C(g^i):=(q_C)_i
$$
协议

1.XFF的阶数为m,令XPpoly的公共输入X。Ppoly计算3个多项式fL,fR,fO∈ F <n[X],i∈[n],
$$
f_L(i)=X_{a_i},f_R(i)=X_{b_i},f_O(i)=X_{c_i}
$$
Ppoly发送fL,fR,fO给到第三方 I

2.Ppoly和Vpoly使用5.1节所讲到的排列协议,使用排列σ,σ介于(fL, fR, fO)与自身之间。如5.2阶所讲,将确切地检查(fL, fR, fO)是否满足Tc。

3.Vpoly计算公共输入多项式:
$$
PI(X):= \sum _{i∈[l]}-x_i \cdot L_i(X)
$$
4.Vpoly在H范围内检验恒等式:
$$
q_L \cdot f_L + q_R \cdot f_R + q_O \cdot f_O + q_M \cdot f_L \cdot f_R + (q_C + PI) = 0
$$

8.最终协议

8.1 多项式定义一个专用电路

以下多项式,唯一性地定义一个通用的SNARK电路:

  • qM(X),qL(X),qR(X),qO(X),qC(X),定义电路算术化的“选择器”多项式

  • SID1(X)=X,SID2(X)=k1X,SID3(X)=k2X:应用于a, b, c的恒等式排列。选择k1,k2∈F ,使得H,k1·H,k2·H是F*中H的不同的协集,因此由3n个不同的元素组成。例如,ω是二次残基的,k1为任何二次非残基,而k2为不包含在k1·H中的二次非残基。

  • Sσ1(X),Sσ2(X),Sσ3(X):复制排列应用于a,b,c

  • n为给定电路总的门数。V使用它来计算消失的多项式:
    $$
    Z_H(X)=X^n-1
    $$

8.2 对线路价值的承诺Commitments to wire values

对于以下协议,我们描述了包含n个算术门的通用SNARK电路的证明关系。证据proof的见证人witnesses是线路价值的见证。承诺commitments [a]1,[b]1,[c]1将Kate多项式承诺通过计算方式绑定到线路价值。

8.3 展开的通用的SNARK证明关系

$$
Rsnark(λ)=\begin{Bmatrix} (x,w,crs) = ((w_i){i \in [l]}),((w_i) ^{3n} {i=1,i \in [l]}),((q{M_i},q{L_i},q_{R_i},q_{O_i},q_{C_i}) ^n _{i=1}, n, σ(x))\
\text {For all } i \in {1,…,3n }:w_i \in F_p,

\ \text {and for all } i \in {1,…,n}:w_iw_{n+i}q_{M_i} + w_iq_{L_i} + w_{n+i}q_{R_i} + w_{2n+i}q_{O_i} + q_{C_i} = 0
\ \text { and for all } i \in {1,…,3n}:w_i=w_{σ(i)}
\end{Bmatrix}
$$

8.4 协议

​ 我们将下面的协议描述为使用Fiat-Shamir启发式技术的非交互式协议。为此,我们总是通过笔录表示共同的预处理输入,公共输入以及证明者在特定时间点之前编写的证明元素的串联。使用transcript通过(Fiat-Shamir)获得随机挑战。或者,可以通过发送随机字段元素的验证程序替换我们在“compute challenges”下写下的所有要点,以获得交互式协议,从中可以得出非交互式协议。使用R来指代哈希函数R:{0,1}→Fp来模拟随机预言。

共同的预处理输入:
$$
\begin{matrix}
n,(x \cdot [1]1,…,x^{n+5} \cdot [1]1),(q{M_i},q{L_i},q_{R_i},q_{O_i},q_{C_i}) ^n _{i=1} , σ(X), \
q_M(X)=\sum ^n {i=1} q{M_i}L_i(X),\
q_L(X)=\sum ^n {i=1} q{L_i}L_i(X),\
q_R(X)=\sum ^n {i=1} q{R_i}L_i(X),\
q_O(X)=\sum ^n {i=1} q{O_i}L_i(X),\
q_C(X)=\sum ^n {i=1} q{C_i}L_i(X),\

S_{σ1}(X)=\sum ^n {i=1} σ(i)L_i(X),\
S
{σ2}(X)=\sum ^n {i=1} σ(n+i)L_i(X),\
S
{σ3}(X)=\sum ^n {i=1} σ(2n+i)L_i(X),\
\end{matrix}
$$
公共输入:
$$
l,(w_i)
{i \in [l]}
$$

证明人算法:

证明人输入:
$$
(w_i)_{i \in [3n]}
$$
Round 1:

​ 生成随机的盲标量(b1,…,b9)∈ Fp

​ 计算线路多项式 a(X),b(X),c(X):
$$
\begin{matrix}
a(X)=(b_1X+b_2)Z_H(X)+\sum _{i=1} ^n w_iL_i(X) \
b(X)=(b_3X+b_4)Z_H(X)+\sum {i=1} ^n w{n+i}L_i(X) \
c(X)=(b_5X+b_6)Z_H(X)+\sum {i=1} ^n w{2n+i}L_i(X) \
\end{matrix}
$$
​ 计算
$$
[a]_1 := [ \alpha (x)]_1,[b]_1 := [b(x)]_1,[c]_1 := [c(x)]_1
$$
​ 第一个输出 P 为:
$$
[a]_1 ,[b]_1 ,[c]_1
$$
Round 2:

​ 计算排列挑战(β, γ)∈ Fp: β = R(transcript,0), γ = R(transcript,1)

​ 计算排列多项式 z(X):
$$
\begin{matrix}
z(X)=
(b_7X^2+b_8X+b_9)Z_H(X)+ \
L_1(X)+ \
\sum {i=1} ^{n-1}\left(L{i+1}(X) \prod ^i {j=1} \frac{(w_j+\beta w^{j-1}+\gamma)(w{n+j}+\beta k_1w^{j-1}+\gamma)(w_{2n+j}+\beta k_2w^{j-1}+\gamma)}{(w_j+\sigma(j)\beta+\gamma))(w_{n+j}+\sigma(n+j)\beta+\gamma)(w_{2n+j}+\sigma(2n+j)\beta+\gamma)}\right)
\end{matrix}
$$
​ 计算:
$$
[z]_1:=[z(x)]_1
$$
​ 第二个输出 P 为:
$$
([z]_1)
$$
Round 3:

​ 计算商数挑战α∈ Fp:α = R(transcript)

​ 计算商数二项式t(X):
$$
\begin{matrix}
t(X)=(a(X)b(X)q_M(X)+a(X)q_L(X)+b(X)q_R(X)+c(X)q_O(X)+PI(X)+q_C(X)) \frac{1}{Z_H(X)} \+ ((a(X)+\beta X+\gamma)(b(X)+\beta k_1X+\gamma)(c(X)+\beta k_2X+\gamma)z(X)) \frac{\alpha}{Z_H(X)}
\- ((a(X)+\beta S_{\sigma 1} (X)+\gamma)(b(X)+\beta S_{\sigma 2} (X)+\gamma)(c(X)+\beta S_{\sigma 3} (X)+\gamma)z(X\omega))\frac{\alpha}{Z_H(X)}
\+ ((z(X)-1)L_1(X)\frac{\alpha ^2}{Z_H(X)}
\end{matrix}
$$
​ 拆分 t(X) 为多项式 tlo(X),tmid(X)和thi(X), tlo(X)阶数<n,thi(X)阶数≤n+5,即
$$
t(X)=t_{lo}(X)+X^nt_{mind}(X)+X^{2n}t_{hi}(X)
$$
​ 计算
$$
[t_{lo}]1:=[t{lo}(x)]1, [t{mid}]_1:=[tmid(x)]1, [t{hi}]1:=[t{hi}(x)]1
$$
​ 第三个输出 P 为:
$$
([t
{lo}]1,[t{mid}]1,[t{hi}]_1)
$$
Round 4:

​ 计算评估挑战ζ∈ Fp:ζ= R(transcript)

​ 计算开放评估:
$$
\overline a=a(ζ),\overline b=b(ζ), \overline c=c(ζ),\overline S_{\sigma 1}=S_{\sigma 1}(ζ), \overline S_{\sigma 2}=S_{\sigma 2}(ζ), \overline t=t(ζ), \overline z=z(ζω)
$$
​ 计算线性化多项式 r(X):
$$
\begin{matrix}
r(X)=(\overline a \overline b \cdot q_M(X)+\overline a \cdot q_L(X)+\overline b \cdot q_R(X)+ \overline c \cdot q_O(X)+q_C(X)) \

  • ((\overline a+\beta ζ+\gamma)(\overline b+\beta k_1ζ+\gamma)(\overline c+\beta k_2ζ+\gamma)\cdot z(X))\alpha
    \- ((\overline a+\beta \overline S_{\sigma 1}+\gamma)(\overline b+\beta S_{\sigma 2}+\gamma)\beta \overline z_ω \cdot S_{\sigma 3}(X)) \alpha
    \+ ((z(X))L_1(ζ){\alpha ^2}
    \end{matrix}
    $$
    ​ 计算线性化评估
    $$
    \overline r = r(ζ)
    $$
    ​ 第四个输出 P 为:
    $$
    (\overline a, \overline b, \overline c, \overline S_{\sigma 1},\overline S_{\sigma 2},\overline z_ω,\overline t,\overline r)
    $$
    Round 5:

​ 计算开放挑战 υ∈ Fp:υ= R(transcript)

​ 计算开放证明多项式 Wζ(X):
$$
W_ζ(X)=\frac{1}{X-ζ}\left(
\begin{matrix}
(t_{lo}(X)+ζ^nt_{mid}(X)+ζ^{2n}t_{hi}(X)-\overline t)\
+υ(r(X)-\overline r)\
+υ^2(a(X)-\overline a)\
+υ^3(b(X)-\overline b)\
+υ^4(c(X)-\overline c)\
+υ^5(S_{\sigma 1}(X)-\overline S_{\sigma 1})\
+υ^6(S_{\sigma 2}(X)-\overline S_{\sigma 2})\

\end{matrix}
\right)
$$
​ 计算开放证明多项式:
$$
W_{ζω}(X)=\frac{(z(X)-\overline z_ω)}{X-ζω}
$$
​ 计算:
$$
[W_ζ]_1:=[W_ζ(x)]_1,[W_ζω]_1:=[W_ζω(x)]_1
$$
​ 第五个输出P为
$$
([W_ζ]_1,[W_ζω]1)
$$
​ 返回
$$
π
{SNARK}=\left(
[a]_1,[b]_1,[c]_1,[z]1,[t{lo}]1,[t{mid}]1,[t{hi}]_1,[W_ζ]1,[W_ζω]1,\overline a, \overline b, \overline c, \overline S{\sigma 1},\overline S{\sigma 2},\overline r, \overline z_ω
\right)
$$
​ 计算多点评估挑战 u∈ Fp:u = R(transcript)

​ 现在,我们以最小化G1标量乘法次数的方式描述验证程序算法。

验证人算法:

验证预处理输入:
$$
\begin{matrix}
[q_M]_1:=q_M(x)\cdot [1]_1\,
[q_L]_1:=q_L(x)\cdot [1]_1\
,[q_R]_1:=q_R(x)\cdot [1]_1\
,[q_O]_1:=q_O(x)\cdot [1]1\
,[S
{\sigma 1}]1:=S{\sigma 1}(x)\cdot [1]1\
,[S
{\sigma 2}]1:=S{\sigma 2}(x)\cdot [1]1\
,[S
{\sigma 3}]1:=S{\sigma 3}(x)\cdot [1]_1\
x \cdot [1]_2
\end{matrix}
$$

$$
\begin{matrix}
1.验证 \left(
[a]_1,[b]_1,[c]1,[z]1,[t{lo}]1,[t{mid}]1,[t{hi}]1,[W_ζ]1,[W_ζω]1
\right) \in G_1 \
2.验证\left(
\overline a, \overline b, \overline c, \overline S
{\sigma 1},\overline S
{\sigma 2},\overline r, \overline z_ω
\right) \in F ^7 p \
3.验证 (w_i)
{i \in [l]} \in F ^l p \
4.计算 \beta,\gamma,\alpha,ζ,v, u \in F_p 如证明人算法描述 \
5.计算零多项式评估 Z_H(ζ)=ζ^n-1 \
6.计算拉格朗日多项式评估 L_1(ζ)=\frac{ζ^n-1}{n(ζ-1)} \
7.计算公共多项式评估 PI(ζ)=\sum
{i\in l} w_iL_i(ζ) \
8.计算求商多项式评估 \overline t = \frac{\overline r + PI(ζ) - ((\overline a+\beta \overline S
{\sigma 1}+\gamma)(\overline b+\beta \overline S
{\sigma 2}+\gamma)(\overline c+\gamma) \overline z_ω)\alpha - L_1(ζ)\alpha ^2)}{Z_H(ζ)}
\end{matrix}
$$

9.计算第一部分的批多项式承诺
10.计算整体批多项式承诺
11.计算群编码批评估
12.验证全部评估

论文原文 ==> 953.pdf (iacr.org)PlonK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge

5.用于识别排列的多项式协议

​ 从根本上说,我们的通用SNARK是“排列检查”,其灵感来自于Bayer和Groth [[BG12](S. Bayer and J. Groth. Effiffifficient zero-knowledge argument for correctness of a shufflfflffle. In *Advances in Cryptology - EUROCRYPT 2012 - 31st Annual* *International Conference on the Theory and Applications of Cryptographic* *Techniques, Cambridge, UK, April 15-19, 2012. Proceedings*, pages 263–280, 2012.)]及其在[[BCC+16](J.Bootle, A. Cerulli, P. Chaidos, J. Groth, and C. Petit. Effiffifficient zero knowledge arguments for arithmetic circuits in the discrete log setting. pages 327–357, 2016.),[MBKM19](M. Maller, S. Bowe, M. Kohlweiss, and S. Meiklejohn. Sonic: Zero-knowledge snarks from linear-size universal and updateable structured ref-erence strings. *IACR Cryptology ePrint Archive*, 2019:99, 2019.)]中的变体所提出的排列参数。同样,与[[MBKM19](M. Maller, S. Bowe, M. Kohlweiss, and S. Meiklejohn. Sonic: Zero-knowledge snarks from linear-size universal and updateable structured ref-erence strings. *IACR Cryptology ePrint Archive*, 2019:99, 2019.)]相比,我们的主要优点是可以通过处理单变量多项式和可乘子组来获得更简单的协议。

​ **维度界限:**我们使用两个整数参数n≤d。直观地讲,n是诚实证明者多项式的度,d是我们实际上对恶意证明者强制执行的范围。因此,我们在分析证明者效率并描述“正式”协议输入时假设度数为n。但是在分析稳健性时允许度数为d。

​ 我们假设存在生成器 g 的n阶乘子子集H⊂F

​ 指定 i∈[n],Li(X) 为F <n[X]的一个元素,Li(g)=1且Li(a)=0,其中a∈Hg不同,例如,{Li},其中 i∈[n] 是 H的拉格朗日基础。

​ {Li} 可以”将点检查减少到范围检查“。

断言5.1. 给定i∈[n]和Z,Z*∈F[X]。 则针对每一个a∈H,有且只有Z(gi) = Z*(gi)时 Li(a)(Z(a) - Z*(a)) = 0。

​ 给定f,g∈F[X]和一个排列 σ:[n]→[n],写为 g=σ(f),针对每一个a∈H,g(gi) = f(gσ(i))

​ 我们提出了一个范围多项式协议,使Ppoly能够证明 g=σ(f)。

预处理多项式:多项式为 SID∈F[X],SID由S(gi)=i定义,对于每一个i∈[n]且Sσ∈F[X],Sσ(gi) = σ(i)。

输入:f,g∈F<n[X]

协议:

1.Vpoly选择随机数β,γ∈F,并发送给到Ppoly。

2.令 f’:=f+β·SID+γ,g’:=g+β·Sσ+γ。则,针对i∈[n],有
$$
f’(g^i) = f(g^i) + β \cdot i + γ, g’(g^i)=g(g^i) + β \cdot σ(i) + γ
$$
3.Ppoly计算 ZF <n[X],且Z(g)=1;并且对于 i∈{2,…,n}
$$
Z(g^i)=\sum _{1 \leq j \leq i} f’(g^j)/g’(g^j)
$$
如果某元素未定义,在γ之上会发生的可能性为negl(λ),协议则中止。

4.Ppoly发送Z给到第三方 I

5.Vpoly检验a,其中a∈H

​ (a) L1(a)(Z(a)-1) = 1

​ (b) Z(a)f’(a) = g’(a)Z(a·g)

如果上述检验OK,则输出acc

5.1检查“扩展”排列

预处理多项式:多项式为 SID1,…,SIDk∈F<n[X],SIDj由SID(gi)=(j-1)·n + i定义,对于每一个i∈[n]。

输入:f1,…,fk,g1,…,gk∈F<n[X]

协议:

1.Vpoly选择随机数β,γ∈F,并发送给到Ppoly。

2.令 fj’:=fj+β·SIDj+γ,gj’:=gj+β·Sσj+γ。则,针对j∈[k],i∈[n],有
$$
f’ _j (g^i) = f _j (g^i) + β \cdot ((j-1) \cdot n + i) + γ, g_j’(g^i)=g_j(g^i) + β \cdot σ((j-1) \cdot n + i) + γ
$$
3.定义 f’,g‘∈F<kn[X]如下:
$$
f’(X) := \prod _{j \isin [k]} f_j’(X),g’(X) := \prod _{j \isin [k]} g_j’(X)
$$
4.Ppoly计算 ZF <n[X],且Z(g)=1;并且对于 i∈{2,…,n}
$$
Z(g^i)=\sum _{1 \leq l \leq i} f’(g^j)/g’(g^j)
$$
5.Ppoly发送Z给到第三方 I

5.Vpoly检验全部a,其中a∈H

​ (a) L1(a)(Z(a)-1) = 1

​ (b) Z(a)f’(a) = g’(a)Z(a·g)

如果上述检验OK,则输出acc

论文原文 ==> 953.pdf (iacr.org)PlonK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge

摘要

利用可更新的通用结构化参考字符串的zk-SNARK构造消除了部署zk-SNARKs [GKM +]的主要障碍之一。 Maller等人的重要工作,[MBKM19]提出了Sonic-第一个具有实用性的zk-SNARK,具有完全简洁的验证,可用于带有这种SRS(structured reference string)的通用算术电路。但是,支持完全简洁验证的Sonic版本仍然需要相对较高的证明建造费用。 我们提出了一种具有完全简洁验证的通用SNARK结构,并且大大减少了证明方的运行时间(根据电路结构的不同,证明者的运行时间比完全简洁验证程序模式下的[MBKM19]少7.5-20倍)。与[MBKM19]类似,我们依赖于基于Bayer和Groth [BG12]的置换参数。但是,我们专注于“评估亚组而不是单项式系数”; 这样可以简化置换参数和算术化步骤。

4.理想的低度协议

​ 我们在证明者和验证者之间定义了一种有限类型的协议,以清晰地捕获和抽象多项式承诺方案(例如[KZG10])。在Plonk协议中,证明者将低度的多项式发送给第三方 I。然后,验证者可以询问 I ,证明者的多项式与验证者已知的其他预定义多项式之间是否存在某些恒等式。

定义 4.1. 定值正整数 d, D, t, l . A(d, D, t, l) 多项式协议,其中,证明者Ppoly,验证者Vpoly和受信方I之间存在多轮协议,其进行如下。

1.协议定义包括一组预处理多项式 g1, … , gl ∈ F <d[X]。

2.Ppoly的消息被发送到 I,并且对于f∈ F <d[X],形式为f。 如果Ppoly发送的消息不是这种形式,则协议中止。

3.Vpoly到Ppoly的消息是任意的(但是我们将集中讨论公共硬币协议,其中消息只是随机的硬币)

4.在协议末尾,假设 f1, … , ft 是从Ppoly发送到 I 的多项式。Vpoly可能会问 I 在{f1, . . . , ft , g1, . . . , gl}之间是否存在某些多项式恒等式:
$$
F(X) := G(X,h_1(v_1(X)), … , h_M(v_M(X)))≡0
$$
其中,hi ∈ {f1, . . . , ft , g1, . . . , gl},G ∈ F [X, X1, … , Xm], v1, … , vm ∈ F <d[X],此 F ∈ F <D[X]中,任一 f1, . . . , ft 都是Ppoly按照本协议制作的。

5.在收到 I 的回答之后,如果所有身份均成立,则Vpoly输出 acc,否则输出 rej

结论 4.2. 一个更加复杂的模型,Ppoly发送消息(f, n) 至 I,其中 n d ,由 I 执行 f ∈ F <n[X] 。但是,我们避免这样做,因为我们的协议不需要这种额外的功能,并且会导致效率降低,因为它转化为需要使用多项式承诺方案,并且能够动态实施小于d度的边界。

​ 我们以自然的方式为关系定义多项式协议。

定义 4.3. 给定关系RR是具有以下属性的多项式协议。

1.协议的第一步,Ppoly和Vpoly都被给与一个输入 x。假设Ppoly拥有w,并且 (x, ω) ∈ R

2.完整性(Completeness):如果Ppoly正确地遵从协议,使用证明人 ω 生成 x,Vpoly将百分之百接受。

3.知识健全性(Knowledge Soundness):存在一个有效的 E 即给定对Ppoly的消息的访问权,给到 I ,输出ω,使得对于Ppoly的任何策略,下列事件的概率为negl(λ)。

​ a.在协议的末尾,Vpoly输出acc,并且

​ b. (x, ω) ∉ R

结论 4.4. 我们故意不为理想的协议定义零知识属性,因为获得ZK取决于最终“编译”协议中泄漏给我的多项式的信息量。这又取决于用于编译的多项式承诺方案的具体细节。

4.1范围上的多项式协议

​ 在我们的协议中,Vpoly 实际上需要检查某些多项式方程式是否在输入值的特定范围内成立,而不是作为多项式恒等式。首次启发,对于子集 SF ,我们定义了一个S范围(d, D, t, l)的多项式协议,该协议与 a(d, D, t, l) 多项式协议相同,不同之处在于:验证者询问他的恒等式是否在S的所有点上都成立,而不是完全一样。然后,我们以与定义4.3中完全相同的方式为关系定义范围多项式协议。

​ 我们表明,将范围协议转换为多项式协议只会产生一个额外的证明者多项式。

引理4.5. 令P为R的范围S的(d, D, t, l)多项式协议。然后我们可以构造 a(max{d, |S|, D−|S|}, D, t+1, l+1),也就是R的多项式协议P∗。

本引理,我们使用以下简单声明。

断言4.6. 定义 F1,…,FkF <n[X]。定义 ZF <n[X]。假设部分 i ∈ [k],Z ∉ Fi。则:

1.有一种可能性,1/|F| 之上存在a1,…,ak ∈ F , Z 不属于 F
$$
F := \sum ^k _{j=1} a_j \cdot F_j
$$
2.假设 Z 在 F 上分解为不同的线性因子,有一种可能,k/|F|之上存在a,a∈F,Z不属于 F
$$
G:= \sum ^k _{j=1} a^ {j-1} \cdot F_j
$$
证明. Z|F 等同于 (F mod Z)=0. 另有 R:= (Fi mod Z), R ≠ 0,则R不为零二项式:
$$
F := \sum ^k _{j=1,j≠i} a_j \cdot F_j + a_i \cdot R(mod Z)
$$
因此,每一个特定的aj,最多有一个值 ai∈F,该F mod Z = 0。第一点证明完毕。

为了证明第二,类似地写:
$$
G := \sum ^k _{j=1,j≠i} a^{j-1} \cdot F_j + a^{i-1} \cdot R(mod Z)
$$
令 x ∈ F ,使 Z(x)=0,但 R(x)≠0。则 G mod Z = 0,即 G(x)=0,推导出 a 是非零多项式的根。
$$
g(Y) := \sum ^k _{j=1,j≠i} Y^{j-1} \cdot F_j(x) + Y^{i-1} \cdot R(x)
$$
最多k个a值是这种情况。

证明. (引理4.5.) 令P为范围S的(d, D, t, l)多项式协议。构建P*,同P一致,附加条件是 Zs(X) :=∏(X-a), a∈S。P* 的执行与P 一致,直到Vpoly在S域内请求恒等式。假设验证者请求 k 个恒等式:F1(X),…,Fk(X),Fi的总维度的最大值是D,如定义4.1.所讲。P* 处理如下:

  • Vpoly发送队列a1,…,ak ∈ F 给到Ppoly。

  • Ppoly计算二项式
    $$
    T:=\frac {\sum a_i \cdot F_i} {Z_S} ,i∈[k]
    $$

  • Ppoly发送 T 给到 I

  • Vpoly查询恒等式

$$
\sum _{i∈[k]} a_j \cdot F_i(X) ≡ T \cdot Z_S
$$

遵循断言4.6,即有一种可能性,1/|F| 基于Vpoly的选择的a1,…,ak之上,适当的 T∈F[X]等同于F1,…,Fk,消失于范围S之中。这等效于Vpoly在P的类似执行中输出acc。

4.2从多项式协议到代数协议。

离散对数甚至许多Diffie-Hellman式的问题都很困难。因此,打破具体小组中这种普遍困难的假设的唯一方法是以非平凡的方式使用基础小组表示形式。基于此,GGM(generic group model)可以非常有用地进行完整性检查,以验证给定假设的有效性,甚至可以保证给定密码方案的安全性。但是,GGM无法实施:GGM中存在安全的加密方案,但是在与任何具体组实例化时都不安全。

​ AGM(algebraic group model)只考虑代数对象。一个代数对象A可以任意使用群组中的元素,但是必须根据输入组元素对其输出组元素中的任何一个提供显式分解,即A还必须输出一个解释,说明如何使用组操作从其输入中计算其输出中的任何组元素。

​ 我们希望使用Section 3的多项式承诺方案,将一个多项式协议编译成在代数组模型中具有知识健全性的协议(在第2.2节中定义)。

​ 具体证明略。

减少字段元素的数量 :我们描述了Mary Maller进行的优化,以减少来自M的证明中的F元素的数量。我们从一个说明性示例开始。假设V希望检查恒等式h1(X)·h2(X)-h3(X)≡0。上述编译将使P以随机x∈F方式发送h1,h2,h3。V将检查h1(x)h2(x)-h3(x)=0。因此,P发送了三个字段元素。

​ 但是请注意,我们可以让P只发送c:= h1(x),然后在开放协议中简单地验证多项式L(X):=c·h2(X)-h3(X)是否在x处为零。请注意,我们可以计算com(L)= c·com(h2)-com(h3)

Vitalik: An attempt at an explanation-in-pictures for how bulletproof-style polynomial commitments work (relevant to Halo and potentially future ethereum upgrades for better scalability) I welcome feedback! I’m trying to experiment with new approaches to make crypto math more intuitive.