Alert Source Discuss
⚠️ Draft Standards Track: Core

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、内存操作码 MLOAD64MSTORE64 以及堆栈操作码 PUSH*64

规范

本文档中使用的“必须”、“不得”、“必需”、“应”、“不应”、“建议”、“不建议”、“可以”和“可选”等关键词按照 RFC 2119 和 RFC 8174 中的描述进行解释。

我们定义以下 gas 成本常数:

  • G_VERYLOW64: 2

BYTE64

BYTE64 (0xc01a) 定义为 (x >> i * 8) & 0xFF。请注意,定义已从大端序更改为小端序。

gas 成本为 G_VERYLOW64

MLOAD64MSTORE64

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.