Ethereum 配对曲线接口史:BN254 与 Pectra 后的 BLS12-381
precompile、gas、ABI 与迁移边界
Fact boundary, 2026-08-08. Pectra 已于 2025-05-07 10:05:11 UTC 在 Ethereum 主网激活,EIP-2537 已成为执行层能力。本文讨论上线后的 ABI、gas、subgroup checks 与采用边界。
Ethereum 的配对曲线历史由三次接口变化组成:Byzantium 加入 BN254 precompiles,Istanbul 通过 EIP-1108 repricing,Pectra 再加入七个 BLS12-381 precompiles。曲线安全性解释升级动机,precompile 地址和成本决定合约能否消费它。
时间线与能力变化
| 阶段 | 规范 | 新能力 | 对协议的直接影响 |
|---|---|---|---|
| Byzantium | EIP-196 | BN254 add 0x06、mul 0x07 |
合约可低成本做 G1 运算 |
| Byzantium | EIP-197 | BN254 pairing check 0x08 |
Groth16 等 pairing verifier 获得链上接口 |
| Istanbul | EIP-1108 | BN254 gas repricing | 相同 verifier 的执行成本显著下降 |
| Dencun | EIP-4844 | KZG point evaluation 0x0a |
为 blob/KZG 特定 opening 提供固定接口 |
| Pectra | EIP-2537 | BLS12-381 0x0b–0x11 |
合约可调用通用 G1/G2、MSM、pairing 和 map-to-curve 运算 |
EIP-4844 的 0x0a 与 EIP-2537 的七个地址职责不同。前者验证一个带 versioned hash 的 KZG evaluation claim;后者提供通用 BLS12-381 arithmetic。应用不能把二者互换。
BN254:可部署性如何形成路径依赖
EIP-196 规定 32-byte big-endian field elements、(x,y) 点编码和 infinity (0,0)。EIP-197 的 pairing 输入按每对 192 bytes 解析,并对 G2 做 subgroup-order 检查。1 2
初始 gas 与 EIP-1108 后 gas 如下:
| BN254 operation | Address | 初始 gas | EIP-1108 后 |
|---|---|---|---|
| ECADD | 0x06 |
500 | 150 |
| ECMUL | 0x07 |
40,000 | 6,000 |
| pairing, \(k\) pairs | 0x08 |
\(80{,}000k+100{,}000\) | \(34{,}000k+45{,}000\) |
repricing 改变了 verifier 的可行成本,没有改变曲线、proof system 或既有合约。BN254 随后形成路径依赖:verifying keys、proving stacks、Solidity wrappers 和审计经验都围绕这些地址积累。3
EIP-2537 的动机把 BN254 precompile 的安全级别概括为约 80 bits,将 BLS12-381 定位为 120+ bits。这个数字是协议升级动机中的工程判断;具体安全估计仍受攻击模型和实现影响。4
Pectra 后的 BLS12-381 能力表
Pectra 公告将 EIP-2537 列为主网升级内容,并给出 epoch 364032 的激活时间。七个 precompiles 为:5
| Address | Operation | 固定或基础 gas |
|---|---|---|
0x0b |
G1 addition | 375 |
0x0c |
G1 MSM | \(12{,}000k\cdot d_1(k)/1000\) |
0x0d |
G2 addition | 600 |
0x0e |
G2 MSM | \(22{,}500k\cdot d_2(k)/1000\) |
0x0f |
pairing check, \(k\) pairs | \(32{,}600k+37{,}700\) |
0x10 |
Fp to G1 | 5,500 |
0x11 |
Fp2 to G2 | 23,800 |
\(d_1,d_2\) 是 EIP-2537 对 MSM 数量给出的折扣表,\(k>128\) 时使用 capped discount。表中的单点 multiplication 费用来自 MSM 在 \(k=1\) 的情形;规范没有设置独立 MUL 地址。
ABI 与 Encoding
EIP-2537 使用未压缩、32-byte aligned 的大端编码:
| 对象 | 编码长度 |
|---|---|
| Fp element | 64 bytes,最高 16 bytes 必须为零 |
| Fp2 element | 128 bytes,`c0 |
| G1 point | 128 bytes,`x |
| G2 point | 256 bytes,`x |
| scalar | 32 bytes |
| pairing pair | 384 bytes,G1 128 + G2 256 |
G1 MSM 每项是 160 bytes,G2 MSM 每项是 288 bytes。infinity 分别编码为 128 或 256 个零字节。field element 必须严格小于 modulus;32-byte MSM scalar 则不要求小于或等于 subgroup order。无效长度、坐标或群元素导致 error,并烧掉调用提供的全部 gas。
Subgroup Checks 的不对称
ABI 的安全边界不能概括成“precompile 会检查点”:
- G1/G2 addition 检查编码和曲线成员,不执行 subgroup check;
- G1/G2 MSM 必须执行 subgroup check;
- pairing 输入的 G1 与 G2 点都必须位于阶为 \(q\) 的 subgroup;
- map-to-curve 接收 field element 并输出 subgroup point,但不负责任意 bytes 到 field 的 hash-to-field 步骤。
调用方要按协议数据来源决定 subgroup validation 放在哪一层。把未经验证的 addition 结果当作已验证公钥,会扩大 wrong-subgroup 风险面;坐标不在曲线上的输入仍会被 precompile 拒绝。
上线不等于自动迁移
EIP-2537 消除了通用 BLS12-381 execution precompile 的缺口,同时保留四类 adoption cost:
- 已部署 BN254 verifier 的地址、verifying key 与 proof format 不会改变;
- Solidity wrappers 和上层协议必须采用新 ABI,并处理未压缩点编码;
- 不同操作的 subgroup 职责不同,安全审计需要按调用路径重做;
- BLS、KZG 或其他 pairing 协议仍需自己的 domain separation、message binding、SRS 或 proof rules。
因此,Pectra 后的工程问题从“有没有 BLS12-381 precompile”转为“哪个协议值得迁移、迁移后用哪个地址、谁负责输入验证,以及 gas 是否优于现有路径”。
与 EIP-4844 的边界
EIP-4844 在 Pectra 之前已经通过 0x0a 暴露 point-evaluation precompile,固定消耗 50,000 gas。它接收 192 bytes:versioned hash、\(z\)、\(y\)、48-byte commitment 和 48-byte proof,并同时检查 hash binding 与 KZG opening。6
通用 EIP-2537 pairing 可以构造更多 BLS12-381 协议,却不取代 blob transaction 的 consensus validation、sidecars、versioned hashes 或 0x0a 接口。下一篇只展开这条 KZG/blob 专用工作流。
审计清单
- 用网络 fork/chain configuration 确认 EIP-2537 已激活,避免把测试网或旧客户端状态当主网能力;
- 核对地址与输入长度,特别是
0x0a、0x0f和 G1/G2 MSM 的差异; - 对 64-byte Fp 编码检查最高 16 bytes 与 modulus;
- 明确 addition 之后的 subgroup validation 责任;
- 按 EIP 的 floor-length gas 规则和 error path 测试 malformed inputs;
- 将 curve precompile 验证与 BLS/KZG 上层协议验证分开审计。
Summary
- BN254 的历史优势来自 Byzantium precompiles 与 EIP-1108 repricing。
- Pectra 已把 EIP-2537 的 BLS12-381 通用运算带入主网执行层。
- BLS12-381 ABI 使用未压缩大端编码,addition 与 MSM/pairing 的 subgroup 责任不同。
0x0a是 EIP-4844 专用 point-evaluation;0x0b–0x11是 EIP-2537 通用曲线运算。- 新接口上线后,迁移仍取决于 proof format、合约、库、gas 与协议安全边界。
References
-
EIP-196: Precompiled contracts for addition and scalar multiplication on alt_bn128, https://eips.ethereum.org/EIPS/eip-196. ↩︎
-
EIP-197: Precompiled contracts for optimal ate pairing check on alt_bn128, https://eips.ethereum.org/EIPS/eip-197. ↩︎
-
EIP-1108: Reduce alt_bn128 precompile gas costs, https://eips.ethereum.org/EIPS/eip-1108. ↩︎
-
EIP-2537: Precompile for BLS12-381 curve operations, https://eips.ethereum.org/EIPS/eip-2537. ↩︎
-
Ethereum Foundation, Pectra Mainnet Announcement, https://blog.ethereum.org/2025/04/23/pectra-mainnet. ↩︎
-
EIP-4844: Shard Blob Transactions, https://eips.ethereum.org/EIPS/eip-4844. ↩︎