跳转到主要内容
mip.watch
⌘K

MIP-7

Extension opcodes

草案 标准轨道 核心 GitHub ↗ 论坛 ↗
构想 草案 审核中 最终审核 最终 持续更新

Add a reserved opcode for implementation-defined extension opcodes

作者
Category Labs
创建时间
2026-01-28
更新时间
2026年6月15日

利益相关方影响

此 MIP 为各受众群体带来的变化。严重度和操作标记由模型推导得出,并按 MIP 类型/分类设定确定性下限值。

要点速览

本提案提出了一个新的操作码 `EXTENSION` (`0xAE`),用于扩展Monad虚拟机的功能,同时降低与以太坊执行层未来变更冲突的风险。

变更内容

  • 新增操作码 `EXTENSION` (`0xAE`),用于实现自定义扩展功能。
  • 定义扩展操作码的编码方案,包括扩展选择器和两种立即数参数的编码风格。
  • 确保与以太坊的兼容性,避免未来的冲突。
  • 扩展操作码执行时,若未定义选择器则表现为无效操作。
  • 不对扩展操作码单独设定燃气费用,执行无效操作时消耗所有燃气。

开发者

智能合约与 dapp 构建者、RPC 使用者、工具开发者

新增的 `EXTENSION` 操作码(`0xAE`)为未来的扩展提供了接口,但当前没有对现有合约行为产生影响,因此不需要重新编译或重新部署合约。

用户

钱包用户、EOA 持有者、dapp 访问者

此提案引入了一个新的操作码 `EXTENSION`,但不会影响现有的交易费用、确认速度或资产安全性。用户无需采取任何行动。

验证者

节点运营者、RPC 运营者、委托者

此MIP引入了新的扩展操作码,可能会影响未来的操作码设计,但目前不会对验证者的收入或运营产生直接影响。

基金会

Monad 基金会与 Category Labs 核心开发者

此提案涉及对Monad VM的扩展操作码的定义,可能需要协调多个利益相关者以确保与以太坊的兼容性,并且可能需要在未来的MIP中进行进一步的决策。

2026年8月7日 14:32 生成 · 模型:gpt-4o-mini

规范

机器翻译
引用
子系统 executionevm

为方便阅读的 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) 放弃版权及相关权利。

论坛讨论

4 个帖子 · 1 个点赞 · 5个月前
在论坛上阅读更多 ↗
  1. @Bruce Collie #1 2026年1月29日 09:57

    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.

  2. @Pdobacz #2 2026年2月4日 13:57

    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.

  3. @Pdobacz #3 2026年2月9日 10:00

    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...

  4. @Pdobacz #4 2026年3月10日 10:57

    Added a proposal to MIP-7 to update and align with EIP-8163: Reserve EXTENSION (0xae) opcode