1. 引言
前序博客有:
- [KZG10] Kate commitments入门
- [GWC19]论文 PLONK: permutations over lagrange-bases for oecumenical noninteractive arguments of knowledge 学习笔记
- [BDFG20]论文 Efficient polynomial commitment schemes for multiple points and polynomials学习笔记
- SHPLONK
为Aztec团队2021年11月论文《fflonK: a Fast-Fourier inspired verifier efficient version of PlonK》,视频分享见:fflonk: a Fast-Fourier inspired verifier efficient version of PlonK [Ariel Gabizon, Aztec],slide见:fflonk:cheaply opening many polynomials using the fast-fourier equation。
根据Polygon zkEVM创始人Jordi 2023年2月twitterFFLONK已在snarkJS中实现,开源代码见:
- https://github.com/iden3/snarkjs/tree/master/src(JavaScript)
FFLONK为类似Groth16或PLONK的zkSNARK协议,主要优势在:
- 1)无需specific trusted setup(仅需universal setup)。
- 2)链上验证proof的开销比Groth16要便宜一点点,比常规的PLONK便宜30%。【以Polygon zkEVM为例,采用fflonk的链上验证开销为20.3万Gas,而Groth16为23万Gas,PLONK为30万Gas。】
Polygon zkEVM仅在proof的最后recursive阶段使用SNARK来聚合多个batch proofs,相应的电路将相对small,且链上验证开销可分摊在多个batch proofs中。Polygon zkEVM的当前最后证明时间约为2分钟,目标是优化后达到少于1分钟。当审计完成后,将在Polygon zkEVM主网中使用fflonk。
fflonk为KZG多项式承诺([KZG10])的变种,其设计初衷为节约以太坊上的gas费。当对
d
d
d个多项式open point为
d
d
d’th power (即
x
=
z
d
,
z
∈
F
x=z^d,z\in\mathbb{F}
x=zd,z∈F)时,Verifier所需的group运算与
d
d
d无关。fflonk将 “open multiple polynomials at a single point
x
x
x” 通过 “类似FFT identity的方法” reduce为 “opening a single polynomial at many points”。本文展示了某Plonk应用,大幅改进了Verifier性能,代价是将Prover time提高为约3倍。除2次pairing运算之外,fflonk的Verifier仅需要执行5次scalar multiplication运算,而不是Plonk论文中的16或18次scalar multiplication运算。
fflonk:
- 为KZG多项式承诺的变种,用于open多个多项式 at a single point;【将“open many polynomials at a single point” reduce为 “open a single polynomial at multiple points”,然后借助Boneh等人2020年论文BDFG20算法。】
- Verifier:仅需2次pairing + 5次scalar multiplication运算,
- Prover:代价为:Prover time为Plonk的3倍。
多项式承诺方案(PCS)已成为近期构建的succinct arguments(SNARKs)的核心组件,根据某具有上限degree的固定多项式,“force” Prover 答复 Verifier 查询请求。
对于以太坊上的类似zk-rollups应用来说,精确评估验证zk-SNARK proof的gas开销 将直观重要。链上验证proof的开销可进一步简化为,PCS “open”流程的验证开销。在“open”流程中,Verifier在已知直接Prover给的多项式承诺值的前提下,可验证Prover给的evaluations的正确性。本文,在open多个多项式承诺的情况下,可降低Verifier开销。
1.1 同类技术对比
原始的KZG多项式承诺,当open a polynomial f f f at a point x ∈ F x\in \mathbb{F} x∈F时,Verifier需做2次pairing运算。当open多个多项式 f 0 , f 1 , ⋯ , f t − 1 f_0,f_1,\cdots ,f_{t-1} f0,f1,⋯,ft−1 at同一point x x x时,直接使用KZG的话,Verifier需要做 2 t 2t 2t次运算。为改进Verifier性能,Sonic等论文的通用做法为:
- 引入随机值 γ ∈ F \gamma\in \mathbb{F} γ∈F,改为验证多项式 f ( x ) = ∑ i = 0 t − 1 γ i f i ( x ) f(x)=\sum_{i=0}^{t-1}\gamma^if_i(x) f(x)=∑i=0t−1γifi(x)的值。
与open单个多项式类似,Verifier仅需要做2次pairing运算。但是,Verifier需:
- 根据 { f i } \{f_i\} {fi}的承诺值构建 f f f的承诺值,这需要 t − 1 t-1 t−1次scalar multiplication运算 来计算scalar { γ i } i ∈ { 0 , ⋯ , t − 1 } \{\gamma^i\}_{i\in\{0,\cdots,t-1\}} {γi}i∈{0,⋯,t−1} 与 { f i } \{f_i\} {fi}承诺值 的乘积。
Verifier的性能能否与
t
t
t无关呢?
Boneh等人2020年论文[BDFG20]《Efficient polynomial commitment schemes for multiple points and polynomials》中提供了一条路径:(详细参看博客 Efficient polynomial commitment schemes for multiple points and polynomials学习笔记)
- 在Boneh论文中提供了一个开放的协议,当open多个points时,Verifier的group运算次数仅与多项式个数有关,而与points个数无关。(Verifier所需的field运算次数仍然与points个数相关,但field运算要比scalar multiplication运算 便宜3个数量级。)
本文在此基础上,将“open many polynomials at a single point” reduce为 “open a single polynomial at multiple points”,然后使用上面Boneh论文算法即可实现所需目标。
示例:
假设有2个多项式
f
0
,
f
1
f_0,f_1
f0,f1 open at同一point
x
x
x,为避免scalar multiplication的直观做法是:
open
f
0
+
f
1
f_0+f_1
f0+f1 at point
x
x
x。
令
a
=
f
0
(
x
)
,
b
=
f
1
(
x
)
a=f_0(x),b=f_1(x)
a=f0(x),b=f1(x),有
(
f
0
+
f
1
)
(
x
)
=
c
=
a
+
b
(f_0+f_1)(x)=c=a+b
(f0+f1)(x)=c=a+b成立。但是这并未对
a
,
b
a,b
a,b单独约束:对于任意
a
′
∈
F
a'\in\mathbb{F}
a′∈F,选择
b
′
b'
b′使得
a
′
+
b
′
=
c
a'+b'=c
a′+b′=c,则Verifier仍将接受
(
a
′
,
b
′
)
(a',b')
(a′,b′)。
因此,需要某种方法来给
(
a
,
b
)
(a,b)
(a,b)引入线性约束,但不需要使用2个多项式。
著名的“FFT equation”即可满足要求。在FFT设置中,可将多项式
f
f
f表示为2个分别派生自其奇偶项的half degree多项式:
f
(
X
)
=
f
0
(
X
2
)
+
X
⋅
f
1
(
X
2
)
f(X)=f_0(X^2)+X\cdot f_1(X^2)
f(X)=f0(X2)+X⋅f1(X2)
不过,在本文,将其反着用,即已知
f
0
,
f
1
f_0,f_1
f0,f1,派生出
f
f
f:
假设
x
=
z
2
x=z^2
x=z2为某square值,
f
f
f将派生出对
a
,
b
a,b
a,b所需的第二个约束。即open
f
f
f at
{
z
,
−
z
}
\{z,-z\}
{z,−z},有:
b
0
=
f
(
z
)
=
f
0
(
x
)
+
z
f
1
(
x
)
=
a
+
z
b
b_0=f(z)=f_0(x)+zf_1(x)=a+zb
b0=f(z)=f0(x)+zf1(x)=a+zb
b
1
=
f
(
−
z
)
=
f
0
(
x
)
−
z
f
1
(
x
)
=
a
−
z
b
b_1=f(-z)=f_0(x)-zf_1(x)=a-zb
b1=f(−z)=f0(x)−zf1(x)=a−zb
这样open
f
f
f at
{
z
,
−
z
}
\{z,-z\}
{z,−z},可获得基于
a
,
b
a,b
a,b的2个独立约束。
将其推广到
t
t
t个多项式时,即open at
t
t
t个
t
t
t-th root of unity。
1.2 本文成果
对
t
t
t个degree小于
n
n
n的多项式 open at单个point
x
x
x,其中
x
x
x为
t
t
t’th power,且
t
t
t可被
(
∣
F
∣
−
1
)
(|\mathbb{F}|-1)
(∣F∣−1)整除,即满足
x
=
z
t
,
z
∈
F
x=z^t,z\in\mathbb{F}
x=zt,z∈F,
t
∣
(
∣
F
∣
−
1
)
t|(|\mathbb{F}|-1)
t∣(∣F∣−1)。借助本文算法,Verifier的group运算次数与
t
t
t无关,但相应Prover的group运算次数将依赖于这些多项式中的最大degree:

将Plonk论文中的KZG多项式承诺方案 替换为 本文的fflonk方案,在增加Prover计算量的情况下,节约了Verifier的工作:

什么场景下值得这么做呢?
zk-rollup场景下,会做如上Verifier-Prover权衡。
通常情况下,“client proofs”由weak machines计算,这些proof不会提交上链,但通常由另一SNARK递归验证。为此,这些情况下,需牺牲Verifier优化Prover性能。
但是,提交上链的final proof通常由powerful machine计算,此时,可借助本文的方案。
2. 相关约定
- F \mathbb{F} F:为素数域。
- F < d [ X ] \mathbb{F}_{<d}[X] F<d[X]:为基于 F \mathbb{F} F域的,一组degree小于 d d d的单变量多项式。
- λ \lambda λ:安全参数。
- “efficient”:是指算法运行时为 poly ( λ ) \text{poly}(\lambda) poly(λ)。
-
O
\mathcal{O}
O:为“object generator”,输入为
λ
\lambda
λ。本协议中有
O
(
λ
)
=
(
F
,
G
1
,
G
2
,
G
t
,
e
,
g
1
,
g
2
,
g
t
)
\mathcal{O}(\lambda)=(\mathbb{F},\mathbb{G}_1,\mathbb{G}_2,\mathbb{G}_t,e,g_1,g_2,g_t)
O(λ)=(F,G1,G2,Gt,e,g1,g2,gt),其中:
- F \mathbb{F} F:为具有super-polynomial size p = λ w ( 1 ) p=\lambda^{w(1)} p=λw(1)的素数域。
- G 1 , G 2 , G t \mathbb{G}_1,\mathbb{G}_2,\mathbb{G}_t G1,G2,Gt:为加法群,group size为 p p p, e e e为高效可计算的non-degenerate pairing运算: e : G 1 × G 2 → G t e:\mathbb{G}_1\times\mathbb{G}_2\rightarrow \mathbb{G}_t e:G1×G2→Gt。
- g 1 , g 2 g_1,g_2 g1,g2:为uniformly选择的generators,使得 e ( g 1 , g 2 ) = g t e(g_1,g_2)=g_t e(g1,g2)=gt。
- [ x ] 1 = x ⋅ g 1 , [ x ] 2 = x ⋅ g 2 [x]_1=x\cdot g_1,[x]_2=x\cdot g_2 [x]1=x⋅g1,[x]2=x⋅g2
- [ n ] [n] [n]:表示整数集 { 1 , 2 , ⋯ , n } \{1,2,\cdots,n\} {1,2,⋯,n}。
- e.w.p:等价为“except with probability”。即“e.w.p γ \gamma γ” 等价为 “概率至少为 1 − γ 1-\gamma 1−γ”。
- Universal SRS-based public-coin protocols:借助Fiat-Shamir transform或random oracle,可将interactive protocol 转换为 non-interactive protocol。
- 向量表示:令
D
D
D为某域,基于
D
D
D的向量集表示为
D
(
1
)
D^{(1)}
D(1),向量的向量集表示为
D
(
2
)
=
(
D
(
1
)
)
(
1
)
D^{(2)}=(D^{(1)})^{(1)}
D(2)=(D(1))(1),向量的向量的向量集表示为
D
(
3
)
=
(
D
(
2
)
)
(
1
)
D^{(3)}=(D^{(2)})^{(1)}
D(3)=(D(2))(1)。这些向量集的元素以字母上的横杠数来对应相应的数字:如
S
ˉ
∈
F
(
1
)
,
S
ˉ
ˉ
∈
F
(
2
)
,
S
ˉ
ˉ
ˉ
∈
F
(
3
)
\bar{S}\in\mathbb{F}^{(1)},\bar{\bar{S}}\in\mathbb{F}^{(2)},\bar{\bar{\bar{S}}}\in\mathbb{F}^{(3)}
Sˉ∈F(1),Sˉˉ∈F(2),Sˉˉˉ∈F(3)。
对于某向量 f ˉ ∈ D t \bar{f}\in D^t fˉ∈Dt,其元素表示为 f i , 0 ≤ i < t f_i,0\leq i < t fi,0≤i<t。
类似的,对于 f ˉ ˉ ∈ D ( 2 ) \bar{\bar{f}}\in D^{(2)} fˉˉ∈D(2),其元素表示为 f ˉ i , 0 ≤ i < ∣ f ˉ ˉ ∣ \bar{f}_i,0\leq i < |\bar{\bar{f}}| fˉi,0≤i<∣fˉˉ∣,而每个 { f ˉ i } \{\bar{f}_i\} {fˉi}元素表示为 { f i , j } i < ∣ f ˉ ˉ ∣ , j < ∣ f ˉ i ∣ \{f_{i,j}\}_{i<|\bar{\bar{f}}|,j<|\bar{f}_i|} {fi,j}i<∣fˉˉ∣,j<∣fˉi∣ - 多项式表示:对于某多项式向量
f
ˉ
∈
F
[
X
]
t
\bar{f}\in\mathbb{F}[X]^t
fˉ∈F[X]t,且
x
∈
F
x\in \mathbb{F}
x∈F,
f
ˉ
(
x
)
\bar{f}(x)
fˉ(x)表示vector in
F
t
\mathbb{F}^t
Ft,有
f
ˉ
(
x
)
=
{
f
0
(
x
)
,
⋯
,
f
t
−
1
(
x
)
}
\bar{f}(x)=\{f_0(x),\cdots, f_{t-1}(x)\}
fˉ(x)={f0(x),⋯,ft−1(x)}。
对于 f ˉ ∈ F [ X ] t \bar{f}\in\mathbb{F}[X]^t fˉ∈F[X]t以及points向量 Z ˉ ∈ F l \bar{Z}\in\mathbb{F}^l Zˉ∈Fl,定义 f ˉ ( Z ˉ ) = ( f ˉ ( Z j ) ) j < l \bar{f}(\bar{Z})=(\bar{f}(Z_j))_{j<l} fˉ(Zˉ)=(fˉ(Zj))j<l表示 f ˉ ( Z ˉ ) ∈ F ( 2 ) \bar{f}(\bar{Z})\in\mathbb{F}^{(2)} fˉ(Zˉ)∈F(2) the element of ( F t ) l (\mathbb{F}^t)^l (Ft)l。
对于多项式向量的向量 f ˉ ˉ ∈ F [ X ] ( 2 ) \bar{\bar{f}}\in\mathbb{F}[X]^{(2)} fˉˉ∈F[X](2)以及points向量的向量 Z ˉ ˉ ∈ F ( 2 ) \bar{\bar{Z}}\in\mathbb{F}^{(2)} Zˉˉ∈F(2),有 ∣ f ˉ ˉ ∣ = ∣ Z ˉ ˉ ∣ |\bar{\bar{f}}|=|\bar{\bar{Z}}| ∣fˉˉ∣=∣Zˉˉ∣,定义 f ˉ ˉ ( Z ˉ ˉ ) = ( f ˉ i ( Z ˉ i ) ) i < ∣ f ˉ ˉ ∣ \bar{\bar{f}}(\bar{\bar{Z}})=(\bar{f}_i(\bar{Z}_i))_{i<|\bar{\bar{f}}|} fˉˉ(Zˉˉ)=(fˉi(Zˉi))i<∣fˉˉ∣表示 f ˉ ˉ ( Z ˉ ˉ ) ∈ F ( 3 ) \bar{\bar{f}}(\bar{\bar{Z}})\in\mathbb{F}^{(3)} fˉˉ(Zˉˉ)∈F(3)。
3. 多项式承诺方案
本文的多项式承诺方案在Plonk论文和[BDFG20]论文基础之上,做了如下2处调整:
- 1)在commit阶段,输入为多项式向量,而不是仅仅是单个多项式。尽管缺少通用性,为简化起见,所open的points set仅依赖于所commit的多项式向量。
- 2)支持对方案引入subset S ⊂ F \mathbf{S}\subset \mathbb{F} S⊂F参数,使得相应的opening procedure仅需要succeed on points from S \mathbf{S} S。
本文的多项式承诺方案定义为:


3.1 shplonk
[BDFG20]论文中的多项式承诺方案因历史原因,也称为shplonk——其commit流程与KZG承诺一样,shplonk的核心优势在于:Verifier的group运算数不会随着evaluation points的数量而增长。


注意,上面最后一个方程式中,
c
m
1
cm_1
cm1的系数为1,从而比[BDFG20],Verifier可少做一次scalar multiplication运算。同时,很容易延续[BDFG20]中的knowledge soundness proof,因其只更改了常量
Z
T
∖
S
1
(
z
)
Z_{T\setminus S_1}(z)
ZT∖S1(z)。

4. 新的多项式承诺方案
4.1 基于向量和多项式的类FFT运算
定义了运算符combine()和decomose(),来表示与FFT形式类似的多项式组合和分解运算:【这2个运算符为单射且可逆的,即对于任意的
f
ˉ
∈
F
[
X
]
t
\bar{f}\in \mathbb{F}[X]^t
fˉ∈F[X]t,有
decompose
t
(
combine
t
(
f
ˉ
)
)
=
f
ˉ
\text{decompose}_t(\text{combine}_t(\bar{f}))=\bar{f}
decomposet(combinet(fˉ))=fˉ。】

参考资料
[1] Polygon zkEVM创始人Jordi 2023年2月twitterFFLONK已在snarkJS中实现
4041





