Alert Source Discuss
⚠️ Review Standards Track: Core

EIP-7880: EOF - EXTCODEADDRESS 指令

向 EOF 添加 EXTCODEADDRESS 指令,以解决代码委托用例

Authors Danno Ferrin (@shemnon)
Created 2025-02-08
Requires EIP-7692, EIP-7702, EIP-7761

摘要

向 EOF 添加一条指令,该指令从帐户读取代码委托指定,而无需代码自省。

动机

EIP-7692 中定义的 EOFv1 从 EVM 中移除了代码自省功能,阻止 EOF 读取原始代码值,例如 EIP-7702 设置的代码委托指定。在许多用例中,读取 EIP-7702 的委托指定将允许合约更主动地解决用户体验问题。

一个例子是托管代理合约。此类合约可能希望通过不允许将代理更新到委托地址来确保安全性。指向委托也存在安全问题,因为合约可能会更新为非 EOF 代码,并且 EXTDELEGATECALL 将无法再调用该合约,这是因为更改超出了托管代理合约的控制范围。

另一个例子是需要确保委托在有限的时间范围内没有更改的合约,例如赞助。这将防止交易获得 gas 赞助、更改委托并执行与批准不同的行为。赞助商可以将委托编码到交易数据中,并使用此指令进行验证。

最后,有些合约可能希望降低风险,并且只接受任何给定合约的少量委托。为了启用此验证,合约将需要能够解析委托的实际地址,而不仅仅是知道存在委托。

为了解决这个问题,指定解析的基本任务被移动到一个新的操作码 EXTCODEADDRESS 中,在该操作码中将执行计算委托地址的任务。对于非委托帐户或空帐户,该地址将与查询的地址相同。

规范

参数

Constant Value
GAS_COLD_ACCOUNT_ACCESS Ethereum Execution Layer Spec Constants 中定义为 2600
GAS_WARM_ACCESS Ethereum Execution Layer Spec Constants 中定义为 100

我们引入一个新的 EOFv1 指令 EXTCODEADDRESS (0xea)。

包含此指令的 EOF 代码在激活此指令的分叉之前被认为是无效的。从此 EIP 在第一个区块中激活开始,此指令将添加到有效 EOFv1 指令集中。

执行语义

EXTCODEADDRESS

  • 扣除 GAS_WARM_ACCESS gas
  • 从堆栈中弹出 1 个参数 target_address
  • 如果 target_address 的高 12 个字节中的任何一个设置为非零值(即,它不包含 20 字节的地址),则以异常失败停止
    • 注意:EVM 地址空间的未来扩展可能会扩大有效地址的数量。不要依赖于此步骤始终在当前限制下停止。
  • 如果 target_address 不在 accessed_addresses 中,则扣除 GAS_COLD_ACCOUNT_ACCESS - GAS_WARM_ACCESS 并将 target_address 添加到 accessed_addresses
  • target_address 加载代码并将其称为 loaded_code
  • 如果 loaded_code 表示委托指示符(例如,以 EIP-7702 中定义的 0xef0100 为前缀),则将该指示符的地址推送到堆栈上。
    • 注意:如果 EIP-7702 委托指示符在未来的分叉中更新(例如,允许链式委托),那么预计本节将符合任何此类假设性更改。
  • 否则,将 target_adress 推送到堆栈上。

注意:如果 target_address 指向一个正在创建的合约的帐户,则返回 target_address。如果委托指示符指向一个正在创建的合约的帐户,则返回该指示符的地址。

注意:只有 target_address 被预热。如果找到委托,则不会将委托到的地址添加到 accessed_addresses 中。此外,委托地址是否在 accessed_addresses 中对操作收取的 gas 没有影响。

注意:此操作跨越了 EIP-7702 代码读取和代码执行指令之间的界限。操作步骤作为代码读取指令工作,但返回的值是已解析的地址,就像它是代码执行指令一样。

理由

此 EIP 与 EIP-7761 非常相似,后者引入了帐户类型自省。它的理由通过引用包含在内,因为它们都适用于这种情况。

替代方案:返回整个指定,让合约解析

一种替代方案是使用一个特别受限的 EXTCODECOPY,它只返回委托指定。除了对代码自省的一般反对之外,这还会锁定并限制委托指定的格式和功能,这些格式和功能必须在未来的分叉中保留。通过允许访问委托的效果而不是机制,EOF 保留了更改机制的空间,而不会破坏现有代码。

向后兼容性

0xea 处的 EXTCODEADDRESS 可以以向后兼容的方式引入到 EOFv1 中(没有版本升级),因为 0xea 在此 EIP 激活之前已被 EOF 验证拒绝,并且链上没有带有 0xea 指令的 EOF 合约会改变它们的行为。

安全考虑

EIP-7702 代码委托是一项尚未向主网开放的新功能。EIP 作者将及时了解任何进展,并反思其对本提案指令的影响。

版权

CC0 下放弃版权和相关权利。

Citation

Please cite this document as:

Danno Ferrin (@shemnon), "EIP-7880: EOF - EXTCODEADDRESS 指令 [DRAFT]," Ethereum Improvement Proposals, no. 7880, February 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7880.