KZG、BLS12-381 与 EIP-4844 Blob 工作流
从 4096 个 field elements 到 versioned hash 与 point-evaluation precompile
Scope. 本文给出 KZG 到 EIP-4844 的精确对象链:blob bytes、evaluation-form polynomial、commitment、versioned hash、blob proof、sidecar validation 与
0x0apoint-evaluation precompile。
EIP-4844 没有把 blob 直接交给 EVM。consensus layer 传播 blob sidecars,execution payload 保存 commitment 的 versioned hash;KZG 将两者绑定,并提供点值验证接口。1 2
从 Blob Bytes 到多项式
一个 EIP-4844 blob 固定包含 4096 个 field elements,每个占 32 bytes:
\[ 4096\times32=131072\ \text{bytes}. \]每个 32-byte chunk 都必须编码一个严格小于 BLS12-381 scalar-field modulus
\[ r=52435875175126190479447740508185965837690552500527637822603658699938581184513 \]的元素。解析器不能先模 \(r\) 归约非法输入;non-canonical element 必须被拒绝。
这 4096 个元素构成多项式 \(p\) 在 4096 次单位根域上的 evaluations。规范将 polynomial 表示为 evaluation form,并使用 bit-reversal permutation 对齐 roots of unity 与 Lagrange setup。把 128 KiB 直接视作系数数组会得到错误 commitment;索引次序是 interoperability 的一部分。
KZG Commitment 与 Opening
Structured Reference String
抽象 KZG SRS 包含
\[ [1]_1,[\tau]_1,\ldots,[\tau^d]_1 \]以及 verifier 所需的 G2 powers。对 coefficient-form polynomial
\[ p(X)=\sum_{i=0}^{d}a_iX^i, \]commitment 为
\[ C=\sum_{i=0}^{d}a_i[\tau^i]_1=[p(\tau)]_1. \]Deneb 规范针对 evaluation form 使用 KZG_SETUP_LAGRANGE,因此 blob_to_kzg_commitment 直接计算 4096 个 Lagrange-basis G1 points 与 blob evaluations 的 MSM。输出 \(C\) 是 48-byte compressed G1 point。
单点 Opening Equation
若声称 \(p(z)=y\),定义商多项式
\[ q(X)=\frac{p(X)-y}{X-z} \]并令 proof
\[ \pi=[q(\tau)]_1. \]verifier 检查
\[ e(C-[y]_1,[1]_2) =e(\pi,[\tau]_2-[z]_2). \]右侧用 SRS 中的 \([\tau]_2\) 构造 \([\tau-z]_2\)。等式只在 commitment、\(z\)、\(y\)、proof 与同一 SRS 对齐时成立。
Blob Proof 如何绑定整份数据
compute_blob_kzg_proof(blob) 先计算 commitment,再用 domain-separated transcript
得到 evaluation challenge,随后为 \(p(z)\) 构造 KZG proof。challenge 同时吸收完整 blob 与 commitment,所以 prover 不能在看到 \(z\) 后替换数据或承诺。
verify_blob_kzg_proof 会重新解析 blob、重算同一 challenge 和 \(y=p(z)\),再调用单点 KZG verification。batch verifier 另用 RCKZGBATCH___V1_ 域分离,把全部 commitments、points、values 和 proofs 吸收后生成 batching challenge。
这一区分很重要:普通 verify_kzg_proof(C,z,y,pi) 检查调用方给出的一个 evaluation claim;verify_blob_kzg_proof(blob,C,pi) 还负责从 blob 与 commitment 导出 challenge,并证明 commitment 对应这份完整 blob。
Commitment 到 Versioned Hash
blob transaction 的 execution payload 不携带完整 blob 或 48-byte commitment,只携带 32-byte versioned hashes。EIP-4844 定义
\[ \mathsf{vh}(C)=\texttt{0x01}\,\|\,\mathsf{SHA256}(C)[1:32]. \]版本字节允许未来引入其他 commitment scheme。execution layer 的 32-byte 引用因此不能直接取普通 sha256(C);漏掉首字节替换会产生不可互操作的交易。
网络传播的 blob transaction wrapper 包含
\[ (\text{tx payload},\ \text{blobs},\ \text{commitments},\ \text{proofs}). \]节点至少检查:
- transaction 内的 versioned-hash list 与 blobs、commitments、proofs 三个列表长度一致;
- 每个 commitment 的 versioned hash 等于交易中的对应引用;
- 每个 blob、commitment 与 proof 通过 blob KZG verification,允许使用 batch verifier。
beacon block body 保存 blob_kzg_commitments,blob data 作为 sidecars 传播和保存;execution layer 负责交易中的 versioned hashes、blob gas 与相关有效性条件。EVM contract 无法直接读取 blob bytes。
0x0a Point-Evaluation Precompile
EIP-4844 在地址 0x0a 定义固定 192-byte 输入:
| Offset | Length | Object |
|---|---|---|
| 0 | 32 | versioned hash |
| 32 | 32 | \(z\) |
| 64 | 32 | \(y\) |
| 96 | 48 | commitment \(C\) |
| 144 | 48 | proof \(\pi\) |
precompile 先检查
\[ \mathsf{vh}(C)=\text{input.versioned\_hash}, \]再检查 \(p(z)=y\) 的 KZG proof。\(z,y\) 使用大端格式并必须严格小于 \(r\)。成功时返回两个 padded 32-byte values:4096 与 \(r\);固定 gas 为 50,000。
这个接口不接收 blob,也不证明某个 192-byte claim 来自当前交易。调用合约要自行把 versioned hash 绑定到 BLOBHASH opcode 返回值或其他可信上下文。EIP-2537 的通用 BLS12-381 pairing precompile 0x0f 也不会自动完成这层 transaction binding。
Trusted Setup 的边界
KZG binding 依赖没有攻击者掌握可恢复的 \(\tau\)。若 toxic waste 泄漏,攻击者可能为同一 commitment 构造不一致 openings。mainnet preset 与本地测试用的 insecure/minimal setup 不能混用。
Deneb 的 preset 需要:
- 4096 个 monomial-form G1 setup points;
- 65 个 G2 setup points;
- 4096 个 Lagrange-form G1 commitments。
客户端或库加载 setup 时要验证来源、格式、数量和网络配置。可信 ceremony 的安全声明通常是“至少一名参与者正确销毁秘密贡献”;artifact 分发和版本选择仍需审计。3
对象与责任清单
| 对象 | 长度/规模 | 主要验证责任 |
|---|---|---|
| blob | 131072 bytes | 4096 个 canonical field elements |
| KZG commitment | 48 bytes | valid G1 encoding;identity 按规范允许 |
| KZG proof | 48 bytes | 与 commitment 相同的 G1 validation |
| versioned hash | 32 bytes | `0x01 |
| blob proof challenge | 1 field element | 吸收 domain、degree、blob、commitment |
| point-evaluation input | 192 bytes | hash binding + canonical \(z,y\) + KZG opening |
| trusted setup | 4096/65/4096 points | 网络、格式、来源和完整性一致 |
常见接线错误
- 把 blob chunks 当 coefficient form,忽略 evaluation order 和 bit reversal;
- 对大于等于 \(r\) 的 field element 先取模再承诺;
- 只验证 KZG proof,漏掉 commitment 到 versioned hash 的绑定;
- 混淆 blob proof challenge 与外部指定的 point evaluation;
- 把 sidecar 可用性当作 execution-layer contract 已验证的事实;
- 在生产网络加载测试 setup;
- 把 EIP-2537 通用 pairing 与 EIP-4844
0x0a专用接口视为等价调用。
Summary
EIP-4844 的 KZG 链可以逐项复核:
- 131072-byte blob 解析为 4096 个 canonical scalar-field elements;
- evaluations 与 Lagrange SRS 做 MSM,产生 48-byte commitment;
- blob 与 commitment 经域分离哈希产生 opening point,并生成 blob KZG proof;
- commitment 映射为
0x01 || sha256(C)[1:],进入 transaction payload; - sidecar validation 绑定 blob、commitment、proof 与 versioned hash;
0x0a对一个 192-byte point-evaluation claim 执行 hash binding 和 KZG verification;- 整条链共享 mainnet trusted setup 与 BLS12-381 scalar/group encoding。
References
-
EIP-4844: Shard Blob Transactions, https://eips.ethereum.org/EIPS/eip-4844. ↩︎
-
Ethereum Consensus Specs, Deneb – Polynomial Commitments, https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/polynomial-commitments.md. ↩︎
-
Ethereum Foundation, KZG Ceremony, https://ceremony.ethereum.org/. ↩︎