EIP-7912: 务实的堆栈操作工具
增加额外的 SWAP 和 DUP 操作,以便更深入地访问堆栈
Authors | lightclient (@lightclient) |
---|---|
Created | 2025-03-25 |
Discussion Link | https://ethereum-magicians.org/t/eip-7912-pragmatic-expansion-of-stack-manipulation-tools/23826 |
Table of Contents
摘要
添加 SWAP17
-SWAP24
、DUP17
- DUP24
、SWAPN
、DUPN
和 EXCHANGE
指令。任意深度的操作必须以定义操作数的 PUSH1
指令开头。
动机
由于某些编译器的性质,更深入的堆栈访问是 VM 所需的功能。之前的尝试要么需要代码版本控制,如 EVM Object Format (EOF),要么由于对新立即数的解释,导致一些已部署合约的行为发生变化。
这是一种引入所需功能的务实方法。它重用了历史上已达成一致的指令语义,而不是新的、复杂的编码和容器。
规范
令 top - N
为堆栈上最近推送的第 N
个值,top -
0
为最近推送的值。
如果以下任何指令引用超出当前堆栈长度的堆栈元素,导致堆栈下溢,则以异常停止中止。
常量 SWAPXX
和 DUPXX
添加以下新指令:
SWAP17
、SWAP18
、…、SWAP24
:0xb0
、0xb1
、…、0xb7
。DUP17
、DUP18
、…、DUP24
:0xb8
、0xba
、…、0xbf
。
令 SWAPXX
和 DUPXX
指的是上面定义的静态指令。XX
被定义为它们引用的堆栈元素。
SWAPXX
操作将顶部元素与 top-XX
元素交换。DUPXX
操作复制 top-XX
元素并将副本推送到堆栈顶部。
SWAPN
和 DUPN
添加以下新指令:
SWAPN
:0xc0
.DUPN
:0xc1
.
这两个操作都从堆栈中获取一个参数 N
。此参数必须由紧接在 SWAPN
和
DUPN
指令之前的 PUSH1
操作提供。未能遵循此调用约定将导致 gas
不足错误。如果 N
为零,则报告 gas 不足错误。
SWAPN
从堆栈中弹出 N
,并将新的顶部堆栈元素与 top-N
堆栈元素交换。
DUPN
从堆栈中弹出 N
,并在 top-N-1
堆栈元素上推送一个副本。
EXCHANGE
添加以下新指令:
EXCHANGE
:0xc2
.
EXCHANGE
指令从堆栈中获取一个参数 X
,并将其解构为两个操作数 N
和
M
。N
为 X >> 4
,M
为 X &
0x0F
。参数 X
必须由紧接在 EXCHANGE
指令之前的 PUSH2
操作提供。未能遵循此调用约定将导致 gas 不足错误。如果 N
或 M
为零,则报告 gas 不足错误。
EXCHANGE
从堆栈中弹出 X
,并将索引 N-1
处的堆栈元素与索引 M-1
处的堆栈元素交换。
Gas 成本
所有操作的 gas 成本均为 3
。先前的 push 操作会根据 gas 计划单独收费。
原理
常量和动态 SWAP
和 DUP
使用常量 SWAPXX
或 DUPXX
指令与使用动态 SWAPN
或
DUPN
指令之间的主要权衡是,动态指令需要额外的两个字节(以先前 PUSH1
操作的形式),而常量版本不需要额外的字节。
一索引 EXCHANGE
由于 SWAP1
和 DUP1
在堆栈顶部运行,因此 EXCHANGE(1, 2)
在 top
和 top-1
上运行似乎很合适。
向后兼容性
未发现向后兼容性问题。
测试用例
TODO
安全注意事项
在验证先前的 PUSH
操作时,客户端实现者必须确保先前的字节不是更长的 push
数据段的一部分(例如,0x6301026001b0
应该报错)。这可以通过检查 pc-2
是否是有效的跳转目标来有效地完成。如果是,则 PUSH
指令将按预期执行。
版权
通过 CC0 放弃版权及相关权利。
Citation
Please cite this document as:
lightclient (@lightclient), "EIP-7912: 务实的堆栈操作工具 [DRAFT]," Ethereum Improvement Proposals, no. 7912, March 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7912.