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

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

什么是 proto-danksharding?

什么是 EIP-4844?

介绍

阅读原文 什么是 EIP-4844?Proto-Danksharding 和 Blob 交易的解释 ,在 cyfrin.io。

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

在本文中,我们将探讨:

  1. 什么是 EIP-4844?

  2. 什么是 blob 交易?

  3. 为什么引入它们?

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

区块链交易类型

在“正常”交易中,所有交易数据都永久存储在链上。今天最常见的交易类型是类型 2 交易,但还有其他类型:

  • 类型 0 交易:即“传统”交易

  • 类型 1 交易:即“访问列表”交易(由 EIP-2930 引入)

  • 类型 2 交易:新的“正常”交易(由 EIP-1559 引入)

  • 类型 3 交易:即“blob”交易(由 EIP-4844 引入)

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

什么是 Blob 交易?

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

我们最终删除的这大块数据被称为 blob, 是一个(某种)缩写,意思是;“Binary Large OBject。”

什么是 EIP-4844:Blob 交易

Blob 交易图示

Blob 交易已包含在 以太坊 Dencun 升级中,日期为 2024 年 3 月 13 日, 区块链 Rollup 对此非常喜爱。这些来自 EIP-4844,即“Proto-danksharding”(以创建它的研究人员命名,而不是因为这个名字听起来很酷)。

很多人使用“边车”类比。blob 就像摩托车的边车。摩托车是交易,边车是 blob。

进一步类比,我们点燃边车并在一个月后将其丢弃。

将数据放入 blob 使得 Rollup 以更低的成本 将交易结算到 L1。但在我们理解为什么/如何运作之前,我们首先需要理解交易为何以及如何消耗 gas。即使你认为自己已经知道,也请阅读下一段。‍

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

在我们理解为什么在新的 EIP-4844 中添加 blobs 之前,让我们先了解为什么我们 发送交易时会被收取费用

每当我们在链上做任何事情时,每个区块链节点都必须计算存储一些数据。我们 支付 gas 是因为在发送交易时,我们要求成千上万的计算机做大量工作,这会花费他们的钱。

  • 计算:消耗电力

  • 存储:有硬件成本

  • 发送消息:网络流量也有相关成本

因此,如果我们想在链上存储 20 GB 的《怪物史瑞克》,我们需要 帮助支付成千上万的节点 购买所需的硬件,以便有空间存储《怪物史瑞克》。

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

什么是 EIP-4844?为什么存在 blobs?

永久存储数据比临时存储数据更昂贵

请记住这一点;我们稍后会回到这个问题。

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

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

这回到了今天以太坊面临的最大问题:

在以太坊上发送 1 美元的费用是 2 美元,即扩展性问题。区块链面临着 区块链三难困境,在于难以同时解决以下三者:

  • 去中心化

  • 安全性

  • 可扩展性

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

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

随着许多 Layer-2 区块链 处理交易,如 zkSyncArbitrumOptimism,你可以以更低的成本获得更多交易,因为你正在压缩它们。

什么是 EIP-4844:Rollups

像 zkSync、Arbitrum 和 Optimism 这样的 Layer 2

当这些 L2 将这些批次提交回以太坊时,以太坊必须做一些工作来验证交易批次的有效性,这就是问题所在。

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

你看到了问题吗?

  • 我们只需要这大批数据的一个瞬间

  • 没有人再关心这些数据

  • 但地球上每个 ETH 节点都必须从那时起存储它

就像每次你在学校通过考试时,你都必须把那次考试带在身边。经过 20 年,你基本上就像在走路时带着一大堆文件,从你的博士论文到你学习“猫”这个词时的拼写测试。

回到我们之前的《怪物史瑞克》例子,我们可以看到这一切是如何联系在一起的。

Rollup 在提交这大块数据时消耗了大量 gas,而他们只需要这数据的一个瞬间。而 Rollup 是 使以太坊扩展的关键,所以我们应该将他们视为优先公民。我们能做些什么来让他们的生活更轻松?

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

  • Rollups

于是,blobs 应运而生。

如何使用 blobs 验证 rollup 交易?

那么,blobs 在实践中是如何使用的?

现在的过程是:

  1. roll-up(如 zkSync)压缩它们的交易列表

  2. 将压缩后的列表作为 blob 提交到 Ethereum L1,并附带证明

  3. L1 验证交易批次

  4. blob 最终从 L1 中删除

我们将变得更加技术化,所以请做好准备。

这是一个 Etherscan 上的 blob 交易示例。这是 zkSync 提交一批带有 blobs 的交易到 Ethereum 的交易示例。那么,这些 blobs 是如何被使用的呢?

Etherscan 上的示例 Blob 交易

如果我们点击那个蓝色的“2 blobs”部分,我们可以看到 blob 本身,以及使用 blob 而不是 calldata 后,这笔交易便宜了多少的快照!

什么是 EIP-4844?示例

Etherscan 上的 Blobs

现在,如果 EVM 可以直接访问 blob 数据,节点将不得不永久存储这些数据。EVM/Ethereum 节点需要保留它们所做的所有计算的历史,因此如果它们直接在 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 是否包含正确的数据。对于预编译,我们需要:
    /// versioned hash || opening point || opening value || commitment || proof
    /// _pubdataCommitments 将包含最后 4 个值,versioned hash 是从 BLOBHASH 操作码中提取的
    /// pubdataCommitments 是一个列表:opening point (16 字节) || claimed value (32 字节) || commitment (48 字节) || proof (48 字节)) = 144 字节
    function _verifyBlobInformation(
        bytes calldata _pubdataCommitments,
        bytes32[] memory _blobHashes
    ) internal view returns (bytes32[] memory blobCommitments) {‍

这将执行实际的 blob 验证。

BLOBHASH 操作码将为我们抓取一个 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 交易负载,类似于以下内容:

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 交易负载

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

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

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

# 这将生成我们的 blob 交易的 blobs、commitments 和 proofs
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("Text:", 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
    # 这将生成我们的 blob 交易的 blobs、commitments 和 proofs
    signed = acct.sign_transaction(tx, blobs=[BLOB_DATA])

参考 GitHub 仓库 获取更多信息。‍

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

EIP-4844,也称为“Proto-danksharding”,是以太坊未来路线图“Danksharding”的一个中间步骤,具有更多酷炫的功能。这些将帮助 Ethereum 以更公平、可追溯的方式进行扩展。然而,完整的 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 生态系统设定了一个先例,未来可能会有更多市场用于计算在 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 Updraft 要请求智能合约项目的安全支持/安全审查,请访问 Cyfrin.ioCodeHawks.com。 要了解更多关于智能合约中报告的主要攻击,请务必研究 Solodit.

译者注:Cyfrin Updraft 有很多不错的英文课程,登链社区有很多中文的课程,尤其是想线下学习,可以来集训营

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 2
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Patrick Collins
Patrick Collins
智能合约工程和安全爱好者