1. 引言
近2年来,STARK协议设计的最重要趋势是转向了小域。详情可参看:STARKs with small finite field:小域带来的迷人性能。
- 最早的STARK生产级实现,采用的是256-bit域大数模运算,如stone 所使用的有限域为
p
=
2
251
+
17
⋅
2
192
+
1
=
0
x
800000000000011000000000000000000000000000000000000000000000001
=
3618502788666131213697322783095070105623107215331596699973092056135872020481
p=2^{251}+17\cdot 2^{192}+1=0x800000000000011000000000000000000000000000000000000000000000001\\=3618502788666131213697322783095070105623107215331596699973092056135872020481
p=2251+17⋅2192+1=0x800000000000011000000000000000000000000000000000000000000000001=3618502788666131213697322783095070105623107215331596699973092056135872020481。
这种基于256-bit大有限域的协议:- 可很自然地与“基于椭圆曲线的签名验证” 相兼容,也更易于推理理解。
- 但会导致低效性:大多数情况下实际没有好办法来利用这些更大的数字,因此,最终导致的是空间的浪费,甚至是计算的浪费——根据Karatsuba algorithm,若基于4倍大的数字做乘法运算,其所需的计算时长需增加约9倍。
- 为此,STARKs开始转向小域:
- Plonky2中引入的Goldilocks域: p = 2 64 − 2 32 + 1 p=2^{64}-2^{32}+1 p=264−232+1
- Risc Zero中引入的BabyBear域: p = 2 31 − 2 27 + 1 = 15 ∗ 2 27 + 1 p=2^{31}-2^{27}+1=15*2^{27}+1 p=231−227+1=15∗227+1。目前主要用于RISC0 zkVM中。
- Plonky3中引入的Mersenne31域: p = 2 31 − 1 p=2^{31}-1 p=231−1。目前主要用于Starknet stwo、Polygon zkEVM以及Polygon Miden、Succinct SP1 zkVM等项目中。
切向了小域的STARK协议,其证明速度得到了大幅提升,如:
- StarkWare在M3笔记本上,其stwo prover每秒可证明62万次Poseidon哈希运算。
- 这即意味着,将这样的Poseidon2 哈希函数用于构建高效 zkEVM,可高效解决其中最难的部分之一。
本文将介绍:
- 采用小域背后的技术原理?
- 如何基于小域来构建,因安全性要求通常需要大数的密码学证明?
- 基于小域构建的STARK协议,与,Binius等更奇特的结构相比如何?更多Binius信息可参看Irreducible团队2023年11月20日博客:Binius: a Hardware-Optimized SNARK。
- 重点关注一种名为Circle STARKs的构造——具有一些独特的属性,旨在与高效的Mersenne31域兼容。
相关Circle STARKs开源代码实现有:
- Starkware的stwo:https://github.com/starkware-libs/stwo(Rust)
- Polygon的plonky3:https://github.com/Plonky3/Plonky3(Rust)
- Vitalik的python实现:https://github.com/ethereum/research/tree/master/circlestark(Python)
Circle STARKs与常规STARKs的主要区别在于:
- 1)小域及其扩域( p = 2 31 − 1 p=2^{31}-1 p=231−1) vs. 256-bit域
- 2)circle group vs. 常规乘法子群
- 3)Circle FRI vs. 常规FRI
- 4)Circle FFT vs. 常规FFT
- 5)Quotienting求商:添加dumy点的 ( a x + b y + c ) (ax+by+c) (ax+by+c) vs. ( X − x ) (X-x) (X−x)
- 6)vanishing多项式: Z n + 1 ( x , y ) = ( 2 ∗ Z n ( x , y ) 2 ) − 1 Z_{n+1}(x,y)=(2*Z_n(x,y)^2)-1 Zn+1(x,y)=(2∗Zn(x,y)2)−1【其中 Z 1 ( x , y ) = y Z_1(x,y)=y Z1(x,y)=y, Z 2 ( x , y ) = x Z_2(x,y)=x Z2(x,y)=x。】 vs. x n − 1 x^n-1 xn−1【本质上有 x n − 1 = ( x − 1 ) ⋅ ( x − w ) ⋅ ( x − w 2 ) ⋯ ( x − w n − 1 ) x^n-1=(x-1)\cdot(x-w)\cdot (x-w^2)\cdots (x-w^{n-1}) xn−1=(x−1)⋅(x−w)⋅(x−w2)⋯(x−wn−1),其中 w n = 1 w^n=1 wn=1, { 1 , w , w 2 , ⋯ , w n − 1 } \{1,w,w^2,\cdots,w^{n-1}\} {1,w,w2,⋯,wn−1}为原始evaluation domain。】
- 7)多项式evaluations排布:“folded reverse bit order” vs. “reverse bit order”
- 8)效率(计算表达所占空间): 2 31 2^{31} 231-bit vs. 2 256 2^{256} 2256-bit 【通常 N N N-step计算中所用数值均 < N <N <N,且实际有 N < = 2 25 N<=2^{25} N<=225】
维度 | 常规STARKs | Circle STARKs |
---|---|---|
域 | 256-bit域 | 小域及其扩域( p = 2 31 − 1 p=2^{31}-1 p=231−1) |
group | 常规乘法子群 | circle group |
FRI | 常规FRI | Circle FRI |
FFT | 常规FFT | Circle FFT |
Quotienting求商 | ( X − x ) (X-x) (X−x) | 添加dumy点的 ( a x + b y + c ) (ax+by+c) (ax+by+c) |
vanishing多项式 | x n − 1 x^n-1 xn−1【本质上有 x n − 1 = ( x − 1 ) ⋅ ( x − w ) ⋅ ( x − w 2 ) ⋯ ( x − w n − 1 ) x^n-1=(x-1)\cdot(x-w)\cdot (x-w^2)\cdots (x-w^{n-1}) xn−1=(x−1)⋅(x−w)⋅(x−w2)⋯(x−wn−1),其中 w n = 1 w^n=1 wn=1, { 1 , w , w 2 , ⋯ , w n − 1 } \{1,w,w^2,\cdots,w^{n-1}\} {1,w,w2,⋯,wn−1}为原始evaluation domain。】 | Z n + 1 ( x , y ) = ( 2 ∗ Z n ( x , y ) 2 ) − 1 Z_{n+1}(x,y)=(2*Z_n(x,y)^2)-1 Zn+1(x,y)=(2∗Zn(x,y)2)−1【其中 Z 1 ( x , y ) = y Z_1(x,y)=y Z1(x,y)=y, Z 2 ( x , y ) = x Z_2(x,y)=x Z2(x,y)=x。】 |
多项式evaluations排布 | “reverse bit order” | “folded reverse bit order” |
效率(计算表达所占空间) | 2 256 2^{256} 2256-bit 【通常 N N N-step计算中所用数值均 < N <N <N,且实际有 N < = 2 25 N<=2^{25} N<=225】 | 2 31 2^{31} 231-bit |
2. 小域的常见问题
当在生成hash-based proofs(或任意类型proof)时,最重要的“tricks”之一就是:
- 将证明,每个被承诺为随机点的多项式的evaluations,来代替证明知道这些底层多项式。
如,假设某证明系统要求:
- 为某多项式 A A A生成一个承诺值,该多项式 A A A必须满足,zkSNARK协议中常证明的claim类型—— A ( x ) + x − A ( w ∗ x ) = x N A(x)+x-A(w*x)=x^N A(x)+x−A(w∗x)=xN。
则该协议将要求:
- 1)step 1:选择随机坐标 r r r,并证明 A ( r ) + r − A ( w ∗ r ) = r N A(r)+r-A(w*r)=r^N A(r)+r−A(w∗r)=rN。
- 2)step 2:为证明 A ( r ) = c A(r)=c A(r)=c,转为证明 Q = A − c X − r Q=\frac{A-c}{X-r} Q=X−rA−c为一个多项式,而不是一个分数表达式。
若提前知道了 r r r,则可在该协议中作弊:
- 1)对于step 1:可设置 A ( r ) A(r) A(r)值为0,改造 A ( w ∗ r ) A(w*r) A(w∗r)满足 A ( r ) + r − A ( w ∗ r ) = r N A(r)+r-A(w*r)=r^N A(r)+r−A(w∗r)=rN方程式,然后令 A A A为穿过 r , w ∗ r r, w*r r,w∗r 这2个点的直线。
- 2)对于step 2:可生成任意的 Q Q Q,然后改造 A A A(甚至 A A A可为某分数表达式或其它非多项式表达式),来匹配满足“ Q = A − c X − r Q=\frac{A-c}{X-r} Q=X−rA−c为一个多项式,而不是一个分数表达式”。
为防止这类攻击:
- 要求在攻击者提供了
A
A
A之后,才选择随机值
r
r
r。
- Fiat–Shamir heuristic 为一种有趣的技术:将 r r r值设置为 A A A的哈希值。
- 有必要从足够大的集合内随机选择 r r r,使得攻击者无法猜测出所选 r 值 r值 r值。
在基于椭圆曲线的协议,以及2019年代的STARKs协议,对应都为:
- 所有计算都是基于256-bit数字的,因此选择的 r r r只为256-bit 随机数字,这样问题不大。
但当切换为更小域的STARKs构造时,就存在如下问题:
- 从中随机选择 r r r的集合不够大——只有约20亿个可能值,当攻击者想要为伪造proof时,仅需尝试20亿次——对于有决心的攻击者来说,这是相当可行的。
为此,针对基于小域的STARKs协议,有2种解决办法:
- 1)做多次random checks
- 2)扩域:更高效
2.1 解决方案一:做多次random checks
从直觉上看,做多次random checks,看起来更简单且有吸引力:
- 不对单个坐标 r r r进行检查,而是对4个随机坐标做重复检查。
这在理论上是可行的,但存在效率问题:
- 若处理的为基于size为
p
p
p域的,degree
<
N
<N
<N的多项式,则攻击者实际可伪造在
N
N
N个位置“look good”的bad多项式。
这样攻击者破解一轮该协议的概率为 N p \frac{N}{p} pN。- 如若 p = 2 31 − 1 , N = 2 24 p=2^{31}-1, N=2^{24} p=231−1,N=224,则意味着每轮仅可获得7-bit安全性,为此,需要的就不是4轮random check了,而需要约18轮 random check,才能抵御类似的攻击。
- 理想情况下,可再重复 k k k次,而仅从安全级别中减去一次 N N N值。【根据Schwartz-Zippel Lemma】
2.2 解决方案二:扩域(更高效)
扩域与复数很像,只不过是基于有限域的:
- 假设存在一个新值
i
i
i,满足
i
2
=
−
1
i^2=-1
i2=−1,则:
- 有乘法运算: ( a + b i ) ∗ ( c + d i ) = ( a c − b d ) + ( a d + b c ) i (a+bi)*(c+di)=(ac-bd)+(ad+bc)i (a+bi)∗(c+di)=(ac−bd)+(ad+bc)i
- 这样就可以基于 ( a , b ) (a,b) (a,b) pairs,而不仅是单个数字来做操作。
假设基于类似Mersenne或BabyBear这样的size约为 2 31 2^{31} 231的域:
- 基于其复数扩域,可从约 2 62 2^{62} 262个值集合中来随机选择 r r r。
可再次运用相同技术,不用 i i i而是重新定义一个不同的新值 w w w:
- 如对于Mersenne31,取 w w w满足 w 2 = − 2 i − 1 w^2=-2i-1 w2=−2i−1
- 对应乘法
(
a
+
b
i
+
c
w
+
d
i
w
)
∗
(
e
+
f
i
+
g
w
+
h
i
w
)
=
(a+bi+cw+diw)*(e+fi+gw+hiw)=
(a+bi+cw+diw)∗(e+fi+gw+hiw)=为:
注意,以上代码实现未优化,但展示了基本原则,可使用Karatsuba algorithm算法进一步优化。
这样重复一次后:
- 就可实现从约 2 124 2^{124} 2124个值集合中来随机选择 r r r。
这样就足以满足所需的安全性:
- 若处理degree < 2 20 <2^{20} <220的多项式,则每轮可获得104-bit 安全性。
- 若想变得多疑,并达到更广泛接受的128-bit 安全级别,可在协议中添加一些proof of work(即eth-stark论文中的grinding技术)。
该 ( a + b i + c w + d i w ) (a+bi+cw+diw) (a+bi+cw+diw)二次复数扩域,实际上仅用于:
- 1)FRI协议中
- 2)以及其他需要随机线性组合的情况。
而大量的数学运算:
- 是仅基于“base field”来操作的。所谓base field,即 p = 2 31 − 1 p=2^{31}-1 p=231−1或 p = 15 ∗ 2 27 + 1 p=15*2^{27}+1 p=15∗227+1之类的。
- 且,几乎所有的被哈希数据,都是基于base field的。——即每个被哈希的值仅为4字节。
这样,就:
- 既能受益于小域的效率,
- 又能在需要时出于安全考虑进入更大的域。
3. 常规FRI协议
当构建SNARK或STARK时,第一步通常是:
- 算术化:将任意计算问题,reduce为,一个方程式——其某些变量和系数为多项式。
算术化后的方程式通常如:
C
(
T
(
x
)
,
T
(
n
e
x
t
(
x
)
)
)
=
Z
(
x
)
∗
H
(
x
)
C(T(x),T(next(x)))=Z(x)*H(x)
C(T(x),T(next(x)))=Z(x)∗H(x)
其中:
- C , n e x t , Z C, next, Z C,next,Z是公开已知的, T T T和 H H H是需prover提供的。
一旦有类似这样的方程式,对该方程式的解,即对应为对其底层计算问题的解。
prover为证明其知道该方程式的解,需证明:
- 其提供的值为real polynomials,而不是分数,或在某处看起来像某多项式而在另一处看起来是另一不同多项式 的数据集,
- 且,这些多项式具有特定的最大degree。
为此,需迭代地应用随机线性组合技巧:
- 假设prover已知某多项式 A A A的evaluations,且想要证明该多项式的degree 为 < 2 20 <2^{20} <220。
- 针对2个多项式: B ( x 2 ) = A ( x ) + A ( − x ) 2 B(x^2)=\frac{A(x)+A(-x)}{2} B(x2)=2A(x)+A(−x)和 C ( x 2 ) = A ( x ) − A ( − x ) x C(x^2)=\frac{A(x)-A(-x)}{x} C(x2)=xA(x)−A(−x)。
- 令 D D D为随机线性组合多项式 B + r C B+rC B+rC。
本质上:
- B B B过滤掉了 A A A的奇数项系数,即只包含了偶数项系数。
- C C C过滤掉了 A A A的偶数项系数,即只包含了奇数项系数。
若已知多项式 B , C B,C B,C,则可恢复出多项式 A A A,因为有:
- A ( x ) = B ( x 2 ) + x C ( x 2 ) A(x)=B(x^2)+xC(x^2) A(x)=B(x2)+xC(x2)
且若 A A A真的具有degree < 2 20 <2^{20} <220,则有:
- 1) B 和 C B和C B和C的degree < 2 19 <2^{19} <219。
- 2)且 B 和 C B和C B和C的随机线性组合 D D D,也必须满足degree < 2 19 <2^{19} <219。
这样,就将:
- “prove degree < 2 20 <2^{20} <220” 问题,reduce为了,“prove degree < 2 19 <2^{19} <219” 问题。
重复以上流程20次,本质对应的即为名为“FRI”技术(详情见2018年论文Fast Reed-Solomon Interactive Oracle Proofs of Proximity)。
若有人试图在FRI协议中插入一个degree 不是 < 2 20 <2^{20} <220的多项式,则:
- 第二轮输出将为:degree不是 < 2 19 <2^{19} <219的多项式(概率高达 ≈ 1 − 1 2 124 \approx 1-\frac{1}{2^{124}} ≈1−21241)
- 第三轮输出将为:degree不是 < 2 18 <2^{18} <218的多项式
- ……
- 最终,final check将失败。
对于,在大多数位置 与某degree < 2 20 <2^{20} <220多项式相等的某数据集,其有一定概率能通过以上FRI流程,但为构建类似的数据集,需要知道对应底层的多项式,因此,即使是这样一个有轻微缺陷的proof,也是一个令人信服的argument,prover如果愿意,也可以生成“real” proof。证明其适用于所有可能的输入还有更多的技术复杂性;在过去的五年里,理解这一细节一直是STARK学术研究的主要焦点。
具体为,在每一轮中:
- 1)将degree减半(即除以2):为FRI协议可行的关键。
- 2)同时也将domian(所对应的点集合size)减半(即除以2):即让FRI协议高效的关键:每一轮的点集size都比前一轮减半,总开销为 O ( N ) O(N) O(N)而不是 O ( N ∗ log ( N ) ) O(N*\log(N)) O(N∗log(N))。
为实现domain减半,需要two-to-one映射:
- { x , − x } → x 2 \{x,-x\}\rightarrow x^2 {x,−x}→x2
该映射的优点在于其是可重复的, 如对于某乘法子群(即 { 1 , w , w 2 , ⋯ , w n − 1 } \{1,w,w^2,\cdots,w^{n-1}\} {1,w,w2,⋯,wn−1}集合):
- 1)具有属性:对于任意的 x x x,若 x x x在该集合内,则 − x -x −x也在该集合内,因为 x = w k , − x = w k ± n 2 x=w^k,-x=w^{k\pm \frac{n}{2}} x=wk,−x=wk±2n。
- 2)若对该集合内每个元素内每个元素square求平方后,可获得
{
(
1
)
2
,
(
w
)
2
,
(
w
2
)
2
,
⋯
,
(
w
n
−
1
)
2
}
=
{
1
,
(
w
2
)
,
(
w
2
)
2
,
⋯
,
(
w
2
)
n
2
−
1
}
\{(1)^2,(w)^2,(w^2)^2,\cdots,(w^{n-1})^2\}=\{1,(w^2),(w^2)^2,\cdots,(w^2)^{\frac{n}{2}-1}\}
{(1)2,(w)2,(w2)2,⋯,(wn−1)2}={1,(w2),(w2)2,⋯,(w2)2n−1}新集合,也具有相同的属性——对于任意的
x
x
x,若
x
x
x在该新集合内,则
−
x
-x
−x也在该新集合内,因为
x
=
(
w
2
)
k
,
−
x
=
(
w
2
)
k
±
n
4
x=(w^2)^k,-x=(w^2)^{k\pm \frac{n}{4}}
x=(w2)k,−x=(w2)k±4n。
- 因此,重复以上square流程,可将集合reduce为仅有单个值——尽管实际应用时,可适当减少重复次数,reduce为size足够小的集合即可。
- 可将其想象为绕圆,每次square,会将绕圆圈数double。
- square前,某点在圆中所处角度为x°,则square之后,该点在圆中所处角度就变为了2x°。
- 每个在 0 ⋯ 179 0\cdots 179 0⋯179°位置的点,其在 180 ⋯ 359 180\cdots359 180⋯359°有一个对应点,square之后,每组对应点会重叠。
- 因此,可不断重复该流程。
- 因此,重复以上square流程,可将集合reduce为仅有单个值——尽管实际应用时,可适当减少重复次数,reduce为size足够小的集合即可。
为具有以上two-to-one映射重复性,要求原始的乘法子群size具有大的2次幂因子:
- 如BabyBear模为
p
=
15
∗
2
27
+
1
p=15*2^{27}+1
p=15∗227+1,其非零值组成的最大可能乘法子群size为
p
−
1
=
15
∗
2
27
p-1=15*2^{27}
p−1=15∗227,其中
2
27
2^{27}
227为大的2次幂因子,因此对以上two-to-one映射技术友好,可实现domain减半,提升FRI效率。
- 如可取size为 2 27 2^{27} 227的子群,或者直接取整个集合,运行FRI协议将多项式degree降低至15,然后直接检查该多项式的degree即可。
但是,Mersenne31模为 p = 2 31 − 1 p=2^{31}-1 p=231−1,其乘法子群size为 p − 1 = 2 31 − 2 p-1=2^{31}-2 p−1=231−2,其仅能被2整除一次,即其最大2次幂因子仅为2,因此无法做FFT运算——至少无法采用上述FRI技术——这是个悲剧。
不过对于使用现有32-bit CPU/GPU操作来做运算的话,Mersenne31域是个超级方便的域。
- 2个数求和结果 x x x可能超过 p = 2 31 − 1 p=2^{31}-1 p=231−1,但 x m o d p x\mod p xmodp可直接简化为: x → x + ( x > > 31 ) x\rightarrow x+(x>>31) x→x+(x>>31),其中 > > >> >>表示位右移。
- 2个数的乘积也类似,但需要一种特殊(但通常可用)的opcode,来返回乘积结果的“high-order bits”——即 f l o o r ( x y 2 32 ) floor(\frac{xy}{2^{32}}) floor(232xy)。
Mersenne31域的运算,要比BabyBear域运算,快约1.3倍。要是能基于Mersenne31域运行FRI协议,就能基于Mersenne31域构建STARKs。
3. Circle FRI协议
Circle STARKs所用的聪明技巧在于:
- 已知某素数
p
p
p,可很容易某具有类似two-to-one属性的group(称为circle group),该group size为
p
+
1
p+1
p+1,该group为由
(
x
,
y
)
(x,y)
(x,y) point所组成的集合,其中
x
2
+
y
2
=
1
x^2+y^2=1
x2+y2=1。如取
p
=
31
p=31
p=31,则相应circle group为:【以
(
30
,
0
)
(30,0)
(30,0)和
(
1
,
0
)
(1,0)
(1,0)构成x轴】
该circle group遵循加法定律,与Trigonometric Addition Formulas 或 Algebra of complex numbers multiplication 非常像:
(
x
1
,
y
1
)
+
(
x
2
,
y
2
)
=
(
x
1
x
2
−
y
1
y
2
,
x
1
y
2
+
x
2
y
1
)
(x_1,y_1)+(x_2,y_2)=(x_1x_2-y_1y_2,x_1y_2+x_2y_1)
(x1,y1)+(x2,y2)=(x1x2−y1y2,x1y2+x2y1)
有:
(
x
,
y
)
+
(
x
,
−
y
)
=
(
2
x
2
−
1
,
0
)
(x,y)+(x,-y)=(2x^2-1,0)
(x,y)+(x,−y)=(2x2−1,0)
倍加公式为:
2
∗
(
x
,
y
)
=
(
2
x
2
−
1
,
2
x
y
)
2*(x,y)=(2x^2-1,2xy)
2∗(x,y)=(2x2−1,2xy)
接下来,仅考虑circle group内“odd奇数”位置的points,见下图:
接下来就是做Circle FRI:
- 1)第一轮:将以上奇数位置points压缩到单条线(x轴),与“常规FRI协议”中的
B
(
x
2
)
,
C
(
x
2
)
B(x^2),C(x^2)
B(x2),C(x2)公式类似,在此有map:取偶数项系数
f
0
(
x
)
=
F
(
x
,
y
)
+
F
(
x
,
−
y
)
2
f_0(x)=\frac{F(x,y)+F(x,-y)}{2}
f0(x)=2F(x,y)+F(x,−y),和,取奇数项系数
f
1
(
x
)
=
F
(
x
,
y
)
−
F
(
x
,
−
y
)
2
y
f_1(x)=\frac{F(x,y)-F(x,-y)}{2y}
f1(x)=2yF(x,y)−F(x,−y)。
- 然后对
f
0
(
x
)
f_0(x)
f0(x)和
f
1
(
x
)
f_1(x)
f1(x)做随机线性组合,可获得一个基于x轴子集的one-dimensional(一维)
F
F
F:
- 然后对
f
0
(
x
)
f_0(x)
f0(x)和
f
1
(
x
)
f_1(x)
f1(x)做随机线性组合,可获得一个基于x轴子集的one-dimensional(一维)
F
F
F:
- 2)第二轮及以后:相应map修改为:取偶数项系数
f
0
(
2
x
2
−
1
)
=
F
(
x
)
+
F
(
−
x
)
2
f_0(2x^2-1)=\frac{F(x)+F(-x)}{2}
f0(2x2−1)=2F(x)+F(−x),和,取奇数项系数
f
1
(
2
x
2
−
1
)
=
F
(
x
)
−
F
(
−
x
)
2
x
f_1(2x^2-1)=\frac{F(x)-F(-x)}{2x}
f1(2x2−1)=2xF(x)−F(−x)
- 该map以以上集合为输入,每次运行该map,会将集合size减半。
- 不过在此
x
x
x所“代表”的是2个points:
(
x
,
y
)
(x,y)
(x,y)和
(
x
,
−
y
)
(x,-y)
(x,−y),且根据上面的加法定律有
x
→
2
x
2
−
1
x\rightarrow 2x^2-1
x→2x2−1——即取circle group上2个相反点的x坐标,并将其转换为这2个相反点求和后的x坐标。
- 如取最右侧倒数第二个值 2 2 2,应用该map,有 2 ( 2 2 ) − 1 = 7 2(2^2)-1=7 2(22)−1=7。
- 若回到原始circle group,则 ( 2 , 11 ) (2,11) (2,11)为从右逆时针第3个point,对其倍加运算 2 ∗ ( 2 , 11 ) = ( 7 , 13 ) 2*(2,11)=(7,13) 2∗(2,11)=(7,13),为从右逆时针第6个point。
从第二轮往后,都是基于1维来计算的,也可基于二维来计算,但1维运算效率会更高。
4. Circle FFTs算法
与FRI接近的算法为Fast Fourier Transforms(FFT)算法,FFT算法:
- 取某degree < n <n <n多项式的 n n n个evaluation集合,将其转换为,该多项式的 n n n个系数。
除了不在每轮对 f 0 , f 1 f_0,f_1 f0,f1做随机线性组合之外,FFT遵循与FRI相同的策略:
- FFT仅对 f 0 , f 1 f_0,f_1 f0,f1递归应用half-sized FFT,然后取 F F T ( f 0 ) FFT(f_0) FFT(f0)的输出为偶数项系数,取 F F T ( f 1 ) FFT(f_1) FFT(f1)的输出为奇数项系数。
circle group也支持FFT——也构建自FRI类似的方式。关键的区别在于:
- circle FFTs(和circle FRI)所基于的不是技术意义上的多项式。 而是数学意义上所谓的 Riemann-Roch space:
- 即为多项式"modulo" 该circle—— x 2 + y 2 − 1 = 0 x^2+y^2-1=0 x2+y2−1=0。
- 可将任意与 x 2 + y 2 − 1 x^2+y^2-1 x2+y2−1的乘积结果,等价为 0 0 0。
- 另一个维度来考虑即为:
- 仅允许degree-1 powers of y y y,一旦有 y 2 y^2 y2项,则将其替换为 1 − x 2 1-x^2 1−x2。
在常规FRI协议中,若输出为
[
6
,
2
,
8
,
3
]
[6,2,8,3]
[6,2,8,3],即对应多项式
P
(
x
)
=
3
x
3
+
8
x
2
+
2
x
+
6
P(x)=3x^3+8x^2+2x+6
P(x)=3x3+8x2+2x+6。而circle FFT输出的“系数”,与常规FRI协议中的单项式不同,circle FFT所输出的系数具有奇怪的basis,如:
{
1
,
y
,
x
,
x
y
,
2
x
2
−
1
,
2
x
2
y
−
y
,
2
x
3
−
x
,
2
x
3
y
−
x
y
,
8
x
4
−
8
x
2
+
1
,
⋯
}
\{1,y,x,xy,2x^2-1,2x^2y-y,2x^3-x,2x^3y-xy,8x^4-8x^2+1,\cdots\}
{1,y,x,xy,2x2−1,2x2y−y,2x3−x,2x3y−xy,8x4−8x2+1,⋯}
不过对于开发者来说,好消息在于,可几乎完全忽略这种奇怪的basis:
- STARKs无需让开发者知道这些系数,而总是将“多项式”存储为:某特定域内evaluations集合。
- STARKs中,开发者唯一需要使用FFT的地方在于:做(Riemann-Roch space类似的)low-degree extension:
- 已知 N N N个值,基于相同多项式生成 k ∗ N k*N k∗N个值。
- 这样可做一次FFT来生成该多项式的系数,并在系数之后附加 ( k − 1 ) N (k-1)N (k−1)N个零值,然后再做一次iFFT来获得更大的evaluation集合。
Circle FFTs不是唯一的奇特FFT类型。Elliptic Curve Fast Fourier Transform (ECFFT) 甚至更强大,因:
- ECFFT可基于任意有限域构建(如素数域、binary域等),而不要求具有大的2次幂因子。
- 但ECFFT理解起来更复杂,且更低效。
至此,借助circle group,可对Mersenne31域 p = 2 31 − 1 p=2^{31}-1 p=231−1,实现circle FFT运算。
5. Quotienting求商
STARK协议中,通常需在特定点求商,这些点:
- 要么是故意选择的
- 要么是随机选择的
如:
- 若想证明 P ( x ) = y P(x)=y P(x)=y,则可提供 Q = P − y X − x Q=\frac{P-y}{X-x} Q=X−xP−y,并证明 Q Q Q为一个多项式,而不是一个分数值。
DEEP-FRI协议中,采用随机选择的evaluation points,从而使得FRI是安全的——而具有更少的Merkle branches。
在此,面临一个微妙的挑战:
- 在circle group内,没有“类似常规FRI中只通过一个点的线性函数
X
−
x
X-x
X−x”
从几何角度来看很直观:
可构建某点 ( P x , P y ) (P_x,P_y) (Px,Py)的切线线性函数,该线性函数穿过该点但具有“multiplicity重数2”,即:
-
若某多项式为该线性函数的倍数,则对该多项式仅要求其在该点值为0是不够的,将还需要有更严格的条件。—— 即,不能仅在单个点 ( P x , P y ) (P_x,P_y) (Px,Py)就证明该多项式的某evaluation。
-
为此,必须通过2个点来证明该多项式的evaluation——即需要该circle group内的2个点,来唯一确定该线性函数。 这2个点:
- 其中一个为点 ( P x , P y ) (P_x,P_y) (Px,Py)
- 另一个为不关心其evaluation的某dummy点
P 1 , P 2 P_1,P_2 P1,P2这2个点的线性函数定义为:
其中,线性函数standard form表示为:
a
x
+
b
y
+
c
ax+by+c
ax+by+c,若将以上line_function()
的线性函数转换为方程式
a
x
+
b
y
+
c
=
0
ax+by+c=0
ax+by+c=0,即对应为穿过P1和P2的一条直线。
若有某多项式
P
P
P,其在
P
1
P_1
P1处值为
v
1
v_1
v1,在
P
2
P_2
P2处值为
v
2
v_2
v2:
- 可选择插值项
I
I
I:插值项
I
I
I为线性函数,其在
P
1
P_1
P1处值为
v
1
v_1
v1,在
P
2
P_2
P2处值为
v
2
v_2
v2。
- 可将插值项 I I I简单表示为: v 1 + ( v 2 − v 1 ) ∗ y − ( P 1 ) y ( P 2 ) y − ( P 1 ) y v_1+(v_2-v_1)*\frac{y-(P_1)_y}{(P_2)_y-(P_1)_y} v1+(v2−v1)∗(P2)y−(P1)yy−(P1)y,其中 y y y为变量,当 y = ( P 2 ) y y=(P_2)_y y=(P2)y时其值为 v 2 v_2 v2;当 y = ( P 1 ) y y=(P_1)_y y=(P1)y时,其值为 v 1 v_1 v1。
- 然后通过将 P P P减去 I I I(因 P − I P-I P−I在 P 1 , P 2 P_1,P_2 P1,P2点处的值均为0),然后除以 L L L( L L L为 P 1 , P 2 P_1,P_2 P1,P2这2个点间的线性函数),然后证明商 P − I L \frac{P-I}{L} LP−I为一个多项式,即可证明“多项式式 P P P在 P 1 P_1 P1处值为 v 1 v_1 v1且在 P 2 P_2 P2处值为 v 2 v_2 v2”。
6. Vanishing多项式
在STARK中,通常带证明的多项式方程式形如:
- C ( T ( x ) , T ( n e x t ( x ) ) ) = Z ( x ) ∗ H ( x ) C(T(x),T(next(x)))=Z(x)*H(x) C(T(x),T(next(x)))=Z(x)∗H(x)
其中:
-
Z
(
x
)
Z(x)
Z(x)多项式在整个原始evaluation domain
{
1
,
w
,
w
2
,
⋯
,
w
n
−
1
}
\{1,w,w^2,\cdots,w^{n-1}\}
{1,w,w2,⋯,wn−1}值均为
0
0
0。其中
w
n
=
1
w^n=1
wn=1。
- 在“常规”STARK中, Z ( x ) = ( x − 1 ) ⋅ ( x − w ) ⋅ ( x − w 2 ) ⋯ ( x − w n − 1 ) = x n − 1 Z(x)=(x-1)\cdot(x-w)\cdot (x-w^2)\cdots (x-w^{n-1})=x^n-1 Z(x)=(x−1)⋅(x−w)⋅(x−w2)⋯(x−wn−1)=xn−1。
- 而在circle STARKs中,等价为:
Z n + 1 ( x , y ) = ( 2 ∗ Z n ( x , y ) 2 ) − 1 Z_{n+1}(x,y)=(2*Z_n(x,y)^2)-1 Zn+1(x,y)=(2∗Zn(x,y)2)−1【其中 Z 1 ( x , y ) = y Z_1(x,y)=y Z1(x,y)=y, Z 2 ( x , y ) = x Z_2(x,y)=x Z2(x,y)=x。】
注意,可从folding函数派生vanishing多项式:
- 在“常规”STARK中,重复 x → x 2 x\rightarrow x^2 x→x2 map
- 在circle STARKs中,重复
x
→
2
x
2
−
1
x\rightarrow 2x^2-1
x→2x2−1 map。
- 不过如上面“3. Circle FRI协议”中所示,第一轮处理会有所不同,因第一轮是特殊的。
7. 多项式evaluations排布:Reverse bit order
STARKs中,多项式的evaluations:
- 通常不是以“自然”顺序排布的,所谓自然顺序,是指: ( P ( 1 ) , P ( w ) , P ( w 2 ) , ⋯ , P ( w n − 1 ) ) (P(1),P(w),P(w^2),\cdots,P(w^{n-1})) (P(1),P(w),P(w2),⋯,P(wn−1))
- 而是以“reverse bit order”排布的: P ( 1 ) , P ( w n 2 ) , P ( w n 4 ) , P ( w 3 n 4 ) , P ( w n 8 ) , P ( w 5 n 8 ) , P ( w 3 n 8 ) , P ( w 7 n 8 ) , P ( w n 16 ) , ⋯ P(1),P(w^{\frac{n}{2}}),P(w^{\frac{n}{4}}),P(w^{\frac{3n}{4}}),P(w^{\frac{n}{8}}),P(w^{\frac{5n}{8}}),P(w^{\frac{3n}{8}}),P(w^{\frac{7n}{8}}),P(w^{\frac{n}{16}}),\cdots P(1),P(w2n),P(w4n),P(w43n),P(w8n),P(w85n),P(w83n),P(w87n),P(w16n),⋯
所谓“reverse bit order”:即以bit表示,然后从右到左逆序表示:
- 如 0011 0011 0011,对应“reverse bit order”为 1100 1100 1100
- 如 1010 1010 1010,对应“reverse bit order”为 0101 0101 0101
若令
n
=
16
n=16
n=16,则可仅关注对
w
w
w如下幂乘值进行evaluate:
{
0
,
8
,
4
,
12
,
2
,
10
,
6
,
14
,
1
,
9
,
5
,
13
,
3
,
11
,
7
,
15
}
\{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15\}
{0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}
其顺序具有如下关键特性:
- 在FRI evaluation中,早期分组在一起的值在排序中会并排放置。如:
- FRI第一轮将 x x x和 − x -x −x分组在一起。当 n = 16 n=16 n=16时,有 w 8 = − 1 w^8=-1 w8=−1,即意味着按 P ( w i ) P(w^i) P(wi)和 P ( − w i ) = P ( w i + 8 ) P(-w^i)=P(w^{i+8}) P(−wi)=P(wi+8)分组。如上排序所示,正好为并排的pairs—— ( 0 , 8 ) , ( 4 , 12 ) , ( 2 , 10 ) , ⋯ , ( 7 , 15 ) (0,8), (4,12), (2,10),\cdots, (7,15) (0,8),(4,12),(2,10),⋯,(7,15)。
- FRI第二轮将 P ( w i ) P(w^i) P(wi)、 P ( w i + 4 ) P(w^{i+4}) P(wi+4)、 P ( w i + 8 ) P(w^{i+8}) P(wi+8)和 P ( w i + 12 ) P(w^{i+12}) P(wi+12)分组。如上排序所示,正好为并排的4个值—— ( 0 , 8 , 4 , 12 ) , ( 2 , 10 , 6 , 14 ) , ⋯ , ( 3 , 11 , 7 , 15 ) (0,8,4,12), (2,10, 6, 14),\cdots, (3, 11, 7,15) (0,8,4,12),(2,10,6,14),⋯,(3,11,7,15)。
- 以此类推。
这种“reverse bit order”排布,使得FRI更具space-efficient,因:
- 可同时为folded在一起的2个值提供1个Merkle proof。若一次fold了 k k k轮,则可同时为 2 k 2^k 2k个值提供1个Merkle proof。
在circle STARKs中,其folding结构会有所不同:【详情见上面“3. Circle FRI协议”】
- 第一轮是将 ( x , y ) (x,y) (x,y)和 ( x , − y ) (x,-y) (x,−y)分组
- 第二轮是将 x x x和 − x -x −x分组
- 第二轮之后的各轮,将 p p p和 q q q分组,所选 p , q p,q p,q满足 Q i ( p ) = − Q i ( q ) Q^{i}(p)=-Q^i(q) Qi(p)=−Qi(q),其中 Q i Q^i Qi为重复 x → 2 x 2 − 1 x\rightarrow 2x^2-1 x→2x2−1 map i i i次的map。
若将这些点与其在circle中的位置向结合,每一轮分组,即是将第一个点与最后一个点组合,第二个点与倒数第二个点组合,等等依此类推。
为调整reverse bit order来反映该folding结构:
- 除最后一个bit之后,reverse每个bit。
- 若最后一个bit值为1,则反转所有其它每个bit;若最后一个bit值为0,则保持不变。
如仍取
n
=
16
n=16
n=16,则相应的folded reverse bit order形如:
{
0
,
15
,
8
,
7
,
4
,
11
,
12
,
3
,
2
,
13
,
10
,
5
,
6
,
9
,
14
,
1
}
\{0, 15, 8, 7, 4, 11, 12, 3, 2, 13, 10, 5, 6, 9, 14, 1\}
{0,15,8,7,4,11,12,3,2,13,10,5,6,9,14,1}
对应如上图所示,所谓的“folded reverse bit order”为:
- 从右逆时针开始,第0个点 ( 10 , 5 ) (10,5) (10,5),第15个点 ( 10 , 26 ) (10,26) (10,26),第8个点 ( 21 , 26 ) (21, 26) (21,26),第7个点 ( 21 , 5 ) (21,5) (21,5),其满足 ( x , y ) (x,y) (x,y)、 ( x , − y ) (x,-y) (x,−y)、 ( − x , − y ) (-x,-y) (−x,−y)、 ( − x , y ) (-x,y) (−x,y)格式,正是所期望的。
8. 效率(计算表达所占空间)
circle STARKs(和通常的31-bit-prime STARKs)是非常高效的。
在circle STARK中所证明的实际计算,大多包含如下类型计算:
- 1)用于“业务逻辑”的原生运算,如计数。
- 2)用于密码学的原生运算,如类似Poseidon2的哈希函数。
- 3)lookup arguments:通过从查找表中读取值来实现高效执行多种计算的通用方法
衡量效率的关键标准是:
- 是否使用计算trace中的整个空间来做有用的工作,还是留下了大量浪费的空间?
- 在大域SNARKs中,存在大量浪费的空间:
- 业务逻辑和查找表大多涉及对小数字的计算(在N步计算中,数值通常小于N,实践中有 N < 2 25 N<2^{25} N<225),但必须支付使用 2 256 2^{256} 2256-bit域的开销。
- 而在circle STARK中,所用域size为 2 31 2^{31} 231,因此浪费的空间不大。
- 在大域SNARKs中,存在大量浪费的空间:
“专为SNARKs设计”的低算术复杂度哈希(如Poseidon)会使用基于任何域的trace中每个数值的每一个bit。
因此,circle STARKs实际上非常接近最优!
Binius更强大,因为:
- Binius允许混合和匹配不同大小域,从而为所有内容提供更高效的bit packing。
- Binius还提供了进行32位加法的选项,而不会产生查找表的开销。
- 然而,这些收益是以(在Vitalik看来)更高的理论复杂性为代价的,而circle STARK(尤其是基于BabyBear的常规STARK)在概念上非常简单。
9. 结论:Vitalik对circle STARKs的看法
与常规STARK相比,Circle STARK不会给开发人员带来太多额外的复杂性。在实现过程中,circle FRI与常规FRI有少量差异,详情见上面“3. Circle FRI协议”。
- Circle FRI所操作的“多项式”背后的底层数学非常违反直觉,需要一段时间才能理解和欣赏。但碰巧的是,这种复杂性被隐藏起来,开发人员看不见。circle数学的复杂性是封装的,而不是系统的。
理解Circle FRI和Circle FFT也可成为理解其他“奇特FFT”的良好智力门户:
- 最值得注意的是之前在Binius和LibSTARK中使用的binary-field FFT,
- 以及更怪异的构造,如椭圆曲线ECFFT,其使用与椭圆曲线点操作配合良好的few-to-1映射。
Vitalik感觉,通过Mersenne31、BabyBear和类似Binius的binary-field技术的结合:
- 正在接近STARK“基础层”效率的极限。
Vitalik预计STARK优化的前沿将转向:
- 1)对哈希函数和签名等原语进行最有效的算术运算(并为此目的优化这些原语本身),
- 2)进行递归构造以实现更多的并行化,
- 3)对VM进行算术运算以改善开发者体验,以及其他更高级别的任务。
参考资料
[1] Vitalik 2024年7月23日博客 Exploring circle STARKs
[2] Ayush Shukla 2024年4月5日博客 Circle STARKs