Alert Source Discuss
⚠️ Draft Standards Track: Core

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

摘要

添加 SWAP17-SWAP24DUP17 - DUP24SWAPNDUPNEXCHANGE 指令。任意深度的操作必须以定义操作数的 PUSH1 指令开头。

动机

由于某些编译器的性质,更深入的堆栈访问是 VM 所需的功能。之前的尝试要么需要代码版本控制,如 EVM Object Format (EOF),要么由于对新立即数的解释,导致一些已部署合约的行为发生变化。

这是一种引入所需功能的务实方法。它重用了历史上已达成一致的指令语义,而不是新的、复杂的编码和容器。

规范

top - N 为堆栈上最近推送的第 N 个值,top - 0 为最近推送的值。

如果以下任何指令引用超出当前堆栈长度的堆栈元素,导致堆栈下溢,则以异常停止中止。

常量 SWAPXXDUPXX

添加以下新指令:

  • SWAP17SWAP18、…、SWAP240xb00xb1、…、0xb7
  • DUP17DUP18、…、DUP240xb80xba、…、0xbf

SWAPXXDUPXX 指的是上面定义的静态指令。XX 被定义为它们引用的堆栈元素。

SWAPXX 操作将顶部元素与 top-XX 元素交换。DUPXX 操作复制 top-XX 元素并将副本推送到堆栈顶部。

SWAPNDUPN

添加以下新指令:

  • SWAPN: 0xc0.
  • DUPN: 0xc1.

这两个操作都从堆栈中获取一个参数 N。此参数必须由紧接在 SWAPNDUPN 指令之前的 PUSH1 操作提供。未能遵循此调用约定将导致 gas 不足错误。如果 N 为零,则报告 gas 不足错误。

SWAPN 从堆栈中弹出 N,并将新的顶部堆栈元素与 top-N 堆栈元素交换。

DUPN 从堆栈中弹出 N,并在 top-N-1 堆栈元素上推送一个副本。

EXCHANGE

添加以下新指令:

  • EXCHANGE: 0xc2.

EXCHANGE 指令从堆栈中获取一个参数 X,并将其解构为两个操作数 NMNX >> 4MX & 0x0F。参数 X 必须由紧接在 EXCHANGE 指令之前的 PUSH2 操作提供。未能遵循此调用约定将导致 gas 不足错误。如果 NM 为零,则报告 gas 不足错误。

EXCHANGE 从堆栈中弹出 X,并将索引 N-1 处的堆栈元素与索引 M-1 处的堆栈元素交换。

Gas 成本

所有操作的 gas 成本均为 3。先前的 push 操作会根据 gas 计划单独收费。

原理

常量和动态 SWAPDUP

使用常量 SWAPXXDUPXX 指令与使用动态 SWAPNDUPN 指令之间的主要权衡是,动态指令需要额外的两个字节(以先前 PUSH1 操作的形式),而常量版本不需要额外的字节。

一索引 EXCHANGE

由于 SWAP1DUP1 在堆栈顶部运行,因此 EXCHANGE(1, 2)toptop-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.