完整指南:BLS12-381 预编译中的端到端自同态验证)
EIP-2537 快速子群检查Fast Subgroup Checks完整指南BLS12-381 预编译中的端到端自同态验证【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读本文围绕 assets/eip-2537/fast_subgroup_checks.md 展开深入剖析 EIP-2537BLS12-381 曲线操作预编译在接收 G1/G2 点输入前必须执行的快速子群检查fast subgroup checks方法。你将掌握Fp/Fp2 域与 G1/G2 群的数学定义、检查所需的全部曲线参数种子 x、三次单位根 Beta、Fp2 元素 r/s、共轭辅助函数conjugate、G1 自同态phi与 G2 自同态psi的构造以及两个用于接受/拒绝输入的子群测试公式phi(P) x^2*P 0与psi(P) x*P 0并了解该方法在 EIP-2537 规范与测试向量中的落地方式。为什么要做快速子群检查在 BLS12-381 中满足曲线方程的点并不都在素数阶子群orderq的主子群中。曲线的完整点群阶为q * hh 为余因子 cofactor也就是说曲线上存在多个陪集其中只有主子群中的点才能安全地用于 BLS 签名验证、配对运算等密码学操作。如果放任一个在曲线上但不在主子群中的点进入 MSM 或 pairing 计算攻击者可以利用**小子群攻击small subgroup attack**提取秘密信息或伪造验证结果。因此 EIPS/eip-2537.md 的 Subgroup checks 一节作出了强制要求MSMs and pairings MUST perform a subgroup check. Implementations SHOULD use the optimized subgroup check method detailed in a dedicated document. On any input that fails the subgroup check, the precompile MUST return an error.其中 dedicated document 正是 assets/eip-2537/fast_subgroup_checks.md。朴素的做法是直接计算q * P并判断结果是否为零点无穷远点但这需要对 255 位量级的 q 做一次完整标量乘成本较高。快速方法的思路是利用曲线的**自同态endomorphism**结构把昂贵的标量乘替换成一次更廉价的自同态计算加一次短标量乘从而显著降低子群检查的开销。域与群的数学定义基域 Fp基域Fp是大小为p的有限域元素用 0 到 p-1含端点之间的整数表示。EIP-2537 给出的模数p 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabp 是 381 位素数且p ≡ 3 mod 4这保证了平方根提取可以高效实现。二次扩域 Fp2Fp2定义为商环Fp[X]/(X^2 - nr2)其中nr2是 Fp 中的二次非剩余quadratic non-residue。元素写作el c0 c1 * v其中v是nr2的形式平方根即满足v^2 nr2的形式符号(c0, c1)是 Fp 元素对。EIP-2537 中的nr2值为nr2 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaaa群 G1 与群 G2G1由 Fp 上的点对坐标组成的集合。点(x, y)要么是(0, 0)约定为无穷远点/零元要么满足 Fp 上的曲线方程y^2 x^3 B (mod p)其中B 4BLS12 曲线族系数A 0。G2由 Fp2 上的点对(x, y)组成的集合。点要么是(0, 0)要么满足 Fp2 上的扭结曲线方程y^2 x^3 B*(v1)其中B是扭结参数twist type M 下为4 4*v。快速子群检查使用的曲线参数快速子群检查依赖一组专用参数来源assets/eip-2537/fast_subgroup_checks.md 的 Curve parameters 一节|x| (seed) 15132376222941642752 x is negative true Cube root of unity modulo p - Beta 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350 r 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437 * v s 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530 1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257 * v各参数含义|x|种子BLS12-381 曲线族由种子 x 参数化。十进制15132376222941642752正是 EIP-2537 主规范中的十六进制0xd201000000010000EIPS/eip-2537.md 中称为 miller loop scalar。x is negative true表示实际参与运算的 x 取负值x -|x|。这个 x 同时决定了主子群阶q和配对运算中 Miller 循环的轮数。Beta模 p 的三次单位根非平凡即满足Beta^3 ≡ 1 mod p且Beta ≠ 1。它是 G1 自同态phi的关键乘数用于在 x 坐标上实现乘以三次单位根这一映射。r、s均为 Fp2 元素表达式中的v即nr2的形式平方根是 G2 自同态psi中分别作用于 x、y 坐标的乘数。r落在 Fp2 的虚部只有c1非零s的实部、虚部都非零。主规范中的对应参数可对照 EIPS/eip-2537.md 的 Curve parameters 一节核对其中还包含基域模数、Fp2 构造、扭结参数、G1/G2 生成元H1/H2等完整集合。辅助函数Fp2 上的共轭conjugateG2 自同态psi需要用到 Fp2 上的共轭运算定义如下conjugate(c0 c1 * v) : c0 - c1 * v即保持实部c0不变将虚部系数c1取负。这与复数共轭的代数结构一致是扭结上 Frobenius 型自同态的自然组成部分。G1 自同态phiG1 上的自同态phi将点从(x, y)映射到(Beta * x, y)phi((x,y)) : (Beta*x, y)由于Beta是模 p 的三次单位根Beta^3 ≡ 1 mod p三次应用phi后 x 坐标乘上Beta^3 ≡ 1即phi^3恒等映射——这正是一个三阶自同态。在主子群上phi等价于乘以某个特征值lambda满足lambda^2 lambda 1 ≡ 0 (mod q)且与种子 x 有确定的对应关系这就是它能被用来做子群判定的代数根源。从实现角度看phi的成本只是一次 Fp 上的乘法比一次完整标量乘廉价得多。G1 子群测试phi(P) x^2*P 0对声称是 G1 成员的输入点P在接收前执行如下自同态测试phi(P) x^2*P 0其中x是上文带符号的种子x -|x|0是 G1 的无穷远点。等式成立意味着P处于主子群中不成立则拒绝该输入。直观理解若P是主子群中的点phi的作用等价于乘以特征值lambda而 BLS12-381 的参数选取保证了lambda ≡ -x^2 (mod q)在相应子群上成立于是phi(P) -x^2*P移项即得phi(P) x^2*P 0。若P落在其他陪集含子群外部元素该特征值关系不再成立等式必然失败。值得注意的是x^2是约 128 位的量比q约 255 位小得多因此x^2*P的标量乘成本远低于朴素检查q*P这正是快速二字的来源。G2 自同态psiG2 上的自同态psi结合了 Fp2 共轭与参数r、s的乘法psi((x,y)) : (conjugate(x)*r, conjugate(y)*s)即对 x、y 两个 Fp2 坐标分别取共轭再分别乘以 Fp2 元素r、s。r、s的选取使得psi成为 G2扭结上的六阶自同态并保证在主子群上psi等价于乘以与-x相关的特征值。G2 子群测试psi(P) x*P 0对声称是 G2 成员的输入点P在接收前执行psi(P) x*P 0与 G1 情形对称主子群上的点满足psi(P) -x*P移项即得上述等式非主子群点无法通过。由于这里只需乘一次种子x约 64 位的|x|标量乘成本进一步低于 G1 情形中的x^2。在 EIP-2537 预编译中的落地方式检查的适用范围依据 EIPS/eip-2537.mdMSM 与 pairing 必须做子群检查BLS12_G1MSM、BLS12_G2MSM、BLS12_PAIRING_CHECK的 ABI 错误情形明确包含 An input is on the G1/G2 elliptic curve but not in the correct subgroup。加法预编译不做子群检查BLS12_G1ADD、BLS12_G2ADD的 ABI 说明中明确 There is no subgroup check for the G1/G2 addition precompile仅要求点在曲线上。这是因为加法结果的安全性不依赖子群成员性且子群检查会显著抬高加法预编译的气费。失败处理任何输入未通过子群检查时预编译必须返回错误。结合 EIPS/eip-2537.md 的 Gas burning on error 一节一旦预编译调用出错调用方随CALL/STATICCALL提供的全部 gas 将被烧毁——这同样适用于子群检查失败的情形从而对攻击者构成经济惩罚。端到端加速主规范还指出As endomorphism acceleration requires input on the correct subgroup, implementers MAY use endomorphism acceleration. 即实现方只有在确认输入处于正确子群后才可安全使用基于自同态的加速例如用phi/psi相关的分解来加速标量乘、利用端到端结构优化 MSM。因此这里描述的快速子群检查不仅是安全关口也是后续性能优化的前置条件。测试向量佐证仓库中为每个预编译提供了失败用例测试数据JSON 格式每个用例含Input、Name、ExpectedError字段其中大量用例直接验证子群检查行为。例如assets/eip-2537/fail-mul_G1_bls.json 中的bls_g1mul_g1_not_in_correct_subgroup用例期望错误为g1 point is not in the correct subgroupassets/eip-2537/fail-msm_G1_bls.json 与 assets/eip-2537/fail-msm_G2_bls.json 中同样包含子群相关失败用例assets/eip-2537/fail-pairing_check_bls.json 针对配对预编译覆盖了点在曲线上但不在正确子群等多种错误路径。这些期望错误字符串表明在参考实现中子群检查是输入校验管线中独立的一环与坐标编码校验invalid fp.Element encoding、invalid field element top bytes、曲线方程校验invalid point: not on curve按顺序执行。对照 assets/eip-2537/fail-mul_G1_bls.json 可看到完整的校验层级先是输入长度、再是域元素编码与高位零字节、然后是曲线方程、最后才是子群成员性。成功用例方面assets/eip-2537/mul_G1_bls.json、assets/eip-2537/msm_G1_bls.json 等文件提供了带Input、Expected、Gas字段的向量例如bls_g1mul_(1*g1g1)标量 1 乘生成元等于生成元本身与bls_g1mul_(0*g1inf)标量 0 乘任意点等于无穷远点输出为 128 字节全零。这些向量可作为实现快速子群检查后整体回归验证的基准。全部测试向量清单见 assets/eip-2537/test-vectors.md面向性能基准的最坏情况输入如 double-and-add 乘法的最坏标量、2/4/6 对 pairing 输入见 assets/eip-2537/bench_vectors.md。注意BLS12_G1MUL/BLS12_G2MUL在测试中由对应 MSM 预编译以k 1的方式执行见 assets/eip-2537/test-vectors.md 的说明这也与主规范 No dedicated MUL call 的 Rationale 一致。实现与安全注意事项校验顺序应先验证坐标是合法域元素、点满足曲线方程最后才执行子群测试。对不在曲线上的点直接做自同态测试没有意义还可能引入不必要的运算路径。phi/psi的算术实现G1 测试中Beta乘法是单次 Fp 乘法G2 测试中conjugate是符号取反、r/s乘法是 Fp2 乘法。实现时应复用域算术层避免为自同态单独维护不一致的坐标表示。无穷远点处理G1/G2 的无穷远点用全零字节编码EIPS/eip-2537.md 的 Point of infinity encoding 一节自同态测试对零元应天然成立phi(0)0、x^2*00实现时需保证零元路径不落入除零等异常分支。常数时间主规范明确 BLS12-381 预编译不要求所有运算采用常数时间算法见 EIPS/eip-2537.md 的 Security Considerations因此子群检查本身也不必为常数时间付出额外开销但仍应避免无限循环以满足 DDoS 防护要求。数学依据本文所述端到端自同态子群检查方法的一般性论证可参见文档 Resources 一节引用的两份学术报告ePrint 2021/1130 第 4 节与 ePrint 2022/352 第 4.2 节assets/eip-2537/fast_subgroup_checks.md 末尾。总结快速子群检查是 EIP-2537 安全性的关键一环通过phi(P) x^2*P 0G1与psi(P) x*P 0G2两个自同态测试把验证点属于 q 阶主子群这一昂贵操作压缩为一次廉价自同态加一次短标量乘。本文给出了完整的参数集合x、Beta、r、s、辅助函数conjugate的定义并展示了该方法在 EIPS/eip-2537.md 规范、必须返回错误语义与 assets/eip-2537 测试向量中的具体落地可直接作为实现与审计 BLS12-381 预编译子群检查逻辑的参考。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考