本文介绍了 Circle STARKs,它通过利用具有最快有限域算术的梅森素数,展示了卓越的性能。Circle STARKs 通过移动到圆群来解决梅森素数上定义的字段的非平滑结构,并密切遵循其经典的 STARKs 类似物,虽然有一些细微之处,但幸运的是,大多数细微之处都对开发人员隐藏了,Circle STARKs 以及高效的查找可以帮助提高通用 ZKVM 的性能。
可扩展的、透明的知识论证(STARKs)由于其在可验证计算和区块链可扩展性方面的应用而受到了广泛关注。我们可以使用 STARKs 生成一个简短的字符串,证明计算的完整性,并且验证者可以非常快速地验证它。生成 STARK 证明的步骤包括:
STARKs 的效率取决于在平滑域上工作,在那里我们可以使用基数-2 Cooley-Tukey 快速傅里叶变换(FFT)来执行快速插值和求值。如果 p−1=2mcp−1=2mc,其中 mm 足够大,且 cc 是一个奇数,我们就说这个域是平滑的。 具有此属性的域的示例包括 STARK-252、264−232+1(有时称为 Mini-Goldilocks 或 oxfoi 素数)、 231−227+1(Baby Bear)。
STARKs 的主要优点之一是,我们可以在“小域”上工作(它们的大小小于密码安全性所需的大小),从而减少了表示执行轨迹/虚拟机中的变量所需的开销。然后,我们可以从一个扩展域中采样随机性,以实现密码安全性。Binius 展示了如何使用二进制域以零开销表示变量。
在本文中,我们将解释 Circle STARKs,如何使用圆群来访问非常快的模算术,以及为什么我们需要某些属性才能在圆群上执行 STARKs。为此,我们需要开发经典 STARKs 的圆形类似物:二元多项式、平滑域、圆代码、消失多项式、FFT 和 FRI。虽然许多东西看起来与它们的经典类似物非常接近,但出现了一些微妙之处和特殊的限制或点,我们应该小心。如果你想看看这些原语是如何实现的,可以查看 Starkware 的 prover Stwo、Polygon 的 Plonky3 和 Vitalik 的 python 实现。如果你需要回顾一下经典 STARKs,请参阅 post 1 和 post 2。
梅森素数的形式为 2p−12p−1,其中 pp 是素数(对于每个素数 pp,2p−12p−1 并不总是素数)。它们具有很好的归约公式(因为 2p≡1(mod2p−1)2p≡1(mod2p−1)),并且可以进行非常快的模算术运算(这反过来对 STARKs 的性能至关重要)。一些梅森素数是:
在 STARKs 中使用梅森素数的问题是 p−1=2cp−1=2c,其中 cc 是奇数,这意味着它们不平滑。这样,我们就无法使用 FFT 有效地执行插值。解决这个问题的方法是让插值域位于梅森素数的二次扩展中,如 此处 所述。但是,这种方法不太适合约束评估(商计算),从而限制了 zkvms 中经常遇到的轨迹的性能。
可以通过切换到由梅森素数给出的域上的圆曲线 x2+y2=1x2+y2=1 来避免这些缺点。圆,配备了从域上的旋转群继承的操作,是一个循环群。此外,元素的数量等于 q+1q+1。对于梅森素数,这意味着 q+1=2pq+1=2p。
梅森素数也满足 q≡3(mod4)q≡3(mod4),这意味着 x2+1 在 qq 上是不可约的。我们将让 ii 满足 i2=−1i2=−1,并使用 FqFq 的扩展 FF。为了与论文的表示法保持一致,F(i)F(i) 是基域 FF 的二次扩展。
我们将 F[x]dF[x]d 表示阶数至多为 dd 的单变量多项式,并将 F[x,y]dF[x,y]d 表示阶数至多为 dd 的二元多项式。例如,x+2x5+x34x+2x5+x34 在 Fq[x]36Fq[x]36 中,但 x56+1x56+1 不在。类似地,1+xy2+x34+y35+x12y121+xy2+x34+y35+x12y12 在 Fq[x,y]64Fq[x,y]64 中,但 x32y34+x12+25x32y34+x12+25 不在。
在 circle STARKs 中,我们将处理模 x2+y2−1x2+y2−1 的二元多项式。由于 y2=x2−1y2=x2−1,我们总是可以将多项式 F[x,y]dF[x,y]d 表示为
f(x,y)=f0(x)+yf1(x)
我们称之为多项式的规范表示。例如,假设我们有以下多项式
p(x,y)=x+4y3+5x2y5+xy6
我们可以替换 y2=x2−1 得到
p(x,y)=x+4y(x2−1)+5x2y(x2−1)2+x(x2−1)3
由此,我们得到
f0(x)=x+x(x2−1)3
f1(x)=4(x2−1)+5x2(x2−1)2
这种分解对于计算 circle FFT 和 FRI 非常有用。f0(x)f0(x) 和 f1(x)f1(x) 的一个优点是它们都是单变量的,这将为后续步骤带来额外的简单性和性能(我们唯一需要注意的是 xx 的平方映射的结构。代替 x→x2,我们有 x→2x2−1)。
圆上的点是满足方程 x20+y20=1x02+y02=1 的点对 (x0,y0)(x0,y0)(坐标在域 FF 中)。我们可以通过考虑以下运算来引入群结构,
(x0,y0)⋅(x1,y1)=(x0x1−y0y1,x0y1+x1y0)(x0,y0)⋅(x1,y1)=(x0x1−y0y1,x0y1+x1y0)
如果我们固定 P=(Px,Py)P=(Px,Py),我们可以定义由 PP 旋转,TP(x,y)=(x0Px−y0Py,x0Py+Pxy0)TP(x,y)=(x0Px−y0Py,x0Py+Pxy0)。当我们需要评估转移约束时,此操作非常重要。例如,如果我们想检查我们是否正在计算斐波那契数列,我们需要证明 an+2=an+1+anan+2=an+1+an。 如果我们有轨迹多项式 t(x)t(x),我们可以通过乘以 ωω(插值域的生成元),得到 xx 的下一个元素,并使斐波那契约束为 t(ω2x)=t(ωx)+t(x)t(ω2x)=t(ωx)+t(x)。 如果我们选择 PP 作为(圆)插值域的生成元,我们可以使用相同的想法来编写这些约束。
逆可以很容易地计算出来:如果 P=(x,y)P=(x,y),则 −P=(x,−y)−P=(x,−y)。
一个重要的映射是平方映射,π(x,y)=(x2−y2,2xy)=(2x2−1,2xy)π(x,y)=(x2−y2,2xy)=(2x2−1,2xy)。我们可以看到,第一个分量仅取决于 xx。当作用于子群或特殊陪集(称为孪生位置陪集)时,平方映射会产生一个二对一的归约。圆群上的运算在 Stwo 中实现。
要了解有关圆上的域或陪集类型的更多信息,请参阅 Plonky3 的实现。
圆代码是通过在 FqFq 上的圆群的一个合适的子集 DD 上评估多项式 f(x,y)f(x,y) 获得的。可以证明,它与 Reed-Solomon 码存在一一对应关系(基本上,圆代码就是 Reed-Solomon 码)。
在经典 STARKs 中,我们需要计算集合上的消失多项式,然后生成商。我们需要找到这些消失多项式在 circle STARKs 中的样子。有趣的结果是,消失多项式将是单变量的,v(x)v(x)。 阶数为 nn 的消失多项式可以在 log(n)log(n) 个运算中有效地计算出来:一次平方、一次加倍和一次减一。消失多项式是:
v1(x)=xv1(x)=x
v2(x)=2x2−1v2(x)=2x2−1
v3(x)=2(x2−1)2−1v3(x)=2(x2−1)2−1
v4(x)=2((x2−1)2−1)2−1v4(x)=2((x2−1)2−1)2−1
v5(x)=2(((x2−1)2−1)2−1)2−1v5(x)=2(((x2−1)2−1)2−1)2−1
你可以查看如何在 Stwo 中评估消失多项式。
与经典 STARKs 的情况一样,如果 vH(x)vH(x) 和 vJ(x)vJ(x) 是集合 HH 和 JJ 上的消失多项式,则商 vH(x)/vJ(x)vH(x)/vJ(x) 是 H∖JH∖J 上的消失多项式。 这样,我们可以有效地计算应用于 H∖JH∖J 的约束。
逆 FFT 接受一个评估向量,并生成多项式在某个基上的坐标。FFT 接受基上的坐标,并生成一组评估。我们习惯于使用单项式基 1,x,x2,x3,...xn1,x,x2,x3,...xn,但还有其他可用选项。在 circle FFT 的情况下,基看起来更复杂,但请记住,我们想要的只是将值编码为多项式,然后在更大的域上评估它们。对于涉及 nn 个元素的 FFT,令 j0j1j2…jn−1j0j1j2…jn−1 是 0≤k≤n−10≤k≤n−1 的二进制分解,即 k=j0+2j1+4j2+…2n−1jn−1k=j0+2j1+4j2+…2n−1jn−1。第 kk 个基多项式由下式给出:
bk(x,y)=yj0v1(x)j1v2(x)j2…vn−1(x)jn−1bk(x,y)=yj0v1(x)j1v2(x)j2…vn−1(x)jn−1
为了澄清表达式,这里我们有第一个基多项式,
b0(x)=1b0(x)=1
b1(x)=yb1(x)=y
b2(x)=v1(x)=xb2(x)=v1(x)=x
b3(x)=yv1(x)=xyb3(x)=yv1(x)=xy
b4(x)=v2(x)=2x2−1b4(x)=v2(x)=2x2−1
b5(x)=yv2(x)=y(2x2−1)b5(x)=yv2(x)=y(2x2−1)
b6(x)=v1(x)v2(x)=x(2x2−1)b6(x)=v1(x)v2(x)=x(2x2−1)
如果我们需要在 βnβn 个点上评估一个 nn 阶多项式,β≥2β≥2,我们可以毫无问题地对多项式进行零填充。
在 FFT 的第一步中,我们使用多项式的规范表示的拆分,p(x,y)=f0(x)+yf1(x)p(x,y)=f0(x)+yf1(x)。 以下步骤处理单变量多项式 fj(x)fj(x),我们可以在其中应用偶奇分解,同时考虑到平方映射遵循圆运算。换句话说,
fj,e(2x2−1)=(fj(x)+fj(−x))/2fj,e(2x2−1)=(fj(x)+fj(−x))/2
fj,o(2x2−1)=(fj(x)−fj(−x))/2xfj,o(2x2−1)=(fj(x)−fj(−x))/2x
我们可以继续分解所有内容,直到我们可以直接求解 FFT,使用 蝴蝶。
第一步的旋转因子与第二步使用的旋转因子不同。
当我们对轨迹多项式施加约束并计算商时,我们得到组合多项式。它的阶数取决于约束的最大阶数,我们可能需要将其分成几个块。在单变量的情况下,我们可以按如下方式进行分解:
p(x)=p0(x)+xn+1p1(x)+x2n+2p2(x)p(x)=p0(x)+xn+1p1(x)+x2n+2p2(x)
每个 pk(x)pk(x) 的阶数最多为 nn。在 circle STARKs 中,分解为函数 q1,q2,...qdq1,q2,...qd 和参数 λλ,使得
p=λvH(x)+∑kvHqk/vHkp=λvH(x)+∑kvHqk/vHk
其中 HkHk 是大小为 nn 的不相交孪生陪集,它们的并集产生 HH。 由于论文中讨论的维度差距,需要额外的参数 λλ。
Circle FRI 在经典 FRI 方面面临一些修改。 首先,我们需要将我们将应用 FRI 的函数分解为 f=g+λvn(x)f=g+λvn(x)。 这种分解对于确保函数空间在每个折叠步骤中减半,并在协议结束时达到常数函数空间至关重要。折叠遵循与我们在 circle FFT 中遇到的类似的程序;在第一次折叠后,我们必须处理单变量函数和平方映射 x→2x2−1x→2x2−1。
Circle STARKs 通过利用梅森素数(具有已知的最快有限域算术)已经显示出 惊人的性能。它们能够通过移动到圆群来绕过在梅森素数上定义的域的非平滑结构,但密切遵循其经典的 STARKs 类比(尽管有一些细微之处)。 幸运的是,大多数这些细微之处都对开发人员隐藏了,并且 circle STARKs 以及有效的查找(例如那些基于 LogUp 和 GKR 的查找)可以帮助提高通用 zkvms 的性能。
我们采访了正在开发 Iroh 的团队,Iroh 是一个即开即用的 Rust 点对点库。
介绍 互动证明是证明者 PP 和验证者 VV 之间的协议,其中证明者试图使验证者确信声明的有效性。 通过利用随机性和交互性,验证者可以比通过做所有事情更有效地检查状态。
- 原文链接: blog.lambdaclass.com/an-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!