什么是 EIP-4844?了解 proto-danksharding 和 blobs 是什么,它们如何工作,以及如何使用新的以太坊改进提案发送你的第一个 blob 交易
什么是 EIP-4844?
阅读原文 什么是 EIP-4844?Proto-Danksharding 和 Blob 交易的解释 ,在 cyfrin.io。
EIP-4844 (以太坊改进提案) 引入了一种新类型的交易到以太坊区块链,允许 区块链 Rollup 以更低的成本结算其交易。这些新交易接受称为“blobs”的大块数据,这些数据在短时间后会被删除。
在本文中,我们将探讨:
什么是 EIP-4844?
什么是 blob 交易?
为什么引入它们?
在我们深入了解 EIP-4844 之前,我们首先需要理解有不同种类的交易。
在“正常”交易中,所有交易数据都永久存储在链上。今天最常见的交易类型是类型 2 交易,但还有其他类型:
类型 0 交易:即“传统”交易
类型 1 交易:即“访问列表”交易(由 EIP-2930 引入)
类型 2 交易:新的“正常”交易(由 EIP-1559 引入)
类型 3 交易:即“blob”交易(由 EIP-4844 引入)
我们将在本文中讨论由新 EIP-4844 引入的 类型 3 交易,即 Blobs。
Blob 交易,由 EIP-4844 引入,即“Proto-danksharding”,为以太坊添加了一种新的数据结构 在大约 20-90 天后从链上删除。
我们最终删除的这大块数据被称为 blob, 是一个(某种)缩写,意思是;“Binary Large OBject。”
Blob 交易图示
Blob 交易已包含在 以太坊 Dencun 升级中,日期为 2024 年 3 月 13 日, 区块链 Rollup 对此非常喜爱。这些来自 EIP-4844,即“Proto-danksharding”(以创建它的研究人员命名,而不是因为这个名字听起来很酷)。
很多人使用“边车”类比。blob 就像摩托车的边车。摩托车是交易,边车是 blob。
进一步类比,我们点燃边车并在一个月后将其丢弃。
将数据放入 blob 使得 Rollup 以更低的成本 将交易结算到 L1。但在我们理解为什么/如何运作之前,我们首先需要理解交易为何以及如何消耗 gas。即使你认为自己已经知道,也请阅读下一段。
在我们理解为什么在新的 EIP-4844 中添加 blobs 之前,让我们先了解为什么我们 发送交易时会被收取费用。
每当我们在链上做任何事情时,每个区块链节点都必须计算 或 存储一些数据。我们 支付 gas 是因为在发送交易时,我们要求成千上万的计算机做大量工作,这会花费他们的钱。
计算:消耗电力
存储:有硬件成本
发送消息:网络流量也有相关成本
因此,如果我们想在链上存储 20 GB 的《怪物史瑞克》,我们需要 帮助支付成千上万的节点 购买所需的硬件,以便有空间存储《怪物史瑞克》。
因此,每当我们要求节点“做任何事情”时,我们必须 支付 gas。如果我们告诉他们,“你需要永远存储 20 GB 的《怪物史瑞克》” (这在以前是以太坊的工作方式,所有数据基本上都是永久存储),那么我们应该支付的费用要比我们要求他们仅存储几个月的《怪物史瑞克》多得多。
永久存储数据比临时存储数据更昂贵
请记住这一点;我们稍后会回到这个问题。
那么,为什么我们给交易这个可选的框来丢弃数据?
这回到了今天以太坊面临的最大问题:
在以太坊上发送 1 美元的费用是 2 美元,即扩展性问题。区块链面临着 区块链三难困境,在于难以同时解决以下三者:
去中心化
安全性
可扩展性
以太坊旨在 最大程度去中心化 和 安全,因此在扩展性上面临困难。
作为一个社区,我们决定 基于乐观和零知识证明的区块链 Rollup 是我们在以太坊近期和长期未来扩展 ETH 的方式。Rollup 通过在其 roll-up 链 上执行交易,打包它们,然后 “结算” 回 L1(以太坊)来帮助我们扩展 ETH。这使得 交易更便宜,同时保持许多 以太坊的安全 属性。
随着许多 Layer-2 区块链 处理交易,如 zkSync、Arbitrum 和 Optimism,你可以以更低的成本获得更多交易,因为你正在压缩它们。
像 zkSync、Arbitrum 和 Optimism 这样的 Layer 2
当这些 L2 将这些批次提交回以太坊时,以太坊必须做一些工作来验证交易批次的有效性,这就是问题所在。
以太坊只需要验证批次是否有效一次,然后就不再需要这些数据。但是在 EIP-4844 之前,以太坊没有(好的)方法来删除数据,因此它永久存储这些数据。
你看到了问题吗?
我们只需要这大批数据的一个瞬间
没有人再关心这些数据
但地球上每个 ETH 节点都必须从那时起存储它
就像每次你在学校通过考试时,你都必须把那次考试带在身边。经过 20 年,你基本上就像在走路时带着一大堆文件,从你的博士论文到你学习“猫”这个词时的拼写测试。
回到我们之前的《怪物史瑞克》例子,我们可以看到这一切是如何联系在一起的。
Rollup 在提交这大块数据时消耗了大量 gas,而他们只需要这数据的一个瞬间。而 Rollup 是 使以太坊扩展的关键,所以我们应该将他们视为优先公民。我们能做些什么来让他们的生活更轻松?
“如果我们在验证交易后就删除数据呢?”
- Rollups
于是,blobs 应运而生。
那么,blobs 在实践中是如何使用的?
现在的过程是:
roll-up(如 zkSync)压缩它们的交易列表
将压缩后的列表作为 blob 提交到 Ethereum L1,并附带证明
L1 验证交易批次
blob 最终从 L1 中删除
我们将变得更加技术化,所以请做好准备。
这是一个 Etherscan 上的 blob 交易示例。这是 zkSync 提交一批带有 blobs 的交易到 Ethereum 的交易示例。那么,这些 blobs 是如何被使用的呢?
在 Etherscan 上的示例 Blob 交易
如果我们点击那个蓝色的“2 blobs”部分,我们可以看到 blob 本身,以及使用 blob 而不是 calldata 后,这笔交易便宜了多少的快照!
Etherscan 上的 Blobs
现在,如果 EVM 可以直接访问 blob 数据,节点将不得不永久存储这些数据。EVM/Ethereum 节点需要保留它们所做的所有计算的历史,因此如果它们直接在 blobs 上进行计算,我们就必须存储该计算,因此存储整个 blob。但我们不想这样做,因为我们不想永久存储 blob。我们将回到原点!因此,EVM 不能访问 blob 数据。
EIP-4844 的创建者足够聪明,添加了一个新的操作码和预编译来帮助:
BLOBHASH
操作码:这个 获取交易中任何 blob 的哈希。
point evaluation
预编译:这做了一些数学魔法。有关更多信息,请参见 evm.codes。
有了这两个新工具,我们可以使用“密码学数学魔法”来验证 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 的工作原理。
我们创建了一个 最小仓库 来展示如何使用新的 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,也称为“Proto-danksharding”,是以太坊未来路线图“Danksharding”的一个中间步骤,具有更多酷炫的功能。这些将帮助 Ethereum 以更公平、可追溯的方式进行扩展。然而,完整的 Danksharding 需要更多的开发和研究,但 Rollups 今天已经带来了实际价值。因此,EVM 生态系统决定在其余的 Danksharding 方案确定之前,值得推出这一功能。
以太坊文档很好地解释了 Danksharding 的未来;你可以在 以太坊网站 上阅读更多内容。
另一个出现的概念是“多维 gas 定价”的兴起。
历史上,任何对 ETH 节点的计算或存储请求都被打包成 1 个单位:“gas”。然而,随着 blobs 的出现,我们创建了一种新的单位来衡量计算“blob gas”。每个区块中允许的 blobs 数量是有限的,类似于每个区块中可以容纳的数据量。由于 blobs 的供应与交易的供应不同,需求也可能不同。由于 blobs 的需求可能与区块空间的需求大相径庭,blobs 拥有自己的 gas 市场。
你可以在上面的 Python 代码中看到这一点,并且有一个名为 maxFeePerBlobGas 的交易字段。Blobs 的 gas 成本计算基于 blob 的需求。实际上,这意味着在估算 blobs 的 gas 成本时会进行 两个 计算:
基于区块空间需求的正常 gas 成本
基于 blobs 需求的 blob gas 成本
这为 EVM 生态系统设定了一个先例,未来可能会有更多市场用于计算在 EVM 生态系统中进行不同操作的不同成本。
EIP-4844 是对以太坊/EVM 区块链的改进提案,增加了对“blobs”的支持,使得 Rollups 验证交易的成本更低:
Blob 交易是一种新交易类型,允许我们在链上短时间存储数据。“短期数据”被称为“blob”或“二进制大对象”。
我们无法直接访问数据本身,但可以通过新的 BLOBHASH 操作码访问数据的哈希值。
使用 blob 交易,Rollups 可以以比以前更低的成本将交易结算到 L1。
你提交一个带有 blob 的交易,以及一些证明数据。
你的链上合约通过 BLOBHASH 操作码访问 blob 的哈希值。
然后,它将你的 blob 哈希与证明数据结合传递给新的点评估操作码,以帮助验证交易批次。
非常感谢 帮助我们 理解 blobs 工作原理 的用户。
要学习智能合约安全和开发,请访问 Cyfrin Updraft 要请求智能合约项目的安全支持/安全审查,请访问 Cyfrin.io 或 CodeHawks.com。 要了解更多关于智能合约中报告的主要攻击,请务必研究 Solodit.
译者注:Cyfrin Updraft 有很多不错的英文课程,登链社区有很多中文的课程,尤其是想线下学习,可以来集训营
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!