该文档提议在Glamsterdam硬分叉中引入区块级访问列表(BALs),旨在通过显式映射每个交易到其访问或修改的状态(存储键、余额、nonce),使客户端能够并行执行交易,从而加速区块处理、提高吞吐量,并为节点运营者、应用、用户和基础设施提供商带来性能优势。
作者:Toni, Francesco, Jochem 和 Ignacio.
在本文档中,我们建议将 区块级访问列表 (BALs) 纳入 Glamsterdam 硬分叉。
EIP-7928 引入了区块级访问列表 (BALs),这是一种启用事务并行执行的机制。通过强制执行每个事务到它接触或修改的状态(存储键、余额、nonce)的显式映射,客户端可以并行化磁盘 I/O 和 EVM 执行(包括状态根计算)。这加速了区块处理并提高了吞吐量。主要的受益者是节点运营商(由于减少了验证延迟)和所有从扩展 Ethereum L1 中获利的人(应用程序、用户和基础设施提供商)。
由于未知的访问模式,客户端按顺序执行事务,限制了并行性并增加了区块处理延迟。虽然存在乐观的并行执行,但它依赖于推测性假设并产生开销,尤其是在具有许多依赖关系的 最坏情况 区块中效率低下。
BALs 通过使事务访问和状态更改显式化来解决这个问题。有了这些信息,客户端可以确定性地并行化 EVM 执行和磁盘 I/O,而无需进行推测。这减少了 最坏情况 的区块处理时间,并实现了更可预测的性能。
除了并行化之外,显式的状态差异还支持无执行验证(例如,对于 zk 客户端)、预执行分析(例如,包含列表、预热)以及改进的数据索引和同步方法。这些好处证明了 BALs 引入的适度大小开销是合理的。
并行化:减少最大区块处理时间。
通过在区块中包含存储位置和事务级状态差异,可以并行化事务。大多数客户端已经支持乐观并行化(全区块预加载),这对于平均区块效果很好,但对于具有长依赖链的区块来说效果不佳。BALs 实现了 完全并行 验证,解开了依赖关系,并允许以任意顺序处理事务——彼此独立。
没有执行的状态转换:BALs 是完整状态差异。这允许客户端从前一个状态和 BAL 中推导出后一个状态 (apply_bal(pre_state, bal) -> post_state
)。这有几个含义:
协助像 FOCIL(包含列表)这样的提案,这些提案需要执行后的有效性检查。通过将 BAL 应用于前一个状态,通常只能在事务执行后完成的检查可以在事务执行前执行。
更简单的 RPC 方法替代方案:
社区已经表达了明确的愿望:Ethereum L1 必须扩展以满足用户和开发人员的需求。BALs 释放了对于更高吞吐量和/或更短插槽时间至关重要的性能提升。它们还为基于 zkEVM 的轻节点(无执行 + 无状态)、全节点(无执行 + 有状态)和部分无状态执行铺平了道路。
在 Fusaka 中,EIP-7825 通过限制单个事务的 gas 上限迈出了第一步,从而强制执行了基本级别的并行执行。
乐观并行执行已经在大多数客户端中实现。它在许多事务独立的平均区块中表现良好(参见 dependency.pics),但它无法并行化每个事务都依赖于前一个事务写入的 最坏情况 区块。BALs 不仅在平均情况下提高了性能,尤其是在 最坏情况 下提高了性能,这对于可预测和可扩展的执行至关重要。
积极方面:
负面或权衡:
该规范包含在 EIP-7928 中,并且 SSZ 数据结构已明确定义。与多个执行客户端团队的实施讨论正在进行中,并且初步原型正在制作中。有使用 ethereum/execution-specs 实现的初始规范。共识层不需要更改。
通过以 2026 年的硬分叉为目标,研究人员和客户端团队有充足的时间进行进一步的分析、实施、测试和模拟。
未决问题:
BAL 中到底应该包含什么?
→ 此处讨论了设计空间 here。
从正在进行的讨论中得出的两个关键见解:
从 BAL 中删除存储位置会使其大小减半,但也会消除在区块处理开始时执行批量 I/O 的能力。所以关键问题是:
我们应该在 BAL 中保留存储位置以提高实用性,还是为了更小的尺寸而删除它们?
- 原文链接: ethereum-magicians.org/t...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!