本文详细讨论了BN254曲线,强调其在以太坊上进行zkSNARK验证的实用性,尤其是与Groth16和PlonK证明方案的结合。文章提供了BN254的数学背景、参数、曲线定义、群体检查等信息,还涉及到Frobenius映射和优化Ate配对等高级概念,旨在为开发者和研究人员整合与BN254相关的所有重要信息。
pairing friendly 椭圆曲线 BN254 之前被 ZCash (第 5.4.9.1 节)使用,目前是以太坊上仅有的几个具有预编译合约用于椭圆曲线加法、标量乘法和 pairing 的曲线(EIP 196, 197)。由于这些预编译,BN254 是使用诸如 Groth16 和 PlonK 证明方案验证链上 zkSNARKs 的最实用选择。
尽管自从 Kim-Barbulescu 的新算法之后,BN254 的安全位数从 128 降到了 大约 100,但由于以太坊上的预编译,BN254 依然是使用 Groth16 和 PlonK 证明方案进行链上 zkSNARK 验证的最实用的 pairing friendly 曲线。
我发现关于 BN254 的信息很难找到(部分是因为多个名称,见下文),因此这份文档的目的是将所有与开发者/研究人员在实践中使用这条曲线相关的信息整理到一个地方。这份文档的灵感无疑来自于存在的 BLS12-381 For The Rest Of Us。
为了增加对 BN254 的混淆,它通常被称为 多个不同的名称,例如:
alt_bn_128
(254 代表与基域相关的素数的位数。)
警告: 这不是这里提到的 BN254:https://neuromancer.sk/std/bn/bn254
BN254 (alt_bn_128
) 是一条不同的 Barreto-Naehrig (BN) 曲线,具有 254 位素数。该曲线定义为:
Y^2 = X^3 + 3
在域 F_p 上,其中
p = 21888242871839275222246405745257275088696311157297823662689037894645226208583
在本文的其余部分,我们将该曲线称为 BN254。
Barreto-Naehrig (BN) 曲线是形如
Y^2=X^3+b 的椭圆曲线
E,定义在素数域 F_p 上,其中素数
p 定义为
p=36x^4+36x^3+24x^2+6x+1,对于一个参数
x。
参数
x 还决定了与曲线 E 相关的其他常数:
r=36x^4+36x^3+18x^2+6x+1,t=6x^2+1,其中
x 被选为使得
r 是素数,并且
t 是该曲线的 Frobenius 构成 的迹。
BN 曲线的嵌入度总是 12,这意味着 12 是最小的整数
k,使得
E(F{p^k})[r]=E(F{-p})[r]。
BN 曲线是通过 CM 方法构造的,始终具有 CM 判别式
−3 和
j-不变量等于
0。
给定参数
x,使得曲线
y^2=x^3+b 在 F_p 上具有阶 r 的系数 b 是使用所谓的 CM 方法计算的(CM 代表复数乘法)。有关 CM 方法和 BN 曲线的概述,请参见 [ Shirase, 3.1]。对于 BN 曲线,
j-不变量等于
0,这大大简化了 CM 方法:
b+1 是模 p 的平方剩余
rG=O,即点 G 的阶为 r。
rG≠O,则迭代到下一个 b。
BN254(alt_bn128)的参数 x 为:
x = 4965661367192848881
(来源:libff)。可以检查这给出了文档顶部给出的 254 位素数 p。
对于这个特定的 x,曲线的阶 r 为:
r = 21888242871839275222246405745257275088548364400416034343698204186575808495617
恰好也是一个 254 位素数。对于 BN254,r
是 Baby Jubjub 素数。
对于 BN254,b = 3
。如前文所述,如果我们尝试
b=1,则
b+1=2 是模 p 的平方剩余,但
y^2=x^3+1 并没有阶 r。因此我们继续选择
b=3,b+1=22 是一个平方剩余,可以检查点
(1,2)∈E(F_p) 确实具有阶 r。
总之,
y^2=x^3+3 是参数 x = 4965661367192848881
对应的 BN 曲线。
为了进行 pairing,我们需要选择 F{p^{12}} 的一个表示。标准方法是将 F{p^{12}} 表示为 F_p 的一个特定字段扩展塔:
F_{p^2}=Fp[u]/(u^2−β)
F{p^6}=F{p^2}[v]/(v^3−ξ)
F{p^{12}}=F_{p^6}[w]/(w^2−v)
其中
β 是 F_p 中的一个平方非剩余,且
ξ 在 F_{p^2} 中既不是平方剩余也不是立方剩余。对 ξ 的条件等价于多项式
X^6−ξ 在 F_{p^2}[X] 上是不可约的。
对于 BN254,我们使用
β=−1 和
ξ=9+u。因此使用的详细字段扩展塔为:
F_{p^2}=Fp[u]/(u^2+1)
F{p^6}=F{p^2}[v]/(v^3−(9+u))
F{p^{12}}=F_{p^6}[w]/(w^2−v)
最重要的方程是
u^2=−1 和
w^6=9+u。
我们还可以直接写成
F_{p^{12}}=F_p[w]/((w^6−9)^2+1)=F_p[w]/(w^{12}−18w^6+82)。这与 Python 实现 这里 一致。
扭曲的工作方式几乎与 BLS12-381 相同:
回想一下,X^6−ξ 在 F_{p^2}[X] 上是不可约的,其中 ξ=9+u。根据 [第 3 节,Barreto-Naehrig],我们可以使用 ξ 定义 BN254 曲线 E:y^2=x^3+3 的 D 类型 六次扭曲:
E′: y′^2=x′^3+3/ξ=x′^3+3/(9+u)。 (脚注:BLS12-381 有一个 M 类型六次扭曲。)曲线 E′ 在 F_{p^2} 中定义。这个定义与 EIP 197 一致。为具体起见,
E' : y^2 = x^3 + (19485874751759354771024239261021720505790618469301721065564631296452457478373 + 266929791119991161246907387137283842545076965332900288569378510910307636690 u)
我们有 w∈F_{p^{12}} 是 X^6−ξ 的根,因此
Ψ(x′,y′)=(w^2x′,w^3y′) 定义了一个群同态
Ψ:E′(F{p^2})→E(F{p^{12}})。我们有以下事实:
Ψ~:E′(F{p^{12}}) ≅ E(F{p^{12}})。
G2 of E′(F{p^2}) 通过 Ψ 发送到 E(F{-p})[r] 的一个线性独立子群。
知道 E′(F_{p^2}) 和 E(F_p) 没有阶为 2 的点是有用的。
定义 Frobenius 构成
ϕp:E(F{-p})→E(F_{-p}) 为
ϕ_p(x,y)=(x^p,y^p)。这在 E 定义于 F_p 的情况下是定义良好的。Frobenius 构成是一个度为 p 的同构,其特征多项式为
X^2−tX+p。这意味着
ϕ_p^2−[t]ϕp+[p]=[0] 在 E(F{-p}) 上。
由于 E(Fp) 是 E(F{-p}) 的 Frobenius 不动点,我们得到
G1:=E(Fp)[r]=E(F{p^−})[r]∩ker(ϕ_p−[1])。令
Ψ(G2) 表示 G2:=E′(F_{p^2})[r] 在扭曲映射 Ψ 下的像。然后我们有 Ψ(G2) 的一个替代描述为
Ψ(G2)=E(F_{-p})[r]∩ker(ϕ_p−[p])。注意“迹”的事实与 ϕ_p 的迹等于 [t] 是没有矛盾的,因为
p+1≡t(mod r)。
对于 BN 曲线,最优 Ate pairing
e:G1×G2→GT,其中 GT=μr⊂F{p^{12}}× 是单位根的 r 重的根,被定义为:
e(P,Q)=(f{6x+2},Q(P)⋅l{[6x+2]}Q,ϕp(Q)(P)⋅l{[6x+2]}Q+ϕ_p(Q),−ϕ_p^2(Q)(P)) p^{12−1}r
其中:
f{i+j,Q}=f{i,Q}⋅f{j,Q}⋅l{[i]Ψ(Q)},[j]Ψ(Q)v{[i+j]}Ψ(Q)。这里 l{P_1,P_2} 表示通过 P_1,P2 的直线的方程,而 v{P} 表示通过 P 的竖直线的方程。
e(P,Q) 在上述方程中如果省略对 v_{[i+j]}Ψ(Q) 的除法,保持不变。
给定一个对
(x,y)∈F_{p^2},容易检查
(x,y) 是否是曲线 E(F_p) 上的一点。我们还需要进一步检查它是否属于子群
G1=E(F_p)[r]。幸运的是,对于 BN 曲线,我们有
G1=E(F_p),因此不需要进一步检查。
一种查看这种情况的方法是 Weil 猜想 [定理 2.3.1,Silverman] 意味着
p(x)+1−t(x)=r(x),使用上述公式 (Barreto-Naehrig curves)。我们得出结论
Weil 猜想还告诉我们,如果
α,β∈C 是 Frobenius 构象的特征多项式
X^2−tX+p 的根,则
α,β 的绝对值为
p(因此 β=α^−),并且
(1) #E(F_{p^k})=p^k+1−α^k−α^−k。
给定对
P=(x,y)∈F_{p^{2}}^2,容易检查
P 是否是扭曲曲线 E′(F_{p^2}) 上的一点。然而,我们需要进一步检查
P 是否在子群
G2=E′(F_{p^2})[r] 中。设
c_2≠1。这个数字
c_2 被称为
G2 的 余因子。
我们可以通过 [命题 2,HSV] 进行一些修改 来计算
构造曲线的 CM 方法产生整数
D,V 使得
DV^2=4p−t^2,其中
−D 是判别式,结果曲线 E 的
End(E)⊂Q(−D)。对于 BN 曲线,
D=3,因此
End(E) 是 Q(−3) 中的一个整环。由于 E′ 是 E 的六次扭曲,我们知道六次单位根
μ_6 ⊂ Aut(E)。唯一满足这个条件的整环是
Z[ω],其中
ω=−1+i√3/2。我们得出结论,任何 BN 曲线都有复数乘法
End(E)=Z[ω]。
X^2−tX+p 的根等于
t±√(t^2−4p^2)=t±V−√3/2 根据二次公式,所以我们可以取
α=t+V−√3/2。扭曲 E′ 在 F_{p^2} 上定义,因此我们可以考虑 Frobenius 图
ϕ{p^2}' 在 E' 的 F{-p}。设
α′ 为 Frobenius 运算符特征多项式的根之一。
由于 E 和 E′ 在 F_{p^{12}} 上同构,我们有
α′=ζα^2,其中 ζ∈μ6。此外,由于 F{p^{12}} 是上述成立的最小字段扩展,
ζ 必须是原始的六次单位根
ζ=1±i√3/2。某些计算得出
α′+α′^−=t^2∓3tV^2−p,其中
V=(4p−t^2)/3。因此:
右手边有两种可能性,对应于 E 的两种可能的六次扭曲(类型 D 与类型 M)。
对于 BN 曲线,
V=6x^2+4+1,其中
x 是参数。插入 关于参数 的公式 后,我们发现使
#E'(F_{p^2}) = 479095176016622842441988045216678740799252316531100822436447802254070093686356349204969212544220033486413271283566945264650845755880805213916963058350733
c_2 = 21888242871839275222246405745257275088844257914179612981679871602714643921549
检查 P∈E′(F_{p^2}) 是否属于 G2 的一个简单但缓慢的方法是查看
[r]P=O。这是不可取的,因为在 BN254 的情况下,r 有 254 位。
有多种方法可以加快不同曲线的 G2 成员检查,方法是找到一个有效计算的自同构。对于 BN 曲线,我们可以使用 HGP 中第 4.3 节的新方法,该方法改编自 Scott。它基于由 Galbraith-Scott 引入的非扭曲 Frobenuis 倍思自同构
ψ:E′(F{p^2})→E′(F{p^2}),它被定义为
ψ=Ψ^−1∘ϕ_p∘Ψ,其中
Ψ:E′(F{p^2})→E(F{p^{12}}) 是扭曲映射,而
ϕ_p(x,y)=(x^p,y^p) 是 Frobenius 构造。请注意,
Ψ 只是单射,但可以直接检查
ϕ_p∘Ψ 位于
Ψ 的像中。对于 BN 曲线的 D 类型六次扭曲,我们有
ψ(x′,y′)=(ξ(p−1)/3x′^p,ξ(p−1)/2y′^p) (回想一下,对于 BN254 的 ξ=9+u)。
根据 [HGP](https://eprint.iacr.org/2022/352.pdf) 的命题 3,P∈E′(F_{p^2}) 属于 G2 若且唯若 ψ(P)=[6x^2]P,其中 x 表示曲线 E 的参数。 (在 loc cit. 的表述中有一个小错误,但论据正确。)为方便起见,我们提供了一个证明:
我们有
r=p−t+1,并且给定 P∈E′(F_{p^2}),我们需要检查
[r]P=O。这等价于
[p]P=[t−1]P。另一方面,
ψ 满足 Frobenius 运算符的特征多项式,这意味着
ψ^2−[t]ψ+[p]=0。因此
[p]P=[t−1]P 等价于
ψ^2(P)−[t]ψ(P)+[t−1]P=O。
设局部 λ=t−1=6x^2。那么上述内容可因式分解为
(ψ−[1])(ψ−[λ])(P)=O。显然
ψ(P)=[λ](P) 表示该方程成立。相反,假设
[r]P=O,因此该方程成立。令 Q=(ψ−[λ])P。那么
ψ(Q)=Q 表示扭曲映射 Ψ(Q)∈E(F_p)=E(F_p)[r]。交集
Ψ(E′(F_{p^2}))∩E(F_p)[r]={O},所以
Q=O。换句话说,
ψ(P)=[λ]P。
- 原文链接: hackmd.io/@jpw/bn254...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!