fflonK: a Fast-Fourier inspired verifier efficient version of PlonK

1. 引言

前序博客有:

为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中实现,开源代码见:

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,zF)时,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} xF时,Verifier需做2次pairing运算。当open多个多项式 f 0 , f 1 , ⋯   , f t − 1 f_0,f_1,\cdots ,f_{t-1} f0,f1,,ft1 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=0t1γifi(x)的值。

与open单个多项式类似,Verifier仅需要做2次pairing运算。但是,Verifier需:

  • 根据 { f i } \{f_i\} {fi}的承诺值构建 f f f的承诺值,这需要 t − 1 t-1 t1次scalar multiplication运算 来计算scalar { γ i } i ∈ { 0 , ⋯   , t − 1 } \{\gamma^i\}_{i\in\{0,\cdots,t-1\}} {γi}i{0,,t1} { 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} aF,选择 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)+Xf1(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)=azb

这样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) (F1)整除,即满足 x = z t , z ∈ F x=z^t,z\in\mathbb{F} x=zt,zF t ∣ ( ∣ F ∣ − 1 ) t|(|\mathbb{F}|-1) t(F1)。借助本文算法,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×G2Gt
    • 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=xg1,[x]2=xg2
  • [ 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,0i<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,0i<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} xF 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),,ft1(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} SF参数,使得相应的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) ZTS1(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中实现

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值