规范
为方便阅读的 AI 翻译,可能不准确或已过时。在治理、投票和争议中,英文原文是唯一权威文本。准确表述请参阅 GitHub 原文。
GitHub 英文原文 ↗## 摘要 本提案提出了一种新的操作码 `EXTENSION` (`0xAE`),可用于扩展 Monad 虚拟机的操作码级功能,同时最小化与以太坊执行层未来变更发生冲突的风险。它定义了扩展指令的编码方案,包括扩展选择器和两种编码立即数参数的样式,并与 [EIP-8163](https://eips.ethereum.org/EIPS/eip-8163) 对齐,该提案在以太坊 L1 上保留了相同的操作码。 ## 动机 目前,Monad 虚拟机中的字节码执行完全兼容以太坊:所有以太坊操作码均被支持,且 Monad 没有实现任何以太坊中不存在的额外操作码。然而,未来将会为 Monad 提出新功能,这些功能需要添加新的操作码。例如,早期版本的 [MIP-4](./MIP-4.md) 指定了添加一个操作码以检查 Monad 的储备余额机制的状态。虽然该提案拒绝了基于操作码的设计,转而支持预编译,但与该早期版本相关的设计决策促成了本提案的形成。 EIP-8163 在以太坊 L1 上专门保留了 `EXTENSION` (`0xAE`) 操作码,以使非 L1 EVM 链能够安全地实验扩展,而不必担心未来的不兼容性。本提案采用了这一保留策略。 ## 规范 ### 扩展操作码编码 `EXTENSION` 操作码 (`0xAE`) 后面必须紧跟一个 1 字节的扩展选择器。扩展选择器不得为 `0x5B` (`JUMPDEST`) 或在范围 `0x60`-`0x7F` (`PUSH1`-`PUSH32`) 内。在此排除范围内的扩展选择器必须导致异常停止,消耗所有剩余的 gas。 定义 **扩展操作码** 为 2 字节序列 `0xAE XX`。 在未来的提案为特定选择器分配含义之前,执行任何扩展操作码必须表现得好像执行了 `INVALID` (`0xFE`)。 ### 参数编码 如果特定扩展需要立即数参数,未来的提案必须使用以下两种编码样式之一: #### 限制范围的立即数 类似于 [EIP-8024](https://eips.ethereum.org/EIPS/eip-8024),参数字节直接跟在扩展操作码后面: ``` 0xAE XX a1 a2 ... ``` 每个参数字节不得为 `0x5B` 或在范围 `0x60`-`0x7F` 内。参数字节的数量是固定的,必须由定义扩展的提案指定。 #### PUSH 前缀的立即数 参数字节由一个跟在扩展操作码后面的 `PUSHx` 字节 (`0x60`-`0x7F`) 包围: ``` 0xAE XX PUSHx b1 b2 ... bn ``` `PUSHx` 字节决定参数长度 (n = 操作码 − `0x5F`)。完整的字节范围 `0x00`-`0xFF` 可用。 在任一编码样式中,扩展操作码后跟错误编码的字节必须表现得好像执行了 `INVALID` (`0xFE`)。 ## 理由 考虑了几种替代设计: ### 无扩展 在这个设计中,新的实现特定操作码简单地分配给现有 EVM 操作码空间中的未使用字节。这个设计从实现的角度来看很简单,但存在与未来以太坊升级冲突的风险。如果发生这种冲突,可能需要更复杂的解决方案,或者 Monad 将不得不接受与以太坊的永久不兼容。单个保留的扩展操作码大大降低了这种风险。 ### 类似 `PUSH1` 的选择器编码 当前接受的引入多字节操作码的方法是以 `JUMPDEST` 分析保持的方式进行,遵循 [EIP-8024](https://eips.ethereum.org/EIPS/eip-8024) 的先例。`JUMPDEST` 分析不受 `EXTENSION` 及其任一参数编码的影响。 该 MIP 的早期版本提议 `EXTENSION` 携带一个单字节的立即数操作数(结构上与 `PUSH1` 相同),形成一个两字节的 `0xAEXX` 指令,并在 `JUMPDEST` 分析中跳过 `XX` 字节。这与 `JUMPDEST` 分析保持相冲突,并妨碍跨链代码的可移植性。 ### 基于栈 与其将扩展参数编码为立即数据,不如从栈中弹出实现特定的操作码。这样做的好处是上游兼容性更简单。该方法的主要缺点是性能:从栈中弹出一个 32 字节的字,解释为操作码并在其上调度将退出典型解释器设计的热路径。然而,值得注意的是,Monad VM 的本地代码编译器可以轻松内联假定的常见模式 `PUSH1 0xXX; EXTENSION`,且没有额外开销。 此外,基于栈的调度将允许操作码选择来自运行时数据或计算,防止对栈内容和扩展行为的静态分析,并阻碍 EVM 执行优化。 ### 燃气费用 该 MIP 没有为单个扩展操作码提出燃气费用。任何无效或未定义的扩展操作码应与执行 `INVALID` 的费用相同(消耗所有燃气并回滚)。 ### 立即数编码风格的选择 该 MIP 将立即数编码风格的选择留给特定选择器。受限范围的立即数紧凑且适合不需要完整字节范围的短参数。PUSH 前缀的立即数允许任意字节值,但需要额外的框架字节。 ### 预编译 某些功能可以作为新的操作码或预编译实现:添加预编译从冲突的角度来看风险较小,但调用预编译会产生额外的 ABI 兼容性开销,这可能并不适用于所有功能。 ## 向后兼容性 操作码 `0xAE` 在以太坊和 Monad 中目前都是无效的。由于 `JUMPDEST` 分析不受 `EXTENSION` 的影响,因此现有代码行为没有变化。 ## 安全考虑 由于 `JUMPDEST` 分析不受 `EXTENSION` 的影响,Monad 和以太坊之间的跳转分析差异所带来的风险得以缓解。在两个链上,`0xAE` 后跟 `0x5B` 结果是 `0x5B` 仍然是一个有效的跳转目标。 ## 参考文献 - [EIP-8163: 保留 EXTENSION (0xAE) 操作码](https://eips.ethereum.org/EIPS/eip-8163) - [EIP-8024: 向后兼容的 SWAPN, DUPN, EXCHANGE](https://eips.ethereum.org/EIPS/eip-8024) - [Monad 初始规范](https://category-labs.github.io/category-research/monad-initial-spec-proposal.pdf) ## 版权 通过 [CC0](../LICENSE.md) 放弃版权及相关权利。
论坛讨论
-
mips.monad.xyz Monad Improvement Proposals (MIPs) Add a reserved opcode for implementation-defined extension opcodes This MIP proposes a generic scheme by which new opcodes can be added to the Monad VM, while minimising the risk of collisions with future Ethereum changes.
-
Disclaimer: I’m currently analyzing the JUMPDEST situation, and might propose a different approach to it (that there are reasons for the extension opcode to be JUMPDEST-analysis neutral). This is more of an editorial suggestion to current approach: In the Jumpdest Analysis section, the rule is too weak. In current form 0xEE605B would cause the 0x5B to be an invalid jump destination. I think it should read: As for PUSH1 opcode, an immediate data byte following a 0xEE byte is skipped over during JUMPDEST analysis. In particular: - In 0xEE5B the 0x5B is not a valid jump destination - In 0xEE605B the 0x5B is a valid jump destination - In 0xEE615B5B both 0x5B ’s are valid jump destinations etc. For completeness: we’re unfortunate EIP-8024 is considered for Amsterdam, complicating things. If it goes in, 0xE6EE5B , 0xEEE65B (and similar) must be dealt with.
-
I would recommend that an EIP-8024 -like approach to JUMPDEST-analysis is taken. Problem statement Let’s call the current approach “JUMPDEST-analysis expanding”, because we’re expanding the rules of the analysis, to cover 0xEE immediate arguments. The interaction of current JUMPDEST-analysis expanding MIP-7 and EIP-8024 is broken: Consider the bytecode: 0xE6 0xEE 0x60 0x5B . Here we compare how its JUMPDEST analysis and execution unfold: EVM Jumpdest Analysis Execution Osaka 0x5B is an invalid jumpdest as it is a PUSH1 argument: JD✗ invalid , invalid , PUSH1 0x5B EIP-8024 0x5B is an invalid jumpdest as it is a PUSH1 argument: JD✗ DUPN-0xEE (valid), PUSH1-0x5B MIP-7 0xEE skips 0x60 making 0x5B a valid jump destination: JD✓ invalid , EXTENSION-0x60 , JUMPDEST Both 0xEE skips 0x60 making 0x5B a valid jump destination: JD✓ DUPN-0xEE (valid), PUSH1-0x5B Osaka and M...
-
Added a proposal to MIP-7 to update and align with EIP-8163: Reserve EXTENSION (0xae) opcode