EIP-7877: 增强型 RETURN 操作码
废弃 RETURN 操作码,转而使用新的操作码,允许从各种位置返回数据,而无需先写入内存。
Authors | Josh Weintraub (@jhweintraub) |
---|---|
Created | 2025-01-31 |
Discussion Link | https://ethereum-magicians.org/t/eip-7877-new-m-s-t-rreturn-opcodes/22731 |
Requires | EIP-6, EIP-1153, EIP-3855 |
摘要
本 EIP 指定了一系列新的 RETURN
操作码,允许用户指定从哪个数据位置返回,而不是默认从内存返回。
动机
随着瞬时存储的引入,许多智能合约已经开始使用新的瞬时操作码来存储数据,以优化 gas 使用,即回调
涉及返回先前瞬时存储的数据。但是,当前的 RETURN
操作码仅允许返回内存中的连续字节。这需要
开发者通过手动将数据从瞬时存储写入内存,然后再返回数据,从而产生额外的 gas 开销,
导致额外的内存扩展以及来自复杂 for 循环的操作码成本。类似的
当尝试返回已放置在存储中的数据时,也会出现效率低下的情况。本 EIP 尝试纠正
这一点,允许开发者通过决定直接从何处返回数据来优化他们的代码,而不是要求
首先将数据复制到内存的中间步骤。
规范
本 EIP 引入了 3 个新的操作码,以及重命名/别名化了一个现有的操作码。
SRETURN (0xf6)
TRETURN (0xf7)
RRETURN (0xf8)
RETURN -> MRETURN (0xf3)
MRETURN
操作码是 RETURN
的重命名,通过它,内存中的连续字节将被返回。它的操作方式将与 Cancun 硬分叉时完全相同,并且其 gas 成本将保持不变。
RRETURN
的操作方式与 MRETURN
类似。它从堆栈中弹出两个项,一个是在现有的 RETURNDATA
缓冲区中开始读取字节的偏移量,以及要返回的字节数。这些字节用于覆盖现有的 RETURNDATA
缓冲区,然后执行返回到前一个函数。
SRETURN
和 TRETURN
的操作方式类似,只是分别在存储和瞬时存储上操作。它从堆栈中弹出两个项,
一个是从哪个 slot 号开始读取,以及要从多少个连续的 slot 返回。例如:SRETURN(0x0, 0x40)
返回 slot [0, 1] 中的 64 字节的数据,而 TRETURN(0x0, 0x40)
返回瞬时存储 slot [0, 1] 中的数据。由于
现有的 S/TLOAD
操作码已经返回 32 字节,因此让操作码以 32 字节的块返回数据应该使汇编/编译器更容易实现。
如果长度参数为零,则仅应返回初始 slot 值,因此 SRETURN(0x00, 0x00)
返回存储 slot 0 处的值。
这些操作码的成本应类似于现在访问数据的成本。
SRETURN = (number_of_cold_slots) * 2100 + (numer_of_warm_slots * 100)
TRETURN = number_of_slots * 100
RRETURN = 无 memory_expansion 成本的 RETURNDATACOPY 成本
minimum_word_size = (size + 31) / 32
static_gas = 3
dynamic_gas = 3 * minimum_word_size
overall = static_gas + dynamic_gas
理由
允许更具针对性的返回操作码可以通过消除 首先将任何数据写入内存然后再返回的中间步骤,从而节省智能合约优化各个级别的 gas。在数据可能很大的情况下,这可以节省大量的 gas。这些操作码可以直接构建到 Solidity 编译器中,以便所有合约 都可以利用它们。同样,通过使返回更明确,它可以通过避免混乱的内存分配来实现更好的静态分析。
这些更改是有先例的。
EIP-3855:引入 PUSH0
操作码以优化将 0 推送到堆栈的替代方法。
EIP-6:将 SUICIDE
重命名为 SELFDESTRUCT
,而不更改功能。
向后兼容性
不存在向后兼容性问题,因为 MRETURN
将使用与 RETURN
现在相同的 gas 成本和操作码。由于 EOF,建议在将来完全实现 EOF 后,在未来的 EVM 版本中激活这些更改。
安全考虑
没有安全方面的考虑,因为它完全向后兼容,并通过简化的字节码减少了潜在的攻击面。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Josh Weintraub (@jhweintraub), "EIP-7877: 增强型 RETURN 操作码 [DRAFT]," Ethereum Improvement Proposals, no. 7877, January 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7877.