EIP-8149 详解:EIPs 仓库中的 Multi KZG Point Evaluation 预编译——单次调用批量验证多个 Blob 开点
2026/9/16 16:48:54 网站建设 项目流程

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

其中zy均为按大端序填充的 32 字节字段元素。预编译执行的逻辑(源自 EIPS/eip-4844.md 的point_evaluation_precompile)为:

  1. 断言输入长度为 192 字节;
  2. 通过kzg_to_versioned_hash(commitment) == versioned_hash校验承诺与版本化哈希匹配,其中:
def kzg_to_versioned_hash(commitment: KZGCommitment) -> VersionedHash: return VERSIONED_HASH_VERSION_KZG + sha256(commitment)[1:]
  1. 调用verify_kzg_proof(commitment, z, y, proof)验证 KZG 证明,声称多项式p(z) = y
  2. 返回FIELD_ELEMENTS_PER_BLOBBLS_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为开点数量,pairsn(z, y)对(每组 64 字节),proof为末尾 48 字节的 KZG 聚合证明。规范强调:所有zy必须严格小于BLS_MODULUS(即52435875175126190479447740508185965837690552500527637822603658699938581184513)。

输出编码

成功时返回与 EIP-4844 单点预编译完全一致的 64 字节:

FIELD_ELEMENTS_PER_BLOB : uint256 (big-endian) BLS_MODULUS : uint256 (big-endian)

4096BLS_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()

伪代码展示了完整的执行流程:

  1. 解析头部:读取 32 字节versioned_hash、48 字节commitment与大端序uint32n
  2. 边界校验:断言1 <= n <= MAX_MULTI_POINTS(即n至少为 1、至多为 128),并断言输入长度精确等于132 + n * 64,防止畸形输入;
  3. 逐点解析:从偏移 84 开始按 64 字节步长解析每组(z_i, y_i),并逐一断言z_i < BLS_MODULUSy_i < BLS_MODULUS(非规范字段元素直接拒绝);
  4. 读取证明:取末尾 48 字节作为聚合 KZG 证明;
  5. 承诺校验:与单点版本一致,通过kzg_to_versioned_hash(commitment) == versioned_hash确认承诺与版本化哈希匹配;
  6. 批量验证:调用verify_kzg_proof_multi(commitment, z_values, y_values, proof)一次验证全部开点;
  7. 返回结果:返回固定的 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 部分明确了三个关键设计决策:

  1. 保留 EIP-4844 的版本化哈希模型与返回格式:不改变kzg_to_versioned_hash语义,也不改变返回的FIELD_ELEMENTS_PER_BLOB | BLS_MODULUS64 字节结构,最大限度降低合约集成成本,并保持对后续承诺格式升级(版本化哈希设计正是为此预留)的兼容性;
  2. 新增预编译而非修改0x0A:修改现有预编译存在兼容性风险——现有合约对0x0A的输入长度(固定 192 字节)和语义已有依赖,新增预编译可以完全规避对已部署合约行为的任何影响;
  3. 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 规范了三条硬性安全要求:

  1. 拒绝非规范字段元素:任何>= BLS_MODULUSzy必须被拒绝(伪代码中通过逐点断言强制执行)。这防止了利用字段约化歧义绕过验证的攻击面;
  2. 复用 EIP-4844 的 trusted setup 与子群检查:实现 MUST 使用与 EIP-4844 完全相同的可信设置参数,并执行相同的子群(subgroup)检查,确保承诺与证明的编码合法性;
  3. 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_ADDRESSMULTI_POINT_EVALUATION_BASE_GASMULTI_POINT_EVALUATION_PER_POINT_GAS三个常量均标记为TBD,尚待最终确定。

对于希望跟进或实现该提案的读者,可以从以下仓库文件入手:

  • 提案正文:EIPS/eip-8149.md
  • 前置依赖规范:EIPS/eip-4844.md(重点阅读其 Point evaluation precompile 小节与 Cryptographic Helpers 部分,理解verify_kzg_proofverify_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询