ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EIP-7523 空账户弃用(Empty Accounts Deprecation)深度解读:post-merge 网络中空账户的终结

EIP-7523 空账户弃用(Empty Accounts Deprecation)深度解读:post-merge 网络中空账户的终结 EIP-7523 空账户弃用Empty Accounts Deprecation深度解读post-merge 网络中空账户的终结【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读本文基于 Ethereum Improvement Proposal 仓库中的 EIP-7523 展开系统梳理空账户empty account这一历史遗留概念从起源EIP-158、EIP-161到被正式弃用的完整脉络。你将理解空账户的精确定义、EIP-161 中复杂的 touch触碰规则为何成为长期技术债以及 EIP-7523 如何以 Merge合并为分界线通过一条简洁的规范消除这些负担。读完本文你将掌握EIP-7523 的规范文本细节、客户端实现可依赖的免扫描假设、它与姊妹提案 EIP-4747 及后续提案EIP-5920、EIP-7675的引用关系以及这条 EIP 对执行层测试套件和客户端实现者的实际影响。空账户Ethereum 早期历史的技术遗留什么是空账户在进入 EIP-7523 的规范之前必须先明确空账户empty account的精确含义。根据 EIP-161 中的定义一个账户被认为是empty空当且仅当它同时满足三个条件没有代码no codenonce 为零zero nonce余额为零zero balanceEIP-7523 在 Specification 一节中明确指出它沿用的正是 EIP-161 的这个定义未做任何改动。值得注意的是EIP-161 还定义了与之相关的另外两个概念touched被触碰账户参与了任何可能改变状态的操作potentially state-changing operation包括但不限于作为**零值转账transfer of zero value**的接收方dead已死账户要么不存在non-existent要么是空账户empty。这三个概念empty / touched / dead共同构成了 Spurious Dragon 硬分叉EIP-607之后账户状态清理state clearing机制的基石。历史起源EIP-158 与 EIP-161空账户之所以存在是 Ethereum 早期协议缺陷的副产品。2016 年 10 月EIP-158State clearing 与 EIP-161State trie clearing 几乎同时被提出目标都是清除早期协议在低开销下积累的大量空账户从而缩减状态大小、降低全节点的磁盘负载并加快 fast sync。EIP-158 的核心规范是任何导致账户状态被保存为 nonce 0、balance 0、code empty、storage empty即空账户的状态变更一律改为删除该账户若某地址被 touch 且该地址包含空账户则删除它EVM 检查账户是否存在时空等同于不存在零值调用与零值自杀SUICIDE不再收取 25,000 gas 的账户创建费。而 EIP-161 在 EIP-158 基础上做了不变量保持invariant-preserving的修正其四条关键规则为a.账户创建交易与CREATE操作在执行初始化代码之前必须将 nonce 在正常起始值之上再加 1普通网络为 1b.CALL与SUICIDE的 25,000 gas 费用仅在操作转账大于零的价值且目标账户为dead时才收取c.任何账户不得从不存在变为存在但为空——若某操作会导致这种结果账户应保持不存在d.在交易结束时任何被该交易touched且现在为empty的账户应被删除变为不存在。其中 at the end of the transaction 指的是自杀列表suicide list执行完毕后、为回执填充计算状态树根state trie root之前的时刻——这一细节界定了删除动作在交易生命周期中的精确时点。touch 规则的技术债务EIP-7523 的 Motivation 明确指出尽管空账户已经不再存在它们仍然遗留了沉重的技术债务。原因在于 EIP-161 施加了复杂的规则要求客户端在被 touched 时删除空账户。随着 Ethereum 规范持续演进touch 规则的边界情况edge case不断涌现每一个都必须被讨论、实现、测试和文档化。这包括空账户通过CALL接收零值转账空账户通过SUICIDE接收零值转账空账户通过消息调用交易接收零值转账空账户通过零 gas 价格的费用转移被触碰。EIP-161 原文列举的潜在状态变更操作多达 11 种包括CALL、CREATE、SUICIDE、矿工接收区块奖励等。如果未来某个客户端只想支持 post-merge 区块它仍然必须仅仅为了通过测试套件而实现这些不必要的空账户支持。EIP-7523 规范详解提案基本信息| 属性 | 值 | |-|-| | EIP 编号 | 7523 | | 标题 | Empty accounts deprecation空账户弃用 | | 描述 | 禁止 post-merge 网络上存在空账户 | | 作者 | Peter Daviespetertdavies | | 状态 | Last Calllast-call-deadline: 2024-03-26 | | 类型 | Standards Track / Core | | 创建时间 | 2023-09-19 | | 依赖 | EIP-161 |EIP-7523 属于Core 类别的标准跟踪提案即它直接修改共识层协议规范。它是执行层execution layer相关提案不涉及共识层beacon chain的修改。规范正文EIP-7523 的规范部分延续了 RFC 2119 / RFC 8174 的 MUST / MUST NOT / MAY 等关键字语义核心内容包括三点1. 空账户定义空账户 无代码 零 nonce 零余额与 EIP-161 定义完全一致。2. 对合并网络的硬性要求对于经历merge 过渡merge transition的网络merge 区块的前置状态pre state不得包含任何空账户对于在 genesis 时即已合并merged at genesis的网络genesis 账户中不得有任何空账户。3. 客户端免扫描假设规范明确说明客户端可以MAY不对状态执行扫描rather than performing a scan of the state直接假定以下链在 post-merge 阶段没有空账户Mainnet 链其 merge 区块哈希为0x56a9bb0302da44b8c0b3df540781424684c3af04d0b7a38d72842b762076a664任何同时满足以下两个条件的链genesis 中没有空账户在 genesis 时已处于 Spurious Dragon 分叉之后had a post Spurious Dragon fork at genesis。4. 未定义行为声明Ethereum 规范被声明为在 post-merge 语境下出现空账户时是**未定义undefined的。任何涉及 post-merge 空账户的测试用例都是无效invalid**的。这是整个 EIP 最具实际约束力的一条它不仅是规范约束更是对测试套件的清理令——执行层测试套件中所有涉及 post-merge 空账户的测试用例都应被移除只有与 Spurious Dragon 硬分叉相关的历史测试可以保留这与姊妹提案 EIP-4747 的 Test Cases 要求完全一致。为什么空账户已实际消失Mainnet 的清理事实EIP-7523 的 Motivation 提供了关键的历史事实依据历史上唯一可能包含空账户的网络只有Ethereum Mainnet、已废弃的测试网Ropsten、Ethereum Classic Mainnet及各类 Ethereum Classic 测试网Mainnet 上所有剩余的空账户在区块14049881中被清除对应的交易哈希为0xf955834bfa097458a9cf6b719705a443d32e7f43f20b9b0294098c205b4bcc3dEthereum Classic 上也发送了类似的清理交易其余众多的 EVM 兼容网络都太年轻从未产生过空账户因此在生产环境中遇到空账户的现实可能性不存在。姊妹提案 EIP-4747 对此补充了更细节的证据在 Byzantium 分叉区块 4370000之后Mainnet 上实际发生的 state clearing 事件只有两起区块4457731交易0x63791f962e13e6b01ec13d38a8ab66c87c2f5a1768276f866300d900cca808fe地址0xd29DFe5aE95B5C067a91F472Dac0d9be6700A4A9因接收零值SELFDESTRUCT而被清除区块14049881交易0xf955834bfa097458a9cf6b719705a443d32e7f43f20b9b0294098c205b4bcc3d一批地址因接收零值调用而被清除该 EIP 附录中完整列出了 200 余个被清除地址。这也解释了为何 EIP-7523 断言Mainnet 在 merge 前所有空账户已被清除是可验证的清理发生在明确可查的区块与交易中。以 Merge 为分界线为何选择这个 cutoffEIP-7523 的 Rationale 指出本提案被设计为消除空账户长期技术债的最简方式而Merge 被选为一个自然且易于识别的分界线cutoff point。被否决的替代方案包括使用更早的分界线例如区块14049881即 Mainnet 空账户实际被清空的区块识别更广泛的从未发生过的边界行为即枚举所有不可能发生的 edge case。这两种方案被否决的理由是不必要的复杂。相比之下以 Merge 为界有以下优势Merge 是全网统一的、区块哈希可精确标识的事件EIP-3675 通过TERMINAL_TOTAL_DIFFICULTY 58750000000000000000000及终端区块触发共识升级post-merge 网络既包括 Mainnet 本身也包括大量在 genesis 即合并的新网络覆盖面完整规范可以用前置状态无空账户 genesis 无空账户两个条件简洁表达无需枚举历史区块。对客户端实现者的实际影响免扫描假设的意义规范中 clients MAY assume 的表述意味着客户端不需要遍历整棵状态树来验证没有空账户这一不变量。这是一条重要的实现自由度——扫描整个状态在 gas、I/O 和时间上代价高昂而规范允许实现者基于以下两个事实直接信任状态已知的 Mainnet merge 区块哈希0x56a9bb...a664链自身的 genesis 配置genesis 无空账户且 Spurious Dragon 之后分叉。对测试套件的清理EIP-7523 声明任何涉及 post-merge 空账户的测试用例无效这意味着执行层测试套件如 execution-spec-tests需要删除所有 post-merge 语境下构造空账户的测试仅保留 Spurious Dragon 分叉相关的历史测试用于验证历史区块处理客户端实现者可以放心地不在新代码路径中实现空账户支持逻辑。这与 EIP-4747 的要求形成互补EIP-4747 主张除 Spurious Dragon 外的空账户测试全部移除并允许不实现 state clearing 的客户端只处理历史区块。未来网络merged at genesis对于在 genesis 即合并的网络EIP-7523 要求 genesis 状态本身不含空账户。这在实践中意味着创世区块的分配allocation中不应包含 balance0, nonce0, code0x 的账户条目若创世状态包含此类账户则该网络不属于规范所允许的假设范围规范对其行为未定义。仓库中的引用关系EIP-7523 的后续影响在 Ethereum Improvement Proposal 仓库中EIP-7523 已被多个后续提案引用为前置依赖或设计约束印证了它在协议演进中的实际地位EIP-5920PAY 操作码EIP-5920 提议引入PAY操作码其requires字段明确列出7523。该 EIP 的规范中写道PAYcannot be implemented on networks with empty accounts (see EIP-7523)。这是因为PAY的设计无回退数据、纯价值转移在空账户存在时会产生未定义的语义正是 EIP-7523 消除了空账户存在的可能性才使得PAY可以安全定义。EIP-7675Retroactively Included EIPsEIP-7675 是一个 Meta 类型提案列出因向后兼容性质而独立于硬分叉追溯激活的 Core EIP。EIP-7523 被列入其中其requires列表为2681、3607、4803、7523、7610。该 EIP 说明All EIPs listed above are considered activated as of Ethereums genesis block. Note that EIP-7523 distinguishes pre- and post-merge behavior on the Ethereum mainnet.这从机制上确认了 EIP-7523 的定位它不需要网络升级即可生效因为post-merge 网络无空账户这一约束在历史上从未被违反新旧节点对当前网络状态与历史始终达成一致。EIP-7819SETDELEGATE 操作码EIP-7819 在论证其SETDELEGATE操作码时引用了 EIP-7523它指出 Step 9 确保使用SETDELEGATE创建的账户永远不会回到空状态正如 EIP-7523 所禁止的——即使余额为零且未设置任何状态nonce 至少为 1 也保证了账户不会被判定为空。这说明新提案在设计时已将不得产生空账户作为隐含约束。姊妹提案 EIP-4747Simplify EIP-161与 EIP-7523 同作者Peter Davies的 EIP-4747 采取了一种互补但不同的路径它提议追溯性地简化 EIP-161将 11 种触发 state clearing 的潜在状态变更操作缩减为 3 种实际发生的场景并移除 STATICCALL 与状态清理的未定义交互。EIP-4747 与 EIP-7523 共享同一事实基础Mainnet 在区块 14049881 完成空账户清除但前者针对历史规则简化后者针对 post-merge 未来约束。向后兼容性与安全考量向后兼容EIP-7523 明确指出本 EIP 不改变任何测试套件之外可能发生的行为因此没有向后兼容性问题。这是因为post-merge 网络上空账户在现实中已不存在规范只是将已经成立的事实固化为显式约束唯一受影响的行为是测试套件中人为构造的空账户场景而这些场景被宣布为无效。安全考量EIP-7523 的 Security Considerations 提出了两点值得注意的风险事实依赖本 EIP 的有效性依赖于Ethereum Mainnet 上所有空账户在 merge 前均已被清除这一断言这一断言应接受适当的验证verification。验证依据正是区块14049881与交易0xf955834b...等可查证的链上事实。人为构造的风险任何人为创建artificially created包含空账户的网络都将导致工具链tooling和客户端出现问题——因为规范已声明 post-merge 空账户行为未定义客户端可能不做任何处理。此外结合 EIP-4747 的安全分析EIP-161 与简化版本在 Mainnet 上等价的前提是三个事实同一交易中空账户不会被 touch 后又被恢复附录列出的交易是 Byzantium 后仅有的 state clearing 交易Mainnet 上所有空账户已被移除。EIP-7523 的merge 前置状态无空账户要求正是对第三个事实的 post-merge 化表述。总结EIP-7523 是一份小而关键的共识层规范提案它以 Merge 为分界线将空账户这一贯穿 Ethereum 早期历史的遗留概念正式弃用技术上它把post-merge 网络含 genesis 即合并的网络不得包含空账户固化为 MUST 级约束并将违反场景声明为未定义行为实现上它允许客户端免扫描直接信任已知 merge 区块哈希与 genesis 配置并清理执行层测试套件中的空账户用例生态上它被 EIP-5920、EIP-7675、EIP-7819 等后续提案引用为设计前提并与姊妹提案 EIP-4747 共同完成了对 EIP-161 技术债的历史简化 未来禁止双轨治理。对于执行层客户端开发者、测试套件维护者以及设计新 EVM 功能的提案作者而言EIP-7523 意味着从今往后post-merge 语境下可以安全地假定空账户不存在无需再为touch 规则的边界情况付出实现与测试成本。该提案全文位于 EIPS/eip-7523.md其引用的完整上下文包括 EIP-161、EIP-158、EIP-3675 与 EIP-4747本文涉及的开源协议内容均依据 LICENSE.md 的 CC0 条款放弃版权。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表