Zhuang's Diary

言之有物,持之以恒

定义

​ 椭圆曲线和很多学习完基础代数之后见过的方程差不多。y在等号的左边,而x在等号的右边。椭圆曲线有如下的形式:
$$
y^2 = x^3+ax+b
$$
​ 你肯定接触过其他类似的方程。比如,在基础代数课上就学过线性函数:
$$
y=mx+b
$$
​ 你可能还记得m叫作斜率,b叫作截距。你也能画出线性函数图像。类似地,你可能也熟悉二次函数和它的图像:
$$
y=ax^2+bx+c
$$
​ 在学习代数时,你还接触过更高阶的函数比如三次函数及其图像。
$$
y=ax^3+bx^2+cx+d
$$
​ 椭圆曲线和他们没有太大的区别。椭圆曲线和三次函数不同的地方在于等号左边是y的平方,这使得函数图像沿x轴对称:
$$
y^2 = x^3 + ax + b
$$

​ 因为椭圆曲线的等号左边是y的平方,所以它也不像三次函数那样陡峭。此外,椭圆曲线可能是不想接的,如下图:

​ 比如,比特币使用的椭圆曲线被称为secp256k1,使用下面的方程:
$$
y^2=x^3+7
$$

椭圆曲线的加法

过曲线上的两点A、B画一条直线,找到直线与椭圆曲线的交点,交点关于x轴对称位置的点,定义为A+B,即为加法。如下图所示:A + B = C

​ 椭圆曲线因其点加法运算(point addition)而被广泛使用。

椭圆曲线的二倍运算

​ 上述方法无法解释A + A,即两点重合的情况,因此在这种情况下,将椭圆曲线在A点的切线,与椭圆曲线的交点,交点关于x轴对称位置的点,定义为A + A,即2A,即为二倍运算。

同余运算

​ 同余就是有相同的余数,两个整数 a、 b,若它们除以正整数 m所得的余数相等,则称 a,b对于模m同余。
$$
a≡b (mod m)
$$

有限域

​ 椭圆曲线是连续的,并不适合用于加密,所以必须把椭圆曲线变成离散的点,要把椭圆曲线定义在有限域上。而椭圆曲线密码所使用的椭圆曲线是定义在有限域内,有限域最常见的例子是有限域GF(p),指给定某质数p,由0,1,2…,p-1共p个元素组成的整数集合中加法、二倍运算。例如GF(233)就是:
$$
y^2=(x^3+7) (mod 223)
$$
详见上一篇帖子。

乘法逆元

在模7乘法中:

  • 1的逆元为1 (1*1)%7=1
  • 2的逆元为4 (2*4)%7=1
  • 3的逆元为5 (3*5)%7=1
  • 4的逆元为2 (4*2)%7=1
  • 5的逆元为3 (5*3)%7=1
  • 6的逆元为6 (6*6)%7=1

数学解释

​ 并不是所有的椭圆曲线都适合加密,上述是一类可以用来加密的椭圆曲线,也是最为简单的一类。

针对曲线Ep(a,b)表示为:
$$
y^2=x^3+ax+b(mod p), x,y \in [0,p],p为质数
$$
​ 该曲线关于x轴对称。选择两个满足下列条件的小于p(p为素数)的非负整数a、b,要求满足以下条件:
$$
4a^3+27b^2≠0(mod p),a和b是小于p的非负整数
$$
1、有限域的负元

​ P(x,y)的负元是(x,-ymodp)=(x,p-y)

2、有限域的加法,P+Q

​ P(x1,y1),Q(x2,y2)和R(x3,y3)三点,其中R是PQ直线与曲线的交点的关于x轴的对称点,即 R=P+Q,有如下关系:
$$
x_3≡k^2-x_1-x_2(modp),y_3≡k(x_1-x_3)-y_1(modp)
$$
3、斜率计算

​ 若P=Q,即计算P点切线,则
$$
k=(3x_2+a) \div (2y_1)
$$
​ 若P≠Q,则
$$
k=(y_2-y_1) \div (x_2-x_1)
$$

椭圆曲线加解密算法原理

​ 设私钥、公钥分别为d、Q,即Q = dG,其中G为基点,椭圆曲线上的已知G和dG,求d是非常困难的,也就是说已知公钥和基点,想要算出私钥是非常困难的。其中基点是椭圆曲线上选择的一个点,这个点能够保证满足dG=∞的最小正整数n足够大,也就是阶足够大。1<私钥<n,大于n的私钥必能在[1,n)中找到对应的私钥b使得aG=bG,换句话说也就是有足够多的私钥。
公钥加密:选择随机数r,将消息M生成密文C,该密文是一个点对,C = {rG, M+rQ},其中Q为公钥。
私钥解密:M + rQ - d(rG) = M + r(dG) - d(rG) = M,其中d、Q分别为私钥、公钥。

椭圆曲线签名算法原理

​ 椭圆曲线签名算法(ECDSA)。设私钥、公钥分别为d、Q,即Q = dG,其中G为基点。

私钥签名:

  • 选择随机数r,计算点rG(x, y)。
  • 根据随机数r、消息M的哈希h、私钥d,计算s = (h + dx)/r。  
  • 将消息M、和签名{rG, s}发给接收方。

公钥验证签名:  

  • 接收方收到消息M、以及签名{rG=(x,y), s}。  
  • 根据消息求哈希h。  
  • 使用发送方公钥Q计算:hG/s + xQ/s,并与rG比较,如相等即验签成功。
    原理:hG/s + xQ/s = hG/s + x(dG)/s = (h+xd)G/s = r(h+xd)G / (h+dx) = rG

签名过程

​ 假设要签名的消息是一个字符串:“Hello World!”。DSA签名的第一个步骤是对待签名的消息生成一个消息摘要,不同的签名算法使用不同的消息摘要算法,而ECDSA256使用SHA256生成256比特的摘要。

​ 摘要生成结束后,应用签名算法对摘要进行签名:

  • 产生一个随机数k
  • 利用随机数k,计算出两个大数r和s。将r和s拼在一起就构成了对消息摘要的签名。
    这里需要注意的是,因为随机数k的存在,对于同一条消息,使用同一个算法,产生的签名是不一样的。从函数的角度来理解,签名函数对同样的输入会产生不同的输出。因为函数内部会将随机值混入签名的过程。

验证过程

​ 关于验证过程,这里不讨论它的算法细节。从宏观上看,消息的接收方从签名中分离出r和s,然后利用公开的密钥信息和s计算出r。如果计算出的r和接收到的r值相同,则表示验证成功,否则,表示验证失败。

有限域的定义

​ 有限域的数学定义是一个有限的数字集以及两个运算+(加法)和·(乘法),并且满足下面的性质:

1.如果a和b属于集合,则a+b和a·b也属于集合。我们称此性质为封闭性。

2.存在0使得a+0=a。我们称此性质为加法恒等。

3.存在1使得a·1=a,我们称此性质为乘法恒等。

4.如果a属于集合,则-a属于集合;满足a+(-a)=0。我们称此性质为加法逆。

5.如果a属于集合,
$$
则 a^{-1}属于集合,满足 a \cdot a^{-1}=1。我们称此性质为乘法逆。
$$
​ 我们来进一步分析这些准则。

​ 有一个有限的数的集合,因为集合是有限的,所以可以把集合大小定义为p,我们称之为集合的阶。

​ 性质1要求对加法和乘法封闭。这意味着定义加法和乘法时要使其运算结果仍然属于集合。比如集合{0,1,2}并不对加法封闭,因为1+2=3,3不在集合内;同理2+2=4也不符合定义。当然,可以对加法定义做一些修改来使其满足有限域的性质,但是“常见”的加法并不能使这个集合组成有限域。另外,集合{-1,0,1}对正常的乘法是封闭的。任意两个集合内的元素(共有9种组合)其乘积仍然属于集合。

​ 另一个选项是对乘法重新定义以满足有限域的封闭性。但是其核心概念是这里定义的加法和减法不同于我们熟悉的加法和减法。

​ 性质2和性质3意味着必须要有加法和乘法恒等元,也就是0和1必须在集合内。

​ 性质4意味着有加法逆。如果a在集合内,-a也在集合内,通过使用加法逆运算,我们可以定义减法。

​ 性质5意味着乘法有着相同的性质,如果a在集合内,则a-t也在集合内,即a·a’=1,通过乘法逆,我们可以定义除法。这是定义一个有限域最难的部分。

定义有限集合

​ 如果集合的阶(大小)是p,我们可以说该集合的元素有0,1,2,3,…,p-1。把这些数称为集合的元素,而不必称其为传统的数字0,1,2,3等。这些集合的元素在很多方面和传统数字一致,但是在如加法、减法和乘法等运算上仍有一些地方不太一样。有限域的数学表示如下:
​ Fp={0,1,2,…,p-1}构成有限域的是集合的元素。Fp是一个特定的有限域,读作“阶数为p的域”(field of p)、“阶数为29的有限域”或者其他阶数(重申:数学家把集合大小称为阶)。{}之间的数字代表域中的元素。我们将这些元素命名为0,1,2等,因为这些名字便于使用。

一个阶数为11的域如下:
F11={0,1,2,3,4,5,6,7,8,9,10}

一个阶数为17的域如下:
F17={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}

一个阶数为983的域如下:
F983={0,1,2,…,982}

​ 注意,域的阶数总是比最大元素大1。你可能注意到了每次我们给出的域的阶数都是质数。出于很多之后才能解释清楚的原因,域的阶数必须为质数的整数次幕,其中阶数为质数的有限域是我们特别关心的。

论文原文 ==> 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∈**F**n 为选择器向量,每个选择器向量的阶数为n。

x∈*F***m,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∈*F**l,l为阶数,ω∈F***m_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.XF,*F*的阶数为m,令XPpoly的公共输入X。P**poly计算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}→**F**p来模拟随机预言。

共同的预处理输入:
$$
\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.**P
poly计算 *
Z*** ∈ F <n[X],且*Z*(g)=1;并且对于 i∈{2,…,n}
$$
Z(g^i)=\sum _{1 \leq l \leq i} f’(g^j)/g’(g^j)
$$
5.**P
poly发送*
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