EIP-8149 详解:EIPs 仓库中的 Multi KZG Point Evaluation 预编译——单次调用批量验证多个 Blob 开点
【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs
EIP-8149 是在 EIPs 仓库中提出的一项 Draft 状态的 Core 类标准提案,它为以太坊引入一个新的预编译(Precompile),用于在一次调用内针对单个 EIP-4844 blob 承诺(commitment)批量验证多个 KZG 开点(z_i, y_i),并返回与现有单点验证预编译完全一致的 64 字节输出。本文以 EIPS/eip-8149.md 为主体,结合其前置依赖 EIPS/eip-4844.md 的规范细节,完整讲解该提案的动机、输入输出编码、验证逻辑、Gas 成本模型与安全约束,帮助读者理解它在乐观 Rollup 欺诈证明等场景中的价值以及落地时的实现要点。
背景:EIP-4844 的单点求值预编译与版本化哈希模型
EIP-8149 严格建立在前置标准 EIP-4844 Shard Blob Transactions(状态 Final)之上。EIP-4844 引入了携带 blob 的交易类型,并配套了执行层可访问的承诺(commitment)与版本化哈希(versioned hash)。其关键常量如下:
| 常量 | 值 | | - | - | |FIELD_ELEMENTS_PER_BLOB|4096| |BLS_MODULUS|52435875175126190479447740508185965837690552500527637822603658699938581184513| |VERSIONED_HASH_VERSION_KZG|Bytes1(0x01)| |POINT_EVALUATION_PRECOMPILE_ADDRESS|Bytes20(0x0A)| |POINT_EVALUATION_PRECOMPILE_GAS|50000|
EIP-4844 在地址0x0A部署了单点求值预编译(point evaluation precompile),每次调用固定消耗 50,000 gas,其输入长度为固定的 192 字节,编码为:
versioned_hash | z | y | commitment | proof其中z和y均为按大端序填充的 32 字节字段元素。预编译执行的逻辑(源自 EIPS/eip-4844.md 的point_evaluation_precompile)为:
- 断言输入长度为 192 字节;
- 通过
kzg_to_versioned_hash(commitment) == versioned_hash校验承诺与版本化哈希匹配,其中:
def kzg_to_versioned_hash(commitment: KZGCommitment) -> VersionedHash: return VERSIONED_HASH_VERSION_KZG + sha256(commitment)[1:]- 调用
verify_kzg_proof(commitment, z, y, proof)验证 KZG 证明,声称多项式p(z) = y; - 返回
FIELD_ELEMENTS_PER_BLOB与BLS_MODULUS两个按大端序填充的 32 字节值,共 64 字节。
同时,EIP-4844 明确要求该预编译必须拒绝非规范字段元素(即提供的字段元素必须严格小于BLS_MODULUS),且执行层(BLOBHASH操作码、版本化哈希引用)不直接暴露 blob 原始数据——合约只能通过版本化哈希与求值预编译间接访问 blob 内容。
动机:多次开点的成本痛点
EIP-4844 的单点求值预编译每次调用固定消耗 50,000 gas。对于需要读取单个 blob 内多个位置数据的合约,例如乐观 Rollup 的欺诈证明(fraud proof)——它需要分步加载 blob 中多个字段值来验证状态转换——若逐个调用0x0A,每多验证一个开点就要额外支付 50,000 gas,成本随开点数量线性膨胀。
EIP-8149 的核心动机正是消除这一重复开销:提供一个批量接口,在一次预编译调用内验证k个开点,从而显著降低多次开点的总成本。这使得 blob 数据访问密集型应用(尤其是欺诈证明类场景)能够以更低的开销完成多值验证。
规范:常量、输入与输出
EIP-8149 引入四个新常量:
| 名称 | 值 | 说明 | | - | - | - | |MULTI_POINT_EVALUATION_PRECOMPILE_ADDRESS|TBD| 预编译地址(待定) | |MAX_MULTI_POINTS|128| 最大求值点数 | |MULTI_POINT_EVALUATION_BASE_GAS|TBD| 基础 Gas 成本(待定) | |MULTI_POINT_EVALUATION_PER_POINT_GAS|TBD| 每个求值点的 Gas 成本(待定) |
输入编码
预编译输入为:
versioned_hash : Bytes32 commitment : Bytes48 n : uint32 (big-endian) pairs : n × (z: Bytes32, y: Bytes32) proof : Bytes48总长度为132 + (n × 64)字节。其中n为开点数量,pairs为n组(z, y)对(每组 64 字节),proof为末尾 48 字节的 KZG 聚合证明。规范强调:所有z和y必须严格小于BLS_MODULUS(即52435875175126190479447740508185965837690552500527637822603658699938581184513)。
输出编码
成功时返回与 EIP-4844 单点预编译完全一致的 64 字节:
FIELD_ELEMENTS_PER_BLOB : uint256 (big-endian) BLS_MODULUS : uint256 (big-endian)即4096与BLS_MODULUS两个 32 字节大端整数。保持相同的返回格式,使得调用方可以沿用已有的解析逻辑,无需为批量预编译编写两套返回值处理。
预编译验证逻辑(Python 伪代码)
def multi_point_evaluation_precompile(input: Bytes) -> Bytes: versioned_hash = input[:32] commitment = input[32:80] n = int.from_bytes(input[80:84], 'big') assert 1 <= n <= MAX_MULTI_POINTS assert len(input) == 132 + n * 64 z_values, y_values = [], [] for i in range(n): offset = 84 + i * 64 z_i = int.from_bytes(input[offset:offset+32], 'big') y_i = int.from_bytes(input[offset+32:offset+64], 'big') assert z_i < BLS_MODULUS and y_i < BLS_MODULUS z_values.append(z_i) y_values.append(y_i) proof = input[84 + n*64 : 84 + n*64 + 48] assert kzg_to_versioned_hash(commitment) == versioned_hash assert verify_kzg_proof_multi(commitment, z_values, y_values, proof) return U256(FIELD_ELEMENTS_PER_BLOB).to_be_bytes32() + U256(BLS_MODULUS).to_be_bytes32()伪代码展示了完整的执行流程:
- 解析头部:读取 32 字节
versioned_hash、48 字节commitment与大端序uint32的n; - 边界校验:断言
1 <= n <= MAX_MULTI_POINTS(即n至少为 1、至多为 128),并断言输入长度精确等于132 + n * 64,防止畸形输入; - 逐点解析:从偏移 84 开始按 64 字节步长解析每组
(z_i, y_i),并逐一断言z_i < BLS_MODULUS与y_i < BLS_MODULUS(非规范字段元素直接拒绝); - 读取证明:取末尾 48 字节作为聚合 KZG 证明;
- 承诺校验:与单点版本一致,通过
kzg_to_versioned_hash(commitment) == versioned_hash确认承诺与版本化哈希匹配; - 批量验证:调用
verify_kzg_proof_multi(commitment, z_values, y_values, proof)一次验证全部开点; - 返回结果:返回固定的 64 字节。
底层密码学原理
verify_kzg_proof_multi使用 EIP-4844 的 trusted setup 与 BLS12-381 配对运算完成多开点验证。规范明确指出两种典型实现路径:
- Lagrange 插值法:通过 Lagrange 插值构造经过所有
(z_i, y_i)对的多项式,复杂度为O(n²); - FFT 加速法:当求值点对齐于单位根(roots of unity)时,可改用 FFT 方法将复杂度降至O(n log n)。
最后一步验证使用单次配对检查(single pairing check)同时验证所有开点,这正是批量验证相对逐点验证的成本优势来源——多个开点的验证工作被聚合到一次密码学运算中。
Gas 成本模型
EIP-8149 的 Gas 成本定义为:
def gas_cost(n: int) -> int: return MULTI_POINT_EVALUATION_BASE_GAS + MULTI_POINT_EVALUATION_PER_POINT_GAS * n其中MULTI_POINT_EVALUATION_BASE_GAS为基础成本(覆盖输入解析与承诺校验等固定开销),MULTI_POINT_EVALUATION_PER_POINT_GAS为每个求值点的边际成本,n为开点数量。规范要求:
- 批量必须更便宜:Gas 常量应确保对于
n > 1,批量调用总成本低于n次独立的0x0A(每次 50,000 gas)调用之和; - 反映真实计算成本:BLS12-381 配对运算是计算密集型的,Gas 定价必须反映实际的密码学计算开销,避免出现 Gas 计量与实际工作量严重背离的情况。
值得注意的是,两个 Gas 常量目前均为TBD(待定),说明该提案仍处于设计完善阶段,最终数值需要结合基准测试与实现成本确定——这也与它 Draft 的状态一致。
设计权衡(Rationale)
EIP-8149 的 Rationale 部分明确了三个关键设计决策:
- 保留 EIP-4844 的版本化哈希模型与返回格式:不改变
kzg_to_versioned_hash语义,也不改变返回的FIELD_ELEMENTS_PER_BLOB | BLS_MODULUS64 字节结构,最大限度降低合约集成成本,并保持对后续承诺格式升级(版本化哈希设计正是为此预留)的兼容性; - 新增预编译而非修改
0x0A:修改现有预编译存在兼容性风险——现有合约对0x0A的输入长度(固定 192 字节)和语义已有依赖,新增预编译可以完全规避对已部署合约行为的任何影响; MAX_MULTI_POINTS = 128平衡输入尺寸与收益:128 的上限把单次调用输入控制在132 + 128 × 64 = 8324字节以内,避免输入过大带来的区块/内存压力,同时为批量验证保留了有意义的节省空间。
向后兼容性
EIP-8149 明确声明不修改EIP-4844 的任何既有机制:
- 不改变 blob 交易(blob transactions)的格式与语义;
- 不改变
BLOBHASH操作码(0x49,成本 3 gas); - 不改变地址
0x0A上既有的单点求值预编译。
因此该提案是一个纯增量式扩展:新增的预编译地址不会与任何现有 precompile 冲突,现有依赖 EIP-4844 的合约行为完全不受影响。
安全考量
EIP-8149 规范了三条硬性安全要求:
- 拒绝非规范字段元素:任何
>= BLS_MODULUS的z或y必须被拒绝(伪代码中通过逐点断言强制执行)。这防止了利用字段约化歧义绕过验证的攻击面; - 复用 EIP-4844 的 trusted setup 与子群检查:实现 MUST 使用与 EIP-4844 完全相同的可信设置参数,并执行相同的子群(subgroup)检查,确保承诺与证明的编码合法性;
- Gas 定价必须反映实际计算成本:由于内部依赖 BLS12-381 配对运算,若 Gas 定价过低,恶意调用者可能以远低于计算成本的价格滥用预编译,形成针对执行客户端的 DoS 向量;同时定价也不能高到削弱批量验证的经济价值。
此外,输入长度精确断言(len(input) == 132 + n * 64)与1 <= n <= 128的边界检查,共同构成了对畸形输入的第一道防线。
状态与实现指引
截至当前仓库快照,EIP-8149 处于Draft(草案)状态,类型为 Standards Track / Core,创建于 2026-02-06,作者为 Chris Mata(@protocolwhisper),依赖 EIP-4844。MULTI_POINT_EVALUATION_PRECOMPILE_ADDRESS、MULTI_POINT_EVALUATION_BASE_GAS、MULTI_POINT_EVALUATION_PER_POINT_GAS三个常量均标记为TBD,尚待最终确定。
对于希望跟进或实现该提案的读者,可以从以下仓库文件入手:
- 提案正文:EIPS/eip-8149.md
- 前置依赖规范:EIPS/eip-4844.md(重点阅读其 Point evaluation precompile 小节与 Cryptographic Helpers 部分,理解
verify_kzg_proof、verify_blob_kzg_proof_batch等底层函数的语义) - 提案的版权声明指向仓库根目录的 LICENSE.md(CC0 协议)
该提案的落地将直接惠及需要从单一 blob 承诺中提取多个字段值的合约,尤其是乐观 Rollup 欺诈证明中按需加载 blob 多个数据块、再通过求值预编译逐值验证的场景——将原本多次 50,000 gas 的调用压缩为一次批量验证,是 blob 数据可用性之上执行层数据访问成本优化的重要一步。
【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考