Dencun 升级 / EIP-4844
Dencun 升级 / EIP-4844
本页内容正在整理中,欢迎贡献。
概述
2024 年 3 月 13 日,以太坊 Dencun 升级激活,其中最核心的改进是 EIP-4844(Proto-Danksharding),引入了 Blob 交易这一新的数据载体类型。这一升级将 Layer 2 Rollup 的数据发布成本降低了约 10 倍,标志着以太坊向 Full Danksharding 迈出了关键一步。
主要内容
EIP-4844 核心概念
Blob(Binary Large Object) 是附加在区块上的临时数据块:
| 特性 | 说明 |
|---|---|
| 大小 | 每个 Blob ~128 KB |
| 数量 | 每区块目标 3 个,最大 6 个(Pectra 后提升) |
| 存储时间 | 约 18 天(~4096 个 epoch),之后可被剪枝 |
| 访问方式 | 合约内无法读取 Blob 内容,只能验证 KZG 承诺 |
| 费用市场 | 独立于 calldata 的 EIP-1559 式费用市场(blob gas) |
为什么对 L2 重要?
Rollup 的主要成本来自将交易数据发布到 L1:
合并前(calldata 方式): 每字节 calldata ≈ 16 gas 1 KB 数据 ≈ 16,384 gas @ $1/Mgas ≈ $0.016
Dencun 后(blob 方式): 1 Blob(128 KB)= 1 blob gas(独立计价) 正常情况下 blob gas price 极低(接近 0 Gwei) → L2 数据发布成本降低 ~10x实际效果(Dencun 激活后):
- Optimism、Arbitrum、Base、zkSync 等主流 L2 交易费用均大幅下降
- 部分 L2 简单转账费用降至 $0.001 以下
技术实现
EIP-4844 新增两个操作码:
BLOBHASH(0x49): 获取当前交易的 blob 版本化哈希BLOBBASEFEE(0x4a): 获取当前区块的 blob base feeRollup 发布 blob 的流程:
// L2 排序器发布 blob 交易(简化示意)const blobData = encodeL2Transactions(transactions); // 压缩的 L2 交易数据const commitment = computeKZGCommitment(blobData); // KZG 多项式承诺
// 发送 Type 3 交易(blob 交易)const tx = { type: 3, to: L2_ROLLUP_CONTRACT, data: "0x", // 合约只需验证 commitment blobs: [blobData], kzgCommitments: [commitment], kzgProofs: [proof], maxFeePerBlobGas: parseGwei("1"),};KZG 多项式承诺
EIP-4844 使用 KZG(Kate-Zaverucha-Goldberg)承诺方案:
- Blob 内容可表示为多项式
- KZG 允许对任意位置的值进行高效证明(点证明)
- 合约通过验证承诺来确认数据的完整性,而无需存储全部数据
- 需要可信设置(Trusted Setup)——以太坊在 2022-2023 年进行了大规模 KZG 仪式,14 万+ 参与者
Dencun 包含的其他 EIP
| EIP | 说明 |
|---|---|
| EIP-1153 | 瞬态存储(TSTORE/TLOAD),Gas 更便宜的临时存储 |
| EIP-4788 | 在 EVM 中访问信标链区块根 |
| EIP-5656 | MCOPY 操作码,内存复制更高效 |
| EIP-6780 | 限制 SELFDESTRUCT,只允许在同笔交易中创建的合约调用 |
| EIP-7044 | 永久有效的签名退出 |
| EIP-7045 | 扩大证明包含窗口 |
| EIP-7514 | 限制最大 churn 限制 |
EIP-1153:瞬态存储
对开发者非常有用的新特性:
// TSTORE / TLOAD:只在当前交易有效的存储,比 SSTORE 便宜 ~20x// 适用于:重入锁、跨函数临时数据传递
contract ReentrancyGuardTransient { // transient 关键字(Solidity 0.8.25+) bool transient private _locked;
modifier nonReentrant() { require(!_locked, "Reentrant call"); _locked = true; _; _locked = false; }}