什么是 EIP-4844?Proto-Danksharding 和 Blob 交易解析

  • cyfrin
  • 发布于 2025-01-08 23:56
  • 阅读 24

EIP-4844是一项以太坊改进提案,介绍了名为“blob”的新交易类型,可以降低区块链rollup的交易成本。这些blob携带短期数据,删除后不会在链上永久存储,使rollup在将交易批量提交到以太坊主链时更加高效。

什么是 EIP-4844?了解 proto-danksharding 和 blobs 的概念,它们的工作原理,以及如何使用新的以太坊改进提案发送你的第一笔 blob 交易。

EIP-4844 (以太坊改进提案) 向以太坊区块链引入了一种新类型的交易,允许 区块链 rollups 更便宜地结算其交易。这些新交易接受被称为“blobs”的大块数据,这些数据在短时间后会被删除。

在本文中,我们将探讨:

  1. EIP-4844 是什么?
  2. 什么是 blob 交易?
  3. 它们为什么会被引入?

在深入了解 EIP-4844 之前,我们首先需要理解有不同种类的交易。

区块链交易类型

在“正常”交易中,你所有的交易数据都会被永久存储在链上。如今,最常见的交易类型是类型 2 交易。交易类型有很多:

  • 类型 0:又称为“传统”交易
  • 类型 1:又称为“访问列表”交易(由 EIP-2930 引入)
  • 类型 2:新的“正常”交易(由 EIP-1559 引入)

而我们将在本文中讨论的是由 EIP-4844 引入的 类型 3 交易,即 blob 交易。

什么是 Blob 交易?

Blob 交易,是由 EIP-4844 引入的,也称为“Proto-danksharding”,为以太坊添加了一种新的数据结构,该结构会在大约 20 - 90 天后从链上删除

这大块最终删除的数据被称为 blob,这是一个(某种意义上的)首字母缩略词,意味着:“ B inary L arge OB ject。”

展示 EIP-4884 如何使用 blobs 创建更便宜的交易的图像

Blob 交易在 2024 年 3 月 13 日的 以太坊 Dencun 升级中得以实现,区块链 rollups 也对此十分满意。这些来自于 EIP-4844,即“Proto-danksharding”(是为了纪念创建它的研究人员,而不是因为这名字听起来很酷)。

许多人使用“侧车”类比。blob 就是摩托车的侧车。摩托车是交易,而侧车是 blob。

进一步来说,我们点燃侧车并在一个月后将其丢弃。

将数据放入 blob 中使 rollups 更便宜地 将交易结算到 L1。但是在理解为什么/如何做到这一点之前,我们必须先了解交易是如何耗费 gas 的。即使你认为自己已经知道,也请仔细阅读下一段。

为什么区块链交易会耗费 gas?

在我们了解为什么在新的 EIP-4884 中添加 blobs 之前,首先要了解我们为何 需要支付交易费用

每当我们在链上进行任何操作时,每个区块链节点都必须计算存储一些数据。我们 需要支付 gas 是因为当发送交易时,我们向数千台计算机请求进行大量工作,而这会花费它们的钱。

  • 计算:耗费电力
  • 存储:有硬件成本
  • 发送消息:网络流量也有相关成本

因此,如果我们想在链上存储 20 GB 的《怪物史瑞克》,我们就需要 为数千个节点 购买所需的硬件提供空间以存储这部电影。

所以每当我们要求某个节点“做任何事情”时,我们必须 支付 gas。如果我们告诉他们:“你需要永远存储 20 GB 的《怪物史瑞克》” (这显然是以太坊之前的工作方式,所有数据基本上是永远存储的),那么我们应该比仅要求他们存储这部电影几个月要支付得多。

展示 EIP-4844  如何通过 blobs 使数据存储更便宜的图像

请记住,我们稍后会回来讨论这个问题。

我们为什么决定添加 blob 交易?

那么,我们为什么要给交易这个可选的框来丢弃数据呢?

好吧,这与当前以太坊面临的最大问题有关:

在以太坊上发送 1 美元的费用是 2 美元,即扩展性问题。区块链面临着 区块链三难困境,即很难兼顾以下三点:

  • 去中心化
  • 安全性
  • 可扩展性

以太坊旨在实现 最大化的去中心化安全性,因此在扩展性上面临困难。

作为一个社区,我们决定 基于乐观和零知识证明的区块链 rollups 是我们在短期和长期扩展 ETH 的方法。Rollups 通过在他们的 roll-up 链 上执行交易,将其打包,并随后将其 “结算”回 L1(以太坊)来帮助我们扩展 ETH。这使得 交易更便宜 同时保持许多 以太坊的安全性 属性。

许多 第二层区块链 在处理交易,比如 zkSyncArbitrumOptimism,你可以以更便宜的价格获得更多的交易,因为你正在压缩它们。

展示 EIP-4844 如何让交易在 zkSync、Optimism 和 Arbitrum 等 rollup 解决方案上变得更便宜的图像

当这些 L2 将这些批处理提交回以太坊时,以太坊必须做一些工作以验证批量交易的有效性,而问题就在于此。

以太坊只需验证批次是否有效一次,然后就再不需要那些数据。但是在 EIP-4844 之前,以太坊没有(好的)方法来删除数据,因此它永久存储这些数据。

你明白这个问题了吗?

  • 我们只需要这大批数据在一个单一的瞬间
  • 没有人再关心这些数据。
  • 但每一个 ETH 节点都必须从那时起存储它。

这就像每当你通过学校考试时,你都必须带着那次考试。过了 20 年后,你实际上只是在随身携带一大堆纸张,从你的博士论文到你学习“cat”这个词时的拼写测试。

如果回到我们之前的《怪物史瑞克》例子,可以看出这之间的联系。

Rollups 在提交这大量只需要瞬间用到的数据时消耗了大量的 gas。而 rollups 是让以太坊扩展的 关键,所以我们应该将其视为优先考虑的公民。有没有什么办法可以让它们的生活更轻松一点?

“如果我们在验证交易后就删除这些数据呢?”

  • Rollups

于是,blobs 就这样诞生了。

Blobs 如何用于验证 rollup 交易?

那么,blobs 实际上是如何被使用的呢?

现在的流程是:

  1. roll-up(如 zkSync)压缩他们的交易列表。
  2. 将压缩后的列表作为 blob 提交到以太坊 L1,同时附带证明。
  3. L1 验证交易批次。
  4. 最终 blob 从 L1 删除。

我们将进行一些技术上的探讨,请做好准备。

这是一个 在 Etherscan 上的 blob 交易示例。这是一个 zkSync 提交带有 blobs 附加的交易批次到以太坊的例子。那么,这些 blobs 是如何被使用的呢?

展示在 Etherscan 上通过 EIP-4884 发送的 blobs 图像

如果我们点击那个蓝色的“2 blobs”部分,我们可以看到 blob 本身,以及当我们使用 blob 而不是 calldata 时,此交易变得多么便宜的一个快照!

展示在 Etherscan 上的 EIP-4884 交易 blobs 详情的图像

现在,如果 EVM 可以直接访问 blob 数据,则节点将不得不永久存储这些数据。EVM/以太坊节点需要保留它们进行的所有计算的历史记录,因此如果它们直接对 blobs 进行计算,我们就必须存储该计算,因此存储整个 blob。但我们不想这样做,因为我们不希望永远存储 blob。我们会回到原点!因此,EVM 不能访问 blob 数据。

EIP-4844 的创建者聪明地添加了一个新的操作码和预编译:

借助这两个新工具,我们可以利用“密码学数学魔法”来验证 blob 是否有效,而实际上无需在链上存储 blob 数据或将其加载到 EVM 可以访问的环境中。

当 zkSync 验证者/操作员准备将一系列交易提交回 L1 时,它调用 commitBatches:

function commitBatches(
        StoredBatchInfo calldata,
        CommitBatchInfo[] calldata _newBatchesData

在 _newBatchesData 对象中,它传递一些证明,这些证明与 blob 哈希(通过 BLOBHASH 操作码获得)结合,使智能合约能够验证交易批次的有效性。稍后,函数将最终调用:

/// @dev 验证 blobs 是否包含正确数据,调用点评估预编译。对于该预编译,我们需要:
    /// 版本哈希 || 开放点 || 开放值 || 承诺 || 证明
    /// _pubdataCommitments 将包含最后 4 个值得,版本哈希是从 BLOBHASH 操作码中提取的
    /// pubdataCommitments 是列表:开放点(16 字节) || 声明值(32 字节) || 承诺(48 字节) || 证明(48 字节)=144 字节
    function _verifyBlobInformation(
        bytes calldata _pubdataCommitments,
        bytes32[] memory _blobHashes
    ) internal view returns (bytes32[] memory blobCommitments) {

该函数将执行实际的 blob 验证。

BLOBHASH 操作码将获取 blob 的 hash,而非整个 blob,我们可以将其与一些证明和其他“数学东西”结合,再传递给新的 `point evaluation` 预编译(这个函数最终也是如此)。点评估进行一些“数学魔法”来验证 blob 哈希是否有效。你可以从 evm.codes. 了解更多输入。

现在,我们并不会立即删除 blobs。这是因为我们希望其他节点有一些时间来确保正在计算的 BLOBHASH 是正确的,因此以太坊社区允许 blobs 传播。实际上这只需要几块,但我们留出 20 - 90 天的窗口来删除 blobs。

就这样!我们现在可以验证这些 L2 交易是有效的。这巨大 blob 代表所有的交易,但我们可以仅通过哈希和一些巧妙的数学来验证它们的有效性。

这就是 blobs 的工作原理。

如何发送你的 blob 交易

我们创建了一个 最小仓库 来展示 如何使用新的 Eip-4884 在 web3.py 中发送带有 blob 的交易。该设置与 EIP-1559 (正常) 交易的设置非常相似。你需要设置一个 EIP-2718 TransactionPayload,格式类似于这样:

tx = {
        "type": 3,
        "chainId": 31337,  # Anvil
        "from": acct.address,
        "to": "0x0000000000000000000000000000000000000000",
        "value": 0,
        "maxFeePerGas": 10**12,
        "maxPriorityFeePerGas": 10**12,
        "maxFeePerBlobGas": to_hex(10**12),
        "nonce": w3.eth.get_transaction_count(acct.address),
    }
## 这是表示 EIP-2718 TransactionPayload 的内容

而关键的重要部分是添加 blob 本身。你并不将 blob 添加到 EIP-2718 TransactionPayload 的负载中,而是将 blobs 与负载一起发送。根据 EIP,RLP(递归长度前缀:以太坊编码交易数据的方式)看起来如下:

/rlp([tx_payload_body, blobs, commitments, proofs])

另一方面,EIP-1559 交易 在 rlp 中包含 tx_payload_body。因此,在 Python 中,我们可以通过以下方式表示:

## 这将生成 blobs、承诺和 blob tx 的证明
signed = acct.sign_transaction(tx, blobs=[BLOB_DATA])

以太坊和其他库在 编码交易 时也处理大多数证明生成和其他“blob”事情。发送 blob 交易的完整脚本可能如下所示:

import os

from dotenv import load_dotenv
from eth_abi import abi
from eth_utils import to_hex
from web3 import HTTPProvider, Web3

load_dotenv()

def send_blob():
    rpc_url = os.getenv("RPC_URL")
    private_key = os.getenv("ANVIL_PRIVATE_KEY")
    w3 = Web3(HTTPProvider(rpc_url))

    text = "<( o.O )>"
    encoded_text = abi.encode(["string"], [text])

    print("文本:", encoded_text)

    # Blob 数据必须由 4096 个 32 字节的字段元素组成
    # 所以,是的,blobs 必须是相当大的
    BLOB_DATA = (b"\x00" * 32 * (4096 - len(encoded_text) // 32)) + encoded_text

    acct = w3.eth.account.from_key(private_key)

    tx = {
        "type": 3,
        "chainId": 31337,  # Anvil
        "from": acct.address,
        "to": "0x0000000000000000000000000000000000000000",
        "value": 0,
        "maxFeePerGas": 10**12,
        "maxPriorityFeePerGas": 10**12,
        "maxFeePerBlobGas": to_hex(10**12),
        "nonce": w3.eth.get_transaction_count(acct.address),
    }

    gas_estimate = w3.eth.estimate_gas(tx)
    tx["gas"] = gas_estimate

    # 这将生成 blobs、承诺和 blob tx 的证明
    signed = acct.sign_transaction(tx, blobs=[BLOB_DATA])

有关更多信息,请参阅 GitHub 仓库

EIP-4844 之后:Danksharding 和 Blobs 的未来

EIP-4844,又称为“ Proto-danksharding”,是以太坊未来路线图“Danksharding”的一个中间步骤,它将引入更多酷炫的功能。这些将帮助 以太坊 以更公平、负责任的方式进行扩展。然而,完整的 Danksharding 将需要更多的开发和研究,但 rollups 今天就能发挥真实价值。因此,EVM 生态系统决定在进一步完善 Danksharding 之前先推出这一方案。

以太坊文档在解释 Danksharding 的未来方面做得很好,你可以在 以太坊网站 阅读更多内容。

多维 gas 定价

还出现了“ 多维 gas 定价”的兴起。

历史上,对 ETH 节点的任何计算或存储请求均打包为 1 个单位:“gas”。然而,通过 blobs,我们创建了一个新的单位来衡量计算“blob gas”。块中仅允许存在有限数量的 blobs,这类似于仅存在有限数量的数据可以放入一个块中。由于 blobs 的供给与交易的供给不同,因此需求也可能不同。由于 blobs 的需求可能与块空间的需求大相径庭,blobs 有它们自身的 gas 市场

你可以在上述 Python 代码中看到这一点,其中有一个交易字段叫做 maxFeePerBlobGas。blobs 的 gas 成本计算基于 blob 的需求。从本质上讲,这意味着在使用 blobs 估算 gas 成本时会进行两次计算:

  1. 基于块空间需求的正常 gas 成本
  2. 基于 blobs 需求的 blob gas 成本

这为 EVM 生态系统在未来计算不同操作的不同成本提供了更多市场开辟了先例。

总结和回顾

EIP-4844 是什么?

EIP-4844 是一个针对以太坊/EVM 区块链的改进提案,添加了对“blobs”的支持,使 rollups 验证交易时变得更便宜:

1. Blob 交易是一种新交易类型,允许我们在链上存储数据一段短时间。这个“短期数据”被称为“blob”或“二进制大对象”。

2. 我们无法访问实际的数据,但可以通过新的 BLOBHASH 操作码访问数据的哈希。

3. 使用 blob 交易,rollups 可以比之前更便宜地将交易结算到 L1。

Rollups 现在如何验证交易?

1. 你提交带有 blob 及某些证明数据的交易。

2. 你链上的合约通过 BLOBHASH 操作码访问 blob 的哈希。

3. 然后,它会将你的 blob 哈希与你的证明数据结合传递给新的点评估操作码,以帮助验证交易批次。

非常感谢那些帮助我们(一位用户的链接)理解 blobs 工作的更多细节的人。

  • 原文链接: cyfrin.io/blog/what-is-e...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.