

Hoodi 测试网的硬分叉将在解决 Gas(燃料费)问题之前暂缓进行。以太坊基金会列出了八项在 Glamsterdam 升级中不再成立的 Gas 假设。目前,空账户委托操作的 Gas 消耗从 25,000 增加至 235,606。此外,交易被打包进区块不再能证明委托已生效。
在11月6日的更新中,以太坊基金会开发者 Marius van der Wijden 表示,核心开发者不会在安全公司 ChainSecurity 发现的问题得到解决之前对 Hoodi 测试网进行硬分叉。他要求合约开发者和审计人员根据此次升级打破的八项“Gas 不变量”检查他们的项目。
在此语境下,“不变量”是指代码视为始终为真的规则,例如“固定的 Gas 预算足以完成此调用”或“已打包的委托已生效”。基金会的不变量存储库列出了八项在 Glamsterdam 升级中发生变化的规则,并表示迄今为止的大多数发现都涉及其中两项。
这两项提案推动了这一变化:
EIP-8037:提高了创建新状态(如新账户、存储槽和部署的代码)的成本,并将其与常规执行分开计量。 EIP-8038:提高了读取和更新现有状态的 cost。根据存储库中的规范测试,写入新的存储槽的费用从 22,100 Gas 上升至 110,020;更新现有的热存储槽从 2,900 上升至 10,100;代码部署费用从每字节 200 Gas 上升至 1,530。如果规范发生变化,这些数字也会随之调整。此前对 Glamsterdam 测试的暂停紧随 ChainSecurity 在10月13日的审查之后。该存储库通过基金会自身对 Sourcify(一个公共合约源代码注册表)上验证的合约扫描,以及诸如读取交易收据等链下案例,扩展了之前的发现结果。
EIP-7702 允许普通以太坊账户通过签署指向委托合约的授权来运行智能合约代码。该授权旨在仅使用一次。在 Glamsterdam 升级之前,其全部成本会在前端一次性收取,因此无法支付费用的交易是无效的,永远不会进入区块。如果交易被打包,则意味着委托已生效。
存储库中的 INV-8 条目解释了 EIP-8037 带来的改变。部分成本现在取决于账户的状态,并且仅在处理授权时收取。从空账户发起委托的成本从之前的 25,000 Gas 激增至 235,606 Gas。如果交易预算按旧标准设定,它会被接受,但在应用授权时因 Gas 耗尽而失败,并最终进入带有失败状态的区块。此时,委托操作会被回滚,标记授权已使用的账户非ce(nonce)计数器也会回滚。然而,签名授权现已公开且仍然有效。
单独来看,这只会导致钱包未配置,而非被盗。危险在于当委托合约允许任何人调用其设置函数时。攻击者可以在自己的交易中重新提交暴露的授权,先调用设置函数并将自己设为账户所有者。虽然在公共内存池中抢跑(Front-running)授权已经是可能的,但存储库指出,失败的 transaction 现在本身就会发布有效的授权,因此将其路由至私有通道不再提供保护。存储库用示例代码记录了这一模式,但未点名任何受影响的钱包。
实际受影响的是钱包、中继器和索引器。存储库建议在委托交易后检查账户代码和非ce,而不是依赖交易收据。任何失败的授权都应被视为已暴露并取消,方法是将账户的非ce推进,或再次委托给安全的合约。虽然有人建议更改规范以一次性收取最坏情况下的成本,但该建议尚未被采纳。开发者被告知应按当前行为继续构建系统。
范围最广的条目 INV-4 涵盖了任何在分叉前固定的 Gas 数量。无论其写在哪里:合约代码、设置值、签名消息或链下软件,它现在都可能过小。最后一类包括中继器(代表用户提交交易的服务)、Keepers 以及交易所提款系统。
首次接收者是常见的触发因素。向余额为零的地址发送代币会创建新的余额槽,向空地址发送 ETH 会创建新账户,这两者都被 EIP-8037 定价得更高。根据存储库的说法,今天只需 65,000 Gas 即可完成转账,但现在可能需要超过 150,000 Gas。
固定数值所在的位置决定了短缺的严重程度。在链下软件中,整个交易会回滚,并可以用更多 Gas 重新发送。在合约、其设置或签名消息中,只有内部调用失败。如果外部合约捕获了该失败,结果往往是最终的:消息被存储为失败、回调被跳过或奖励计算错误。其中一些数字根本无法编辑,包括分叉前签署的多签交易、已签署的元交易以及已在途中的跨链消息。
INV-7 将相同的问题应用于预留的 Gas。Solidity 的 `transfer` 和 `send` 传递固定的 2,300 Gas,但接收合约若写入新的存储槽,现在需要超过 110,000 Gas。智能钱包、支付拆分器和具有接收逻辑的保险库是明显的候选对象。
ChainSecurity 在10月13日的分析解释了为什么一些之前审计通过的防护机制可能会停止发挥作用。合约通常会捕获外部调用的失败,以便记录失败、跳过项目或尝试回退。当有人故意提供过少 Gas 时(称为“Gas 不足悲痛攻击”),这就变得危险,因为本应可重试的操作会被标记为永久失败。
合约通常通过两种方式防御此问题。一些方法在调用后检查剩余 Gas 的数量。另一些方法依赖于失败处理程序过于昂贵而无法完成。Glamsterdam 削弱了这两种机制。EIP-8037 为 Gas 限制高于 16,777,216 的交易提供了一个独立的存储成本储备池,常规的 `gasleft()` 检查无法看到该储备池。回退调用或清除刚写入的存储槽也可以返还已花费的 Gas。正如 ChainSecurity 所言:“即使合约代码未变,以前会导致回退的路径现在也可能完成。”
该公司现在建议不要根据事后剩余的 Gas 来推断调用失败的原因。其首选方法是尽可能让整个操作回退,或者保留恢复路径,而不是基于剩余 Gas 做出不可逆的决定。之前的审计无法独自弥补这一差距,因为它当时是根据当时的 Gas 规则评估代码的。基金会已与 ChainSecurity 和 Dedaub 合作,并在其内部审计之外开展工作,但其11月6日的帖子承认,它无法审查每个项目,尤其是链下代码。设计选择也影响修复方案。存储在可调整设置中的 Gas 限制可以简单地提高,而写入固定常数的 Gas 限制可能使重新部署和迁移成为唯一途径。
基金会支持这一变化的理由在于定价的准确性。其在8月份针对合约开发者的指南中指出,状态操作的 Gas 价格自2021年柏林分叉以来上次调整过。此后,以太坊的状态显著增长,最近的 Gas 限制增加加速了这一增长。该帖子称,重定价是提高 Gas 限制的前提条件。它表示,新时间表是基于支持基础吞吐量约三倍增长的性能目标得出的。
同一帖子报告称,在新价格下重放历史主网交易,绝大多数保持不变。大多数标记的问题可以通过提高 Gas 限制来解决。它告诉普通用户无需采取行动,因为更新的钱包和基础设施将处理这一变化。
11月的发现加强了最后一点的重要性。应对这一变化现在包括在委托失败后检查账户状态,并为首次接收者调整中继器的预算,这是旧的 Gas 规则从未要求的。
存储库表示,基金会在下一次所有核心开发者通话之前正在收集反馈。根据响应,它可能会略微修改 EIP-8037 和 EIP-8038,或保持原样。Hoodi 在问题解决之前保持未分叉状态,11月6日的帖子没有给出新的日期。据同一帖子称,计划在 Glamsterdam 之后进行的 Hegota 升级工作也在并行进行中。
值得跟踪的信号包括:基金会博客上的 Hoodi 分叉日期、任一 EIP 规范的修订以及受影响项目确认修复。基金会要求团队私下向 glamsterdam@ethereum.org 报告问题,而不是在公共 issue 中报告,以便在细节传播之前解决问题。
声明:文章不代表币圈网立场和观点,不构成本站任何投资建议。内容仅供参考!
免责声明:本站所有内容仅供用户学习和研究,不构成任何投资建议.不对任何信息而导致的任何损失负责.谨慎使用相关数据和内容,并自行承担所带来的一切风险.