文章详细介绍了BLS12-381椭圆曲线的参数化和实例化过程,包括如何计算其基础域模数和子群,以及构造效率的双线性配对函数的步骤。尤其关注了适合zk-SNARK使用的结构和性能要求,提供了具体的生成器和序列化形式的实现细节。
这是 BLS12-381 配对友好椭圆曲线构造的实现。
BLS12 曲线由一个值 x 参数化,以便可以计算基域模数 q 和子群 r:
给定如上参数化的素数 q 和 r,我们可以很容易地构造出一个在素数域 F<sub>q</sub> 上的椭圆曲线,该曲线包含一个订单为 r 的子群,使得 r | (q<sup>12</sup> - 1),赋予它 12 的嵌入度。在扩展域 F<sub>q<sup>2</sup></sub> 上实例化其六次扩展会产生一种高效的双线配对函数,将任意曲线的订单为 r 的子群内的元素映射到 F<sub>q<sup>12</sup></sub> 的一个订单为 r 的乘法子群。
在 zk-SNARK 方案中,我们需要 F<sub>r</sub> 具有大的 2<sup>n</sup> 级单位根以便进行高效的快速傅里叶变换。因此,确保大的 2<sup>n</sup> | (r - 1),或者等价地 x 具有一个大的 2<sup>n</sup> 因子,产生适合 zk-SNARK 的 BLS12 曲线。
由于近期的研究,许多人估计 q 应该大约为 384 位,以瞄准 128 位安全性。方便的是,当 q 大约为 384 位时,r 约为 256 位,使得 BLS12 曲线成为理想的 128 位安全性选择。这也使它们非常适合许多 zk-SNARK 应用,因为标量域可以用于密钥材料,例如嵌入曲线构造。
许多曲线符合我们的描述,但出于效率考虑,我们需要一些额外的属性:
BLS12-381 构造通过 x = -0xd201000000010000
被实例化,这产生了满足上述要求的最大 q
和最小汉明权重的 x
。结果为:
0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
(381 位)0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
(255 位)我们的扩展域塔构造如下:
现在,我们实例化椭圆曲线 E(F<sub>q</sub>) : y<sup>2</sup> = x<sup>3</sup> + 4,以及椭圆曲线 E'(F<sub>q<sup>2</sup></sub>) : y<sup>2</sup> = x<sup>3</sup> + 4(u + 1)。
group G<sub>1</sub> 是 E 的 r 阶子群,其余量为 (x - 1)<sup>2</sup> / 3。 group G<sub>2</sub> 是 E' 的 r 阶子群,其余量为 (x<sup>8</sup> - 4x<sup>7</sup> + 5x<sup>6</sup> - 4x<sup>4</sup> + 6x<sup>3</sup> - 4x<sup>2</sup> - 4x + 13) / 9。
G<sub>1</sub> 和 G<sub>2</sub> 的生成器通过寻找字典顺序最小的有效 x
坐标,以及其字典顺序最小的 y
坐标计算,并按余量对其进行缩放,使结果不是无穷远点。
x = 3685416753713387016781088315183077757961620795782546409894578378688607592378376318836054947676345821548104185464507
y = 1339506544944476473020471379941921221584933875938349620426543736416511423956333506472724655353366534992391756441569
x = 3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758*u + 352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160
y = 927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582*u + 1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905
G1 或 G2 编码的最高三位应在解释坐标之前屏蔽掉。这些位用于明确定义底层元素:
- 原文链接: github.com/zcash/librust...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!