{"content":{"title":"EIP-4844 是什么？解析 Proto-Danksharding 和 blob 交易","body":">- 原文链接：https://medium.com/cyfrin/what-is-eip-4844-proto-dankshading-and-blob-transactions-explained-984dec50dcc8\r\n>- 译者：[AI翻译官](https://learnblockchain.cn/people/19584)，校对：[翻译小组](https://learnblockchain.cn/people/412)\r\n>- 本文永久链接：[learnblockchain.cn/article…](https://learnblockchain.cn/article/9302)\r\n    \r\n\r\n\r\n\r\n\r\n![什么是 proto-danksharding？](https://img.learnblockchain.cn/attachments/migrate/1726131856581)\r\n\r\n*什么是 EIP-4844？*\r\n\r\n\r\n## 介绍\r\n\r\n> *阅读原文 * [什么是 EIP-4844？Proto-Danksharding 和 Blob 交易的解释](https://www.cyfrin.io/blog/what-is-eip-4844-proto-danksharding-and-blob-transactions) *，在 cyfrin.io。*\r\n\r\nEIP-4844 (**以太坊改进提案**) 引入了一种新类型的交易到以太坊区块链，允许 [区块链 Rollup](https://www.cyfrin.io/blog/what-are-blockchain-rollups-a-full-guide-to-zk-and-optimistic-rollups) 以更低的成本结算其交易。这些新交易接受称为“blobs”的大块数据，这些数据在短时间后会被删除。\r\n\r\n在本文中，我们将探讨：\r\n\r\n1. 什么是 EIP-4844？\r\n\r\n2. 什么是 blob 交易？\r\n\r\n3. 为什么引入它们？\r\n\r\n在我们深入了解 EIP-4844 之前，我们首先需要理解有不同种类的交易。\r\n\r\n## 区块链交易类型\r\n\r\n在“正常”交易中，所有交易数据都永久存储在链上。今天最常见的交易类型是类型 2 交易，但还有其他类型：\r\n\r\n- **类型 0 交易**：即“传统”交易\r\n\r\n- **类型 1 交易**：即“访问列表”交易（由 EIP-2930 引入）\r\n\r\n- **类型 2 交易**：新的“正常”交易（由 EIP-1559 引入）\r\n\r\n- **类型 3 交易**：即“blob”交易（由 EIP-4844 引入）\r\n\r\n我们将在本文中讨论由新 EIP-4844 引入的 [类型 3 交易](https://www.eip4844.com/)，即 Blobs。\r\n\r\n## 什么是 Blob 交易？\r\n\r\nBlob 交易，由 EIP-4844 引入，即“Proto-danksharding”，为以太坊添加了一种新的数据结构 *在大约 20-90 天后从链上删除。*\r\n\r\n我们最终删除的这大块数据被称为 **blob，** 是一个（某种）缩写，意思是；“**B**inary **L**arge **OB**ject。”\r\n\r\n![什么是 EIP-4844：Blob 交易](https://img.learnblockchain.cn/attachments/migrate/1726131856595)\r\n\r\n*Blob 交易图示*\r\n\r\n\r\nBlob 交易已包含在 [以太坊 Dencun](https://consensys.io/ethereum-dencun-upgrade) 升级中，日期为 2024 年 3 月 13 日， [区块链 Rollup](https://www.cyfrin.io/blog/what-are-blockchain-rollups-a-full-guide-to-zk-and-optimistic-rollups) 对此非常喜爱。这些来自 **EIP-4844**，即“Proto-danksharding”（以创建它的研究人员命名，而不是因为这个名字听起来很酷）。\r\n\r\n很多人使用“边车”类比。**blob** 就像摩托车的边车。摩托车是交易，边车是 blob。\r\n\r\n进一步类比，我们点燃边车并在一个月后将其丢弃。\r\n\r\n将数据放入 **blob 使得 Rollup 以更低的成本** 将交易结算到 L1。但在我们理解为什么/如何运作之前，我们首先需要理解交易为何以及如何消耗 gas。即使你认为自己已经知道，也请阅读下一段。‍\r\n\r\n## 为什么区块链交易会消耗 gas？\r\n\r\n在我们理解为什么在新的 EIP-4844 中添加 blobs 之前，让我们先了解为什么我们 **发送交易时会被收取费用**。\r\n\r\n每当我们在链上做任何事情时，**每个区块链节点都必须计算** 或 **存储一些数据**。我们 **支付 gas 是因为在发送交易时**，我们要求成千上万的计算机做大量工作，这会花费他们的钱。\r\n\r\n- **计算**：消耗电力\r\n\r\n- **存储**：有硬件成本\r\n\r\n- **发送消息**：网络流量也有相关成本\r\n\r\n因此，如果我们想在链上存储 20 GB 的《怪物史瑞克》，我们需要 **帮助支付成千上万的节点** 购买所需的硬件，以便有空间存储《怪物史瑞克》。\r\n\r\n因此，每当我们要求节点“做任何事情”时，我们必须 **支付 gas**。如果我们告诉他们，“你需要永远存储 20 GB 的《怪物史瑞克》” （这在以前是以太坊的工作方式，所有数据基本上都是永久存储），那么我们应该支付的费用要比我们要求他们仅存储几个月的《怪物史瑞克》多得多。\r\n\r\n![什么是 EIP-4844？为什么存在 blobs？](https://img.learnblockchain.cn/attachments/migrate/1726131856592)\r\n\r\n**永久存储数据比临时存储数据更昂贵**\r\n\r\n\r\n请记住这一点；我们稍后会回到这个问题。\r\n\r\n## 为什么我们决定添加 blob 交易？\r\n\r\n**那么，为什么我们给交易这个可选的框来丢弃数据？**\r\n\r\n这回到了今天以太坊面临的最大问题：\r\n\r\n在以太坊上发送 1 美元的费用是 2 美元，即扩展性问题。区块链面临着 [区块链三难困境](https://www.cyfrin.io/blog/blockchain-architecture-layers-what-is-it)，在于难以同时解决以下三者：\r\n\r\n- **去中心化**\r\n\r\n- **安全性**\r\n\r\n- **可扩展性**\r\n\r\n以太坊旨在 **最大程度去中心化** 和 **安全**，因此在扩展性上面临困难。\r\n\r\n作为一个社区，我们决定 [基于乐观和零知识证明的区块链 Rollup](https://www.cyfrin.io/blog/what-are-blockchain-rollups-a-full-guide-to-zk-and-optimistic-rollups) 是我们在以太坊近期和长期未来扩展 ETH 的方式。**Rollup** 通过在其 **roll-up 链** 上执行交易，打包它们，然后 **“结算”** 回 L1（以太坊）来帮助我们扩展 ETH。这使得 **交易更便宜**，同时保持许多 **以太坊的安全** 属性。\r\n\r\n随着许多 [Layer-2 区块链](https://www.cyfrin.io/blog/what-are-ethereum-layer-2-blockchains-and-how-do-they-work) 处理交易，如 **zkSync**、**Arbitrum** 和 **Optimism**，你可以以更低的成本获得更多交易，因为你正在压缩它们。\r\n\r\n![什么是 EIP-4844：Rollups](https://img.learnblockchain.cn/attachments/migrate/1726131856600)\r\n\r\n*像 zkSync、Arbitrum 和 Optimism 这样的 Layer 2*\r\n\r\n\r\n当这些 L2 将这些批次提交回以太坊时，以太坊必须做一些工作来验证交易批次的有效性，这就是问题所在。\r\n\r\n以太坊只需要验证批次是否有效一次，然后就不再需要这些数据。但是在 EIP-4844 之前，以太坊没有（好的）方法来删除数据，因此它永久存储这些数据。\r\n\r\n你看到了问题吗？\r\n\r\n- 我们只需要这大批数据的一个瞬间\r\n\r\n- 没有人再关心这些数据\r\n\r\n- 但地球上每个 ETH 节点都必须从那时起存储它\r\n\r\n就像每次你在学校通过考试时，你都必须把那次考试带在身边。经过 20 年，你基本上就像在走路时带着一大堆文件，从你的博士论文到你学习“猫”这个词时的拼写测试。\r\n\r\n回到我们之前的《怪物史瑞克》例子，我们可以看到这一切是如何联系在一起的。\r\n\r\nRollup 在提交这大块数据时消耗了大量 gas，而他们只需要这数据的一个瞬间。而 Rollup 是 **使以太坊扩展的关键**，所以我们应该将他们视为优先公民。我们能做些什么来让他们的生活更轻松？\r\n\r\n> “如果我们在验证交易后就删除数据呢？”\r\n\r\n> - Rollups\r\n\r\n于是，blobs 应运而生。\r\n\r\n## 如何使用 blobs 验证 rollup 交易？\r\n\r\n那么，blobs 在实践中是如何使用的？\r\n\r\n现在的过程是：\r\n\r\n1. roll-up（如 zkSync）压缩它们的交易列表\r\n\r\n2. 将压缩后的列表作为 **blob** 提交到 Ethereum L1，并附带证明\r\n\r\n3. L1 验证交易批次\r\n\r\n4. blob 最终从 L1 中删除\r\n\r\n我们将变得更加技术化，所以请做好准备。\r\n\r\n这是一个 [Etherscan 上的 blob 交易示例](https://etherscan.io/tx/0x291351476ef62e83ed33fb385f998232b8577bd1af60eb3463ce5a9e77fc8666)。这是 zkSync 提交一批带有 blobs 的交易到 Ethereum 的交易示例。那么，这些 blobs 是如何被使用的呢？\r\n\r\n![](https://img.learnblockchain.cn/attachments/migrate/1726131856606)\r\n\r\n*在 [Etherscan](https://etherscan.io/tx/0x291351476ef62e83ed33fb385f998232b8577bd1af60eb3463ce5a9e77fc8666) 上的示例 Blob 交易*\r\n\r\n\r\n如果我们点击那个蓝色的“2 blobs”部分，我们可以看到 blob 本身，以及使用 blob 而不是 calldata 后，这笔交易便宜了多少的快照！\r\n\r\n![什么是 EIP-4844？示例](https://img.learnblockchain.cn/attachments/migrate/1726131857801)\r\n\r\n*Etherscan 上的 Blobs*\r\n\r\n\r\n现在，如果 EVM 可以直接访问 blob 数据，节点将不得不永久存储这些数据。EVM/Ethereum 节点需要保留它们所做的所有计算的历史，因此如果它们直接在 blobs 上进行计算，我们就必须存储该计算，因此存储整个 blob。但我们不想这样做，因为我们不想永久存储 blob。我们将回到原点！因此，EVM 不能访问 blob 数据。\r\n\r\nEIP-4844 的创建者足够聪明，添加了一个新的操作码和预编译来帮助：\r\n\r\n- `BLOBHASH` 操作码：这个 [获取交易中任何 blob 的哈希](https://www.evm.codes/#49?fork=cancun)。\r\n\r\n- `point evaluation` 预编译：这做了一些数学魔法。有关更多信息，请参见 [evm.codes](https://www.evm.codes/precompiled#0x0a?fork=cancun)。\r\n\r\n有了这两个新工具，我们可以使用“密码学数学魔法”来验证 blob 是否有效，而无需实际将 blob 数据存储在链上或加载到 EVM 可以访问的环境中。\r\n\r\n当 zkSync 验证者/操作员希望将交易列表提交回 L1 时，它调用 commitBatches：\r\n\r\n```bash\r\nfunction commitBatches(\r\n        StoredBatchInfo calldata,\r\n        CommitBatchInfo[] calldata _newBatchesData\r\n```\r\n\r\n在 _newBatchesData 对象中，它传递一些证明，这些证明与 blob 哈希（通过 BLOBHASH 操作码检索）结合，允许智能合约验证交易批次的有效性。稍后，该函数最终将调用：\r\n\r\n```php\r\n/// @dev 通过调用点评估预编译来验证 blobs 是否包含正确的数据。对于预编译，我们需要：\r\n    /// versioned hash || opening point || opening value || commitment || proof\r\n    /// _pubdataCommitments 将包含最后 4 个值，versioned hash 是从 BLOBHASH 操作码中提取的\r\n    /// pubdataCommitments 是一个列表：opening point (16 字节) || claimed value (32 字节) || commitment (48 字节) || proof (48 字节)) = 144 字节\r\n    function _verifyBlobInformation(\r\n        bytes calldata _pubdataCommitments,\r\n        bytes32[] memory _blobHashes\r\n    ) internal view returns (bytes32[] memory blobCommitments) {‍\r\n```\r\n\r\n这将执行实际的 blob 验证。\r\n\r\n`BLOBHASH` 操作码将为我们抓取一个 *hash*，而不是整个 blob，我们可以将其与一些证明和其他“数学内容”结合，然后传递给新的 `point evaluation` 预编译（该函数最终也会这样做）。点评估进行一些“数学魔法”以验证 blob 哈希是否有效。你可以从 [evm.codes](https://www.evm.codes/precompiled#0x0a?fork=cancun) 阅读更多关于输入的信息。\r\n\r\n现在，我们不会立即删除 blobs。这是因为我们希望其他节点有一些时间来确保正在计算的 BLOBHASH 是正确的，因此以太坊社区允许 blobs 传播。这实际上只需要几个区块，但我们留出 20-90 天的窗口来删除 blobs。\r\n\r\n就这样！我们现在可以验证 L2 交易是否有效。这个巨大的 blob 代表了所有交易，但我们可以仅使用哈希和一些巧妙的数学来验证它们的有效性。\r\n\r\n这就是 blobs 的工作原理。‍\r\n\r\n## 如何发送你的 blob 交易\r\n\r\n我们创建了一个 [最小仓库](https://github.com/PatrickAlphaC/send_blob) 来展示**如何使用新的 Eip-4884 在 web3.py 中发送带有 blob 的交易**。设置看起来类似于** EIP-1559**（普通）交易的设置。你需要设置一个 [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) 交易负载，类似于以下内容：\r\n\r\n```makefile\r\ntx = {\r\n        \"type\": 3,\r\n        \"chainId\": 31337,  # Anvil\r\n        \"from\": acct.address,\r\n        \"to\": \"0x0000000000000000000000000000000000000000\",\r\n        \"value\": 0,\r\n        \"maxFeePerGas\": 10**12,\r\n        \"maxPriorityFeePerGas\": 10**12,\r\n        \"maxFeePerBlobGas\": to_hex(10**12),\r\n        \"nonce\": w3.eth.get_transaction_count(acct.address),\r\n    }\r\n# 这代表了 EIP-2718 交易负载\r\n```\r\n\r\n关键部分是添加 blob 本身。你不会将 blob 添加到 EIP-2718 交易负载中，而是将 blobs 与负载一起发送。根据 EIP，RLP（递归长度前缀：以太坊编码交易数据的方式）看起来像这样：\r\n\r\n```scss\r\nrlp([tx_payload_body, blobs, commitments, proofs])\r\n```\r\n\r\n另一方面，EIP-1559 交易 **仅** 在 rlp 中包含 tx_payload_body。因此，在 **Python** 中，我们可以通过以下方式表示：\r\n\r\n```ini\r\n# 这将生成我们的 blob 交易的 blobs、commitments 和 proofs\r\nsigned = acct.sign_transaction(tx, blobs=[BLOB_DATA])\r\n```\r\n\r\n以太和其他库也处理大多数证明生成和其他“blob”内容。发送 blob 交易的完整脚本可能如下所示：\r\n\r\n```python\r\nimport os\r\nfrom dotenv import load_dotenv\r\nfrom eth_abi import abi\r\nfrom eth_utils import to_hex\r\nfrom web3 import HTTPProvider, Web3\r\nload_dotenv()\r\n\r\ndef send_blob():\r\n    rpc_url = os.getenv(\"RPC_URL\")\r\n    private_key = os.getenv(\"ANVIL_PRIVATE_KEY\")\r\n    w3 = Web3(HTTPProvider(rpc_url))\r\n    text = \"<( o.O )>\"\r\n    encoded_text = abi.encode([\"string\"], [text])\r\n    print(\"Text:\", encoded_text)\r\n    # Blob 数据必须由 4096 个 32 字节字段元素组成\r\n    # 所以，blobs 必须相当大\r\n    BLOB_DATA = (b\"\\x00\" * 32 * (4096 - len(encoded_text) // 32)) + encoded_text\r\n    acct = w3.eth.account.from_key(private_key)\r\n    tx = {\r\n        \"type\": 3,\r\n        \"chainId\": 31337,  # Anvil\r\n        \"from\": acct.address,\r\n        \"to\": \"0x0000000000000000000000000000000000000000\",\r\n        \"value\": 0,\r\n        \"maxFeePerGas\": 10**12,\r\n        \"maxPriorityFeePerGas\": 10**12,\r\n        \"maxFeePerBlobGas\": to_hex(10**12),\r\n        \"nonce\": w3.eth.get_transaction_count(acct.address),\r\n    }\r\n    gas_estimate = w3.eth.estimate_gas(tx)\r\n    tx[\"gas\"] = gas_estimate\r\n    # 这将生成我们的 blob 交易的 blobs、commitments 和 proofs\r\n    signed = acct.sign_transaction(tx, blobs=[BLOB_DATA])\r\n```\r\n\r\n参考 [GitHub 仓库](https://github.com/PatrickAlphaC/send_blob) 获取更多信息。‍\r\n\r\n## EIP-4844 之后：Danksharding 和 Blobs 的未来\r\n\r\n**EIP-4844**，也称为“**Proto-danksharding**”，是以太坊未来路线图“Danksharding”的一个中间步骤，具有更多酷炫的功能。这些将帮助 **Ethereum** 以更公平、可追溯的方式进行扩展。然而，完整的 Danksharding 需要更多的开发和研究，但 Rollups 今天已经带来了实际价值。因此，EVM 生态系统决定在其余的 Danksharding 方案确定之前，值得推出这一功能。\r\n\r\n以太坊文档很好地解释了 Danksharding 的未来；你可以在 [以太坊网站](https://ethereum.org/en/roadmap/danksharding/) 上阅读更多内容。\r\n\r\n## 多维 gas 定价\r\n\r\n另一个出现的概念是“**多维 gas 定价**”的兴起。\r\n\r\n历史上，任何对 ETH 节点的计算或存储请求都被打包成 1 个单位：“gas”。然而，随着 blobs 的出现，我们创建了一种新的单位来衡量计算“blob gas”。每个区块中允许的 blobs 数量是有限的，类似于每个区块中可以容纳的数据量。由于 blobs 的供应与交易的供应不同，需求也可能不同。由于 blobs 的需求可能与区块空间的需求大相径庭，**blobs 拥有自己的 gas 市场。**\r\n\r\n**‍**你可以在上面的 Python 代码中看到这一点，并且有一个名为 maxFeePerBlobGas 的交易字段。Blobs 的 gas 成本计算基于 blob 的需求。实际上，这意味着在估算 blobs 的 gas 成本时会进行 **两个** 计算：\r\n\r\n1. **基于区块空间需求的正常 gas 成本**\r\n\r\n2. **基于 blobs 需求的 blob gas 成本**\r\n\r\n这为 EVM 生态系统设定了一个先例，未来可能会有更多市场用于计算在 EVM 生态系统中进行不同操作的不同成本。\r\n\r\n‍\r\n\r\n## 总结与回顾\r\n\r\n### 什么是 EIP-4844？\r\n\r\nEIP-4844 是对以太坊/EVM 区块链的改进提案，增加了对“blobs”的支持，使得 Rollups 验证交易的成本更低：\r\n\r\n1. Blob 交易是一种新交易类型，允许我们在链上短时间存储数据。“短期数据”被称为“blob”或“二进制大对象”。\r\n\r\n2. 我们无法直接访问数据本身，但可以通过新的 BLOBHASH 操作码访问数据的哈希值。\r\n\r\n3. 使用 blob 交易，Rollups 可以以比以前更低的成本将交易结算到 L1。\r\n\r\n### Rollups 现在如何验证交易？\r\n\r\n1. 你提交一个带有 blob 的交易，以及一些证明数据。\r\n\r\n2. 你的链上合约通过 BLOBHASH 操作码访问 blob 的哈希值。\r\n\r\n3. 然后，它将你的 blob 哈希与证明数据结合传递给新的点评估操作码，以帮助验证交易批次。‍\r\n\r\n‍*非常感谢 [帮助我们](https://ethereum.stackexchange.com/questions/163085/does-blobhash-opcode-stop-working-after-blob-data-is-pruned) 理解 [blobs 工作原理](https://ethereum.stackexchange.com/questions/163087/how-do-i-send-a-transaction-with-a-blob-in-solidity) 的用户。*\r\n\r\n***\r\n\r\n要学习智能合约安全和开发，请访问 [Cyfrin Updraft](https://updraft.cyfrin.io/)\r\n要请求智能合约项目的安全支持/安全审查，请访问 [Cyfrin.io](http://cyfrin.io/) 或 [CodeHawks.com](https://codehawks.com/)。\r\n要了解更多关于智能合约中报告的主要攻击，请务必研究 [Solodit](https://solodit.xyz/).\r\n\r\n> 译者注：Cyfrin Updraft 有很多不错的英文课程，登链社区有很多中文的课程，尤其是想线下学习，可以来[集训营](https://learnblockchain.cn/openspace/1) \r\n\r\n\r\n\r\n> 我是 [AI 翻译官](https://learnblockchain.cn/people/19584)，为大家转译优秀英文文章，如有翻译不通的地方，在[这里](https://github.com/lbc-team/Pioneer/blob/master/translations/9302.md)修改，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/22707","address":null},"history":"bafkreic4jtjfebuyty6utoufcxbhzqz27rypcapbc3kv4jmh3np67w3jva","timestamp":1726133933,"version":1}