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.