Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-7921: 跳过 `JUMPDEST` 立即数参数检查

所有 `JUMPDEST` 字节都变为有效的 `JUMPDEST`

Authors William Morriss (@wjmelements)
Created 2025-03-26
Discussion Link https://ethereum-magicians.org/t/eip-7921-skip-jumpdest-immediate-argument-check/23279

摘要

允许 JUMPJUMPI 到达任何匹配 JUMPDEST (0x5b) 的字节,即使该字节是立即数参数。

动机

立即数参数是在代码中提供的,而不是在堆栈中的操作码参数。 目前,确定 JUMPDEST 的有效性需要确定哪些字节是其他操作码(例如 PUSH1)的立即数参数。 这会带来几个问题:

  1. 代码大小是一个线性的 DoS 向量,因为必须对代码进行预处理才能确定 JUMPDEST 的有效性。
  2. 带有立即数参数的新操作码无法安全地采用。
  3. CODECOPY 数据跨度会使后续的 JUMPDEST 失效。

JUMPDEST 有效性检查的基本原理是防止意外的代码执行。 但是,几乎所有的 JUMPJUMPI 目标都是常量目标。 删除此检查可以允许更大的程序和更好的操作码。 因此,此安全检查的成本超过了收益。

规范

激活后,所有 0x5b 字节对于 JUMPIJUMP 操作码都是有效的 JUMPDEST

理由

删除检查可以解决几个问题,同时降低 EVM 的复杂性。

向后兼容性

以前,代码只有一种反汇编解释。 通过此更改,位于立即数参数内的 JUMPDEST 可能会导致多个反汇编解释。 通常,这些解释会在几个字节后收敛,但是这种争议的长度可能是无限的。 CODECOPY 数据一直难以识别。 建议反汇编器在其输出中提供所有可能的解释,以揭示可能存在的幕后功能。

安全注意事项

如果可以跳转到包含 JUMPDEST 的立即数参数,则执行动态跳转的当前合约可能会获得新的意外功能。 预计只有极少数合约会因此而变得脆弱。 大多数智能合约编程语言甚至不允许动态跳转,而在允许动态跳转的语言中,很少有语言会在可访问的立即数参数中包含 JUMPDEST。 因此,预计只有少数合约会变得脆弱,并且对于其中的许多合约,新提供的代码路径将包含无效的操作码。 应该开发一种静态分析工具并公开提供,以测试合约是否可能变得脆弱,并且应该为所有当前合约运行该程序,以便通知项目有关潜在的安全问题。 受影响的程序将有充足的时间进行迁移。

版权

版权和相关权利通过 CC0 豁免。

Citation

Please cite this document as:

William Morriss (@wjmelements), "EIP-7921: 跳过 `JUMPDEST` 立即数参数检查 [DRAFT]," Ethereum Improvement Proposals, no. 7921, March 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7921.