EIP-7958: EVM64 - 小端序操作码
用于 EVM64 的小端序操作码 `BYTE64`、`MLOAD64`、`MSTORE64` 和 `PUSH*64`
Authors | Wei Tang (@sorpaas) |
---|---|
Created | 2025-05-26 |
Discussion Link | https://ethereum-magicians.org/t/eip-7937-64-bit-mode-evm-opcodes-evm64/23794 |
Requires | EIP-7937 |
摘要
此 EIP 定义了可以与 EIP-7937 一起部署的额外的小端序操作码。
动机
定义 EVM64 的核心 EIP (EIP-7937) 与字节序无关。此 EIP 定义了那些必须暴露字节序的附加操作码。它们是按位操作码 BYTE64
、内存操作码 MLOAD64
和 MSTORE64
以及堆栈操作码 PUSH*64
。
规范
本文档中使用的“必须”、“不得”、“必需”、“应”、“不应”、“建议”、“不建议”、“可以”和“可选”等关键词按照 RFC 2119 和 RFC 8174 中的描述进行解释。
我们定义以下 gas 成本常数:
G_VERYLOW64
: 2
BYTE64
BYTE64
(0xc01a) 定义为 (x >> i * 8) & 0xFF
。请注意,定义已从大端序更改为小端序。
gas 成本为 G_VERYLOW64
。
MLOAD64
和 MSTORE64
MLOAD64
(0xc051) 将以小端序加载一个 64 位整数到堆栈上。MSTORE64
(0xc052) 将从堆栈中读取一个 64 位整数,并以小端序将其存储到内存中。
两种操作码的 gas 成本均为 G_VERYLOW64
。 内存调整大小的成本计为 8 个字节。
例如,[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
是一个 8 字节(64 位)数组。调用 MLOAD64
以将此 8 字节值加载到堆栈将以小端序读取它,从而产生 64 位整数 0x0807060504030201
。 64 位模式始终仅对最低有效 64 位进行操作。当另一个 256 位操作码在堆栈上遇到此值时,它将是 0x00..00 0807060504030201
。调用 MSTORE64
将此值存储到内存将导致数组 [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
。
PUSH*64
PUSH2_64
(0xc061) 到 PUSH8_64
(0xc067) 遵循 2 字节到 8 字节的字面量。字面量以小端序读取并推送到堆栈上。
它们的 gas 成本为 G_VERYLOW64
。
例如,0xc0 0x67 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08
将生成一个具有单个值 0x00..00 0807060504030201
的堆栈。
原理
有关详细的基本原理讨论,请参阅核心 EVM64 定义 EIP-7937。
向后兼容性
未发现向后兼容性问题。
测试用例
待添加。
参考实现
待添加。
安全注意事项
需要讨论。
版权
根据 CC0 放弃版权及相关权利。
Citation
Please cite this document as:
Wei Tang (@sorpaas), "EIP-7958: EVM64 - 小端序操作码 [DRAFT]," Ethereum Improvement Proposals, no. 7958, May 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7958.