EIP-2539 深度解读:在以太坊 EVM 中以预编译合约实现 BLS12-377 曲线运算

发布时间:2026/9/15 17:31:44
EIP-2539 深度解读:在以太坊 EVM 中以预编译合约实现 BLS12-377 曲线运算 EIP-2539 深度解读在以太坊 EVM 中以预编译合约实现 BLS12-377 曲线运算【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读本文围绕本仓库中的 EIPS/eip-2539.md 展开完整解读一份面向以太坊核心协议的提案通过引入9 个新的预编译合约precompile让 EVM 可以高效执行 BLS12-377 配对友好曲线上的点加、点乘、多标量乘、配对与域映射操作从而支撑 BLS 签名验证与 zkSNARK 证明验证等密码学场景。读完本文你将掌握这 9 个预编译的地址分配、曲线参数、字段元素编码规范、逐操作 ABI 约定、错误处理与完整 Gas 定价模型并能基于本仓库中 EIP-1962、EIP-2537、EIP-3026 等关联提案理解其在以太坊密码学预编译演进中的位置。状态说明本 EIP 当前在仓库中的status为Stagnant停滞type为 Standards Trackcategory为 Core创建于 2020-02-26作者为 Alex Vlasovshamatar与 hujw77hujw77并requiresEIP-1109PRECOMPILEDCALL 操作码与 EIP-2046降低预编译 STATICCALL 成本。一、背景与动机为什么需要 BLS12-377 预编译1.1 从安全强度说起以太坊早期引入的 BN254 配对预编译只能提供约80 bit 的安全强度。而 BLS12-377来自 Zexe 论文作为配对友好曲线可以支撑120 bit 的安全强度同时其独特性质还允许高效的一次性递归证明聚合——例如关于存在某个 BLS12-377 签名的证明。这正是本 EIP 的动机所在支撑 BLS 签名验证包括公钥聚合与多签名者的签名聚合支撑 SNARK 验证提供必要的曲线运算原语且 BLS12-377 的特性允许在后续 SNARK 中高效地验证 BLS12-377 配对进而实现常数大小的 BLS 签名聚合。1.2 九个预编译与地址分配如果block.number X激活区块号由部署决定本 EIP 将引入 9 个独立预编译地址从0x15到0x1dPrecompile地址功能BLS12_377_G1ADD0x15素域曲线上点的加法BLS12_377_G1MUL0x16素域曲线上点的标量乘法BLS12_377_G1MULTIEXP0x17素域曲线上的多标量乘multiexponentiationBLS12_377_G2ADD0x18基域二次扩域上 twist 曲线的点加法BLS12_377_G2MUL0x19基域二次扩域上 twist 曲线的点乘法BLS12_377_G2MULTIEXP0x1a基域二次扩域上的多标量乘BLS12_377_PAIRING0x1b一组 (G1, G2) 点对的配对运算BLS12_377_MAP_FP_TO_G10x1c将基域元素映射为 G1 点BLS12_377_MAP_FP2_TO_G20x1d将扩域元素映射为 G2 点其中G1MULTIEXP / G2MULTIEXP的存在尤为关键BLS 签名验证需要把多个公钥或多个签名者的签名聚合起来单独的多标量乘预编译可以一次性完成避免反复调用乘法预编译叠加 CALL 开销。1.3 在仓库提案谱系中的位置BLS12-377 预编译并非孤立提案在本仓库中可以找到完整的关联脉络EIPS/eip-2537.mdBLS12-381 曲线预编译提案状态为Final地址0x0b~0x11只含 7 个预编译与本 EIP 构成BLS12 家族的两条技术路线EIPS/eip-1962.mdmatter-labs 提出的通用椭圆曲线运算预编译其中明确写到BLS12 家族已完成并测试了 BLS12-381 与 BLS12-377 曲线并在基准测试中给出 BLS12-381 配对约2,348,317 ns/iter、CP6 曲线嵌入 BLS12-377 的 Cocks-Pinch 曲线配对约86,328,825 ns/iter的数据见 EIPS/eip-1962.md 的 Preliminary benchmarks 一节EIPS/eip-3026.mdBW6-761 曲线预编译requires: 2539文中明确说明在大多数应用中 BW6-761 被用作 BLS12-377 的外层曲线二者配合可实现单层 SNARK 证明组合proof composition。这组提案共同描绘了以太坊配对密码学预编译的演进路径从 80 bit 的 BN254 走向 120 bit 的 BLS 家族再到支撑递归证明组合的 BLS12-377 BW6-761 双层曲线结构。二、曲线参数规格BLS12-377 曲线由以下参数集合完整定义所有 BLS12 曲线系数A 0即曲线方程为y² x³ BBase field modulus 0x01ae3a4617c510eac63b05c06ca1493b1a22d9f300f5138f1ef3622fba094800170b5d44300000008508c00000000001 B coefficient 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 Main subgroup order 0x12ab655e9a2ca55660b44d1e5c37b00159aa76fed00000010a11800000000001 Extension tower: Fp2 construction: Fp quadratic non-residue 0x01ae3a4617c510eac63b05c06ca1493b1a22d9f300f5138f1ef3622fba094800170b5d44300000008508bffffffffffc Fp6/Fp12 construction: Fp2 cubic non-residue c0 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Fp2 cubic non-residue c1 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 Twist parameters: Twist type: D B coefficient for twist c0 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B coefficient for twist c1 0x010222f6db0fd6f343bd03737460c589dc7b4f91cd5fd889129207b63c6bf8000dd39e5c1ccccccd1c9ed9999999999a Generators: G1: X 0x008848defe740a67c8fc6225bf87ff5485951e2caa9d41bb188282c8bd37cb5cd5481512ffcd394eeab9b16eb21be9ef Y 0x01914a69c5102eff1f674f5d30afeec4bd7fb348ca3e52d96d182ad44fb82305c2fe3d3634a9591afd82de55559c8ea6 G2: X c0 0x018480be71c785fec89630a2a3841d01c565f071203e50317ea501f557db6b9b71889f52bb53540274e3e48f7c005196 X c1 0x00ea6040e700403170dc5a51b1b140d5532777ee6651cecbe7223ece0799c9de5cf89984bff76fe6b26bfefa6ea16afe Y c0 0x00690d665d446f7bd960736bcbb2efb4de03ed7274b49a58e458c282f832d204f2cf88886d8c7c2ef094094409fd4ddf Y c1 0x00f8169fd28355189e549da3151a70aa61ef11ac3d591bf12463b01acee304c24279b83f5e52270bd9a1cdd185eb8f93 Pairing parameters: |x| (miller loop scalar) 0x8508c00000000001 x is negative false几个值得注意的细节Base field modulus与Main subgroup order的末尾都带有...8508c00000000001结构这是 BLS12 曲线族刻意设计的稀疏 Miller 循环标量直接影响配对运算的速度Twist type 为 D 型 twist其B coefficient for twist c1带有...ccccc...这样的稀疏结构同样是面向高效实现的参数选择与 BLS12-381twist type M见 EIPS/eip-2537.md不同BLS12-377 使用 D 型 twist。三、编码规则字段元素与点的字节表示3.1 基域元素 Fp 编码64 字节对相应无符号整数做BigEndian 编码总长度固定为64字节其中顶部16字节恒为零选 64 字节是为了得到 32 字节对齐的 ABI在 Solidity 中可表示为bytes32[2]或uint256[2]对应的整数必须小于域模数field modulus。3.2 二次扩域元素 Fp2 编码128 字节Fp2 元素形如el c0 c1 * v其中v是形式化的二次非剩余quadratic non-residuec0、c1均为 Fp 元素字节编码为encode(c0) || encode(c1)即两个 64 字节编码的字节拼接总计128 字节Solidity 中对应bytes32[4]或uint256[4]。3.3 点的编码G1 点基域上与 G2 点扩域上均为两个仿射坐标x、y各自编码后的字节拼接G1 点总长 128 字节2 × 64G2 点总长 256 字节2 × 128。3.4 无穷远点零点编码对 BLS12 曲线而言坐标为(0, 0)的点不在曲线上y² x³ B在x0, y0时不成立因为B ≠ 0因此规范约定使用(0, 0)Fp 或 Fp2 中的形式零的编码作为无穷远点的约定编码。3.5 乘法标量编码32 字节对标量做 BigEndian 编码固定32 字节与域元素不同标量整数不要求小于或等于主子群阶main subgroup size——实现需要正确处理未归一化标量这一点在后面的测试属性中也会体现。硬性要求解析过程中只要出现任何不符合上述规范的编码预编译必须返回错误error。四、九个操作的 ABI 规格4.1 G1 加法0x15输入256字节为两个 G1 点编码各128字节的字节拼接输出单个 G1 点编码128字节错误情形任一点不在曲线上域元素编码违反规则输入长度非法。4.2 G1 乘法0x16输入160字节 G1 点128字节|| 标量32字节输出128字节 G1 点错误情形点不在曲线上域元素编码非法输入长度非法。4.3 G1 多标量乘0x17输入160*k字节为k个切片每个切片 G1 点128字节 || 标量32字节的拼接输出128字节 G1 点错误情形任一 G1 点不在曲线上域元素编码非法输入长度非法。4.4 G2 加法0x18输入512字节 两个 G2 点各256字节输出256字节 G2 点错误情形任一点不在曲线上域元素编码非法输入长度非法。4.5 G2 乘法0x19输入288字节 G2 点256字节|| 标量32字节输出256字节 G2 点错误情形点不在曲线上域元素编码非法输入长度非法。4.6 G2 多标量乘0x1a输入288*k字节为k个切片每个切片 G2 点256字节 || 标量32字节的拼接输出256字节 G2 点错误情形任一 G2 点不在曲线上域元素编码非法输入长度非法。4.7 配对运算0x1b输入384*k字节为k个切片的拼接每个切片结构为128字节 G1 点编码256字节 G2 点编码输出32字节。若配对结果等于配对目标域中的乘法单位元即配对成功则前31字节为0x00、末字节为0x01否则末字节为0x00错误情形布尔变量编码非法对应上述 32 字节输出的编码校验任一 G1/G2 点不在曲线上任一 G1/G2 点不在正确子群中域元素编码非法输入长度非法。注意配对运算是唯一强制要求**子群检查subgroup check**的操作。4.8 Fp → G1 映射0x1c输入64字节解释为基域元素输出128字节 G1 点错误情形输入长度非法输入不是合法域元素。4.9 Fp2 → G2 映射0x1d输入128字节解释为二次扩域元素输出256字节 G2 点错误情形输入长度非法输入不是合法域元素。这些映射操作不负责字节串 → 域元素的转换该步骤可在 EVM 中高效实现且做法多样只负责域元素 → 曲线点的域算术是签名方案如 BLS 签名所需的哈希到曲线hash-to-curve基础设施这一设计思路与 EIPS/eip-2537.md 中独立的 field_to_curve 映射文档 一致。五、错误处理与 DDoS 防护预编译涉及大量计算因此任何错误路径都必须消费完对应操作 Gas 表中的全部 Gas错误处理期间的 DDoS 防护。这是以太坊预编译的标准防御手段防止攻击者用极低的 Gas 代价触发昂贵的失败计算路径从而免费消耗节点的 CPU 资源。具体到各操作的错误情形不在曲线、编码非法、长度非法、子群非法等见上一节逐操作列表。六、Gas 定价模型假设常量为30 MGas/秒提案给出如下定价操作Gas 成本G1 加法600G1 乘法12000G2 加法4500G2 乘法55000Fp → G1 映射5500Fp2 → G2 映射750006.1 多标量乘G1/G2的折扣定价多标量乘必须采用 Peppinger 算法执行才能获得相对逐对相乘再相加朴素实现的加速从而体现折扣。为避免非整数运算调用成本按如下公式计算cost k * multiplication_cost * discount / multiplier其中multiplier 1000k为 (标量, 点) 对的数目multiplication_cost为对应曲线G1/G2单次乘法成本。折扣表为[k, discount]向量对仅覆盖k 128超过部分使用上限max_discount[[1, 1200], [2, 888], [3, 764], [4, 641], [5, 594], [6, 547], [7, 500], [8, 453], [9, 438], [10, 423], [11, 408], [12, 394], [13, 379], [14, 364], [15, 349], [16, 334], [17, 330], [18, 326], [19, 322], [20, 318], [21, 314], [22, 310], [23, 306], [24, 302], [25, 298], [26, 294], [27, 289], [28, 285], [29, 281], [30, 277], [31, 273], [32, 269], [33, 268], [34, 266], [35, 265], [36, 263], [37, 262], [38, 260], [39, 259], [40, 257], [41, 256], [42, 254], [43, 253], [44, 251], [45, 250], [46, 248], [47, 247], [48, 245], [49, 244], [50, 242], [51, 241], [52, 239], [53, 238], [54, 236], [55, 235], [56, 233], [57, 232], [58, 231], [59, 229], [60, 228], [61, 226], [62, 225], [63, 223], [64, 222], [65, 221], [66, 220], [67, 219], [68, 219], [69, 218], [70, 217], [71, 216], [72, 216], [73, 215], [74, 214], [75, 213], [76, 213], [77, 212], [78, 211], [79, 211], [80, 210], [81, 209], [82, 208], [83, 208], [84, 207], [85, 206], [86, 205], [87, 205], [88, 204], [89, 203], [90, 202], [91, 202], [92, 201], [93, 200], [94, 199], [95, 199], [96, 198], [97, 197], [98, 196], [99, 196], [100, 195], [101, 194], [102, 193], [103, 193], [104, 192], [105, 191], [106, 191], [107, 190], [108, 189], [109, 188], [110, 188], [111, 187], [112, 186], [113, 185], [114, 185], [115, 184], [116, 183], [117, 182], [118, 182], [119, 181], [120, 180], [121, 179], [122, 179], [123, 178], [124, 177], [125, 176], [126, 176], [127, 175], [128, 174]]max_discount 174即k 128时折扣固定在 174。解读折扣值随k增大而递减1200 → 174表示规模越大单位点成本越低。注意k1时 discount 为1200乘以乘法成本再除以 1000 后恰好约等于一次 G1/G2 乘法成本与单点多标量乘退化为普通乘法的直觉一致。之所以把k1的折扣设为1200而非1000从折扣表结构看是为了保证公式在k1时成本不低于单次乘法12000 × 1200 / 1000 14400略高于 12000避免用 MULTIEXP 绕过 MUL 定价可结合该公式自行推导验证。6.2 配对运算pairing_cost 55000 * k 65000其中k为配对点对的数量每增加一对 G1/G2 点对成本线性增加55000另有固定开销65000。6.3 多标量乘为何值得单独设计Rationale 一节给出了量化理由CALL操作本身在以太坊中写作时相当昂贵。若对 100 个点做多标量乘而不得不调用 100 次乘法预编译 99 次加法预编译将产生不可忽视的 CALL 开销而独立的 MULTIEXP 预编译可节省约138600Gas即省去 199 次 CALL 的开销。这解释了为什么提案坚持将多标量乘作为独立操作而非让用户在链上自行组合。七、向后兼容与实现要点7.1 向后兼容提案声明不存在向后兼容性问题——9 个预编译全部使用新地址0x15~0x1d不改变任何既有预编译或操作码语义。这与 EIP-1962其声明可能作为现有ECADD、ECMUL、配对检查预编译0x06/0x07/0x08的完整替代形成对比本 EIP 采取纯新增、零冲突的策略。7.2 重要实现注意点子群检查配对调用中子群检查是强制的实现应该使用快速子群检查提案写作时乘法 Gas 成本基于double-and-add乘法方法其最坏情况是标量所有比特均为 1。对配对操作预期实现采用更快的子群检查例如椭圆曲线wNAF 乘法方法——窗口大小为 4 时大约便宜40%经经验测试节省源于群阶更低的汉明重量以及 wNAF 更低的汉明重量具体而言一对 (G1, G2) 点的子群检查合计约35000Gas。7.3 参考实现提案列出了可直接参考的既有曲线运算实现可能需额外工作以适配本 ABI固定参数代码库matter-labs 的 Rust 与 C 实现Zexe 论文原始实现Rustgithub.com/scipr-lab/zexe独立 Go 实现github.com/kilic/bls12-377。作为对照仓库内 EIPS/eip-1962.md 的基准数据显示matter-labs 使用 Peppinger 算法实现的 BN254 多标量乘bench_peppinger_bn254约为2,678,743 ns/iter明显优于朴素多标量乘bench_naive_multiexp_bn254约10,659,911 ns/iter从侧面印证了本 EIP 选择 Peppinger 算法的性能合理性。八、测试属性Test Cases由于测试参数空间巨大提案不提供穷举测试向量而是规定各操作必须满足的数学性质。记号约定大写字母P、Q表示点小写字母a、b表示标量G1 生成元记为GG2 生成元记为H0表示零标量或无穷远点1表示单位标量或乘法单位元group_order为主子群阶e(P, Q)表示配对。基础操作加法/乘法必满足的性质交换律P Q Q P加法逆元P (-P) 0倍点P P 2*P子群检查group_order * P 0平凡乘法1 * P P零乘0 * P 0未归一化标量乘法(scalar group_order) * P scalar * P最后一条性质与编码规则中标量不要求 ≤ 主子群阶的设计相呼应验证实现必须正确处理标量模group_order归约。配对操作必满足的性质退化性Degeneracye(P, 0*Q) e(0*P, Q) 1双线性Bilinearitye(a*P, b*Q) e(a*b*P, Q) e(P, a*b*Q)内部测试不通过 ABI 暴露提案注明所有操作的测试向量在 matter-labs 的 1962 提案所附 CSV 文件中展开即与本仓库 EIPS/eip-1962.md 的测试体系同源。九、安全考量严格遵循本规范即可消除安全与共识层面的隐患相对此前的 BN254 预编译而言因为编码、子群检查、错误处理都有明确且统一的强制约定关于常数时间constant time属性提案明确声明本预编译不要求所有操作都使用常数时间算法实现——这与签名场景中密钥隔离side-channel需求由上层方案自行权衡的设计取向一致。十、总结与延伸阅读EIP-2539 是一份规格完整的 Core 类预编译提案它以 9 个新地址0x15~0x1d提供 BLS12-377 曲线的全套运算用严格的字节编码规范、逐操作 ABI、Peppinger 多标量乘折扣表与 DDoS 防护式错误处理为 120 bit 安全强度的 BLS 签名验证与 SNARK 验证提供了 EVM 内的高效原语。它也是后续 EIP-3026BW6-761 外层曲线requires: 2539实现单层 SNARK 证明组合的底层支撑。若想深入理解本主题在仓库中的全貌建议继续阅读EIPS/eip-2537.md已 Final 的 BLS12-381 预编译同族曲线的另一路线与地址分配EIPS/eip-1962.mdmatter-labs 的通用曲线预编译提案含 BLS12-377 支持与配对基准数据EIPS/eip-3026.md依赖本 EIP 的 BW6-761 预编译证明组合场景EIPS/eip-1109.md 与 EIPS/eip-2046.md本 EIPrequires的两个提案分别针对预编译 CALL 成本与 STATICCALL 成本优化是理解预编译生态经济模型的关键背景。本文所有技术事实均来自 EIPS/eip-2539.md 原文及其在本仓库中的关联提案该 EIP 状态为 Stagnant尚未在任何以太坊主网激活文中 Gas 价格与地址分配均为提案设计值实际部署以最终激活版本为准。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考