自选
我的自选
查看全部
市值 价格 24h%
  • 全部
  • 产业
  • Web 3.0
  • DAO
  • DeFi
  • 符文
  • 空投再质押
  • 以太坊
  • Meme
  • 比特币L2
  • 以太坊L2
  • 研报
  • 头条
  • 投资

免责声明:内容不构成买卖依据,投资有风险,入市需谨慎!

以太坊下一次升级或将改变旧合约的运行方式

2026-11-09 06:22:05
收藏

核心要点

Hoodi 测试网的硬分叉将在解决 Gas(燃料费)问题之前暂缓进行。以太坊基金会列出了八项在 Glamsterdam 升级中不再成立的 Gas 假设。目前,空账户委托操作的 Gas 消耗从 25,000 增加至 235,606。此外,交易被打包进区块不再能证明委托已生效。

Glamsterdam 升级中的八大 Gas 不变量变更

在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(一个公共合约源代码注册表)上验证的合约扫描,以及诸如读取交易收据等链下案例,扩展了之前的发现结果。

Glamsterdam 打破的八个假设

  1. INV-1:调用因 Gas 耗尽而失败,不再保证整个交易失败。
  2. INV-2:清除同一交易中稍早设置的值,会立即退还 Gas。
  3. INV-3:回退调用所花费的 Gas 不再完全损失;存储相关的 Gas 会返还。
  4. INV-4(需检查):固定的 Gas 金额可能不再足以覆盖任务成本。
  5. INV-5:剩余 Gas 可能在调用过程中增加,因此“初始减去最终”的方法不再能准确衡量成本。
  6. INV-6:失败调用后保留的 1/64 Gas 现在可以完成并记录失败状态。
  7. INV-7(需检查):为当前环境设计的 Gas 储备和津贴不足。
  8. INV-8:已打包的 EIP-7702 委托可能未生效,且可被重复使用。

已打包的委托不再证明钱包已配置

EIP-7702 允许普通以太坊账户通过签署指向委托合约的授权来运行智能合约代码。该授权旨在仅使用一次。在 Glamsterdam 升级之前,其全部成本会在前端一次性收取,因此无法支付费用的交易是无效的,永远不会进入区块。如果交易被打包,则意味着委托已生效。

存储库中的 INV-8 条目解释了 EIP-8037 带来的改变。部分成本现在取决于账户的状态,并且仅在处理授权时收取。从空账户发起委托的成本从之前的 25,000 Gas 激增至 235,606 Gas。如果交易预算按旧标准设定,它会被接受,但在应用授权时因 Gas 耗尽而失败,并最终进入带有失败状态的区块。此时,委托操作会被回滚,标记授权已使用的账户非ce(nonce)计数器也会回滚。然而,签名授权现已公开且仍然有效。

单独来看,这只会导致钱包未配置,而非被盗。危险在于当委托合约允许任何人调用其设置函数时。攻击者可以在自己的交易中重新提交暴露的授权,先调用设置函数并将自己设为账户所有者。虽然在公共内存池中抢跑(Front-running)授权已经是可能的,但存储库指出,失败的 transaction 现在本身就会发布有效的授权,因此将其路由至私有通道不再提供保护。存储库用示例代码记录了这一模式,但未点名任何受影响的钱包。

实际受影响的是钱包、中继器和索引器。存储库建议在委托交易后检查账户代码和非ce,而不是依赖交易收据。任何失败的授权都应被视为已暴露并取消,方法是将账户的非ce推进,或再次委托给安全的合约。虽然有人建议更改规范以一次性收取最坏情况下的成本,但该建议尚未被采纳。开发者被告知应按当前行为继续构建系统。

Gas 预算通常位于合约之外

范围最广的条目 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 分叉前:谁检查什么

  • 合约团队:将地址粘贴到基金会的受影响合约查找工具中。然后审查任何硬编码 Gas 值或基于剩余 Gas 分支的代码,无论是否列出。
  • 钱包和 RPC 提供商:为新时间表更新 Gas 估算。基金会警告称,缓存的 Gas 常数会低估成本并导致交易失败。
  • 中继器、Keepers 和 Bundlers:使限制可调,并在新规则下加上余量重新估算。在储备池阈值两侧测试交易。
  • 审计员:存储库包含使用 AI 编码代理运行其检查的说明,代码和结果保持在本地。

值得跟踪的信号包括:基金会博客上的 Hoodi 分叉日期、任一 EIP 规范的修订以及受影响项目确认修复。基金会要求团队私下向 glamsterdam@ethereum.org 报告问题,而不是在公共 issue 中报告,以便在细节传播之前解决问题。

展开阅读全文
更多新闻