以太坊已决定推迟原定于10月26日在Hoodi测试网上激活的Glamsterdam升级,并取消将该测试网Gas上限提升至2亿的计划。这一调整源于对EIP-8037提案与现有主网合约之间兼容性的担忧。
EIP-8037提出将交易中的Gas消耗分为两个独立池:执行Gas和状态Gas储备金。这种变化改变了智能合约在外部调用失败后的行为逻辑,可能导致原本应被回滚的操作被永久记录为失败。
以太坊基金会于10月22日宣布此延期决定,该决策是在第248届核心开发者执行会议中,基于对现有合约兼容性的深入评估后作出的。目前,相关技术团队正就潜在影响进行负责任的信息披露,尚未公开具体受影响项目名称。
根据新规则,执行Gas用于支付计算和指令运行成本,而状态Gas则专门覆盖创建持久化数据(如新存储槽)的费用。状态Gas储备金优先扣除,仅当其不足时才动用执行Gas。
值得注意的是,底层GAS Opcode仅报告剩余执行Gas,不反映状态Gas余额。这意味着即使执行Gas接近耗尽,合约仍可能具备足够的状态创建能力,从而在失败调用后继续写入数据。
| 特性 | Pool 01: 执行Gas | Pool 02: 状态Gas储备金 |
| 用途 | 支付EVM计算、指令和执行相关操作。 | 涵盖创建持久化区块链状态的额外费用。 |
| GAS Opcode | 报告 gas_left | 不包含 |
| 调用转发限制 | 适用于可用的执行Gas | 储备金Gas与执行Gas分开传递给子调用 |
这一差异意味着,一个合约可能在执行Gas有限的情况下,依然可以完成状态写入操作,进而改变事务最终结果。
考虑一种常见模式:合约在外部调用失败后,标记该操作为“永久失败”。例如:
// 故障记录模式
mapping(uint256 => bool) public failed;
function process(...) external {
(bool ok, ) = target.call(data);
if (!ok) failed[id] = true;
}
若该操作因资源不足而失败,但状态创建费用由状态Gas覆盖,则整个事务不会回滚,而是持续执行并留下失败记录。这可能导致合法重试被错误拒绝,形成财务逻辑缺陷。
在当前的Osaka Gas模型下,写入一个“暖”存储槽约需20,000 Gas。而在拟议的Glamsterdam规则中,执行部分降至10,100 Gas,状态创建费用为97,920 State Gas。虽然总成本相近,但因记账方式不同,实际执行路径可能发生突变。
当状态创建被撤销时,系统采用后进先出(LIFO)机制补充执行Gas。这意味着,某些情况下gasleft()报告的数值可能反而上升。相比之下,异常停止会直接消耗执行Gas,两者后果截然不同。
因此,开发者不能假设所有失败都会导致Gas返还;必须结合具体调用路径分析实际行为。
以下三类合约设计尤其需要重新评估:
这些仅为代码审查提示,并非确认存在漏洞。建议对代理合约、中间件及重试逻辑进行全面测试,对比Osaka与拟议规则下的执行结果。
Glamsterdam旨在通过协调执行与共识变更,提升以太坊Layer-1容量。其配套提案包括EIP-7732(提议者-构建者分离)和EIP-7928(区块级访问列表)。
其中,EIP-8037针对的是长期状态增长带来的网络负担问题。通过独立核算状态创建成本,期望在支持更大吞吐量的同时,防止状态膨胀过快。
然而,关键挑战在于如何确保新模型不破坏已有应用逻辑。即使合约接口不变,执行成本的变化也可能引发金融层面的意外后果。
Hoodi测试网的延期为开发团队提供了宝贵窗口期,用于深入分析受影响场景并制定缓解方案。目前尚未公布新的激活时间。
以太坊主网用户无需采取行动,但应用开发者必须意识到:仅仅设定激活日期不足以保证安全。真正的考验在于证明新Gas模型在各种复杂场景下仍能保持原有合约行为的一致性。
结论:此次推迟并非技术失败,而是对生态系统稳健性的主动防护。未来升级的成功与否,将取决于是否能在创新与兼容之间取得平衡。