EVM 兼容性
OXN 在 enclave 内运行一个完全兼容的 EVM。实际上,几乎所有能在以太坊上跑的合约都能在 OXN 上无修改运行。本页记录那少数行为有差异的地方,让你在踩坑前先看到它们。
必须调的编译器设置
把 evmVersion 锁定为 "paris"。 这是 OXN 上最重要的一个设置,也是 "invalid code" 错误最常见的来源。
Solidity 0.8.20 及以后默认 evmVersion: "shanghai",会生成 PUSH0 opcode (0x5F)。OXN 运行时尚未实现 PUSH0。用 Shanghai 默认编译的合约能成功部署,但运行到 PUSH0 的路径会 revert 报 invalid code——典型 Solidity 产物里这样的路径会有很多个。
| 工具链 | 设置 |
|---|---|
| Hardhat | hardhat.config.js 里 solidity.settings.evmVersion: "paris" |
| Foundry | foundry.toml 里 evm_version = "paris" |
| solc-js | settings.evmVersion: "paris" |
诊断技巧:如果你升级 solc 之后 bytecode.length 显著增大、又开始出 invalid code,很可能就是 PUSH0。paris 编译的 ERC-20 通常约 5.8 KB;shanghai 编译的约 6.2 KB,含约 180 条 PUSH0 指令。
Opcode 支持矩阵
| EVM 版本 | 引入的 opcode | OXN 支持 |
|---|---|---|
| Frontier | 基础指令集 | 完全 |
| Homestead | DELEGATECALL | 完全 |
| Byzantium | RETURNDATASIZE、RETURNDATACOPY、REVERT、STATICCALL | 完全 |
| Constantinople | SHL、SHR、SAR、CREATE2、EXTCODEHASH | 完全 |
| Istanbul | CHAINID、SELFBALANCE、gas 调整 | 完全 |
| Berlin | EIP-2929 gas 重定价 | 完全 |
| London | EIP-1559(base fee)、BASEFEE opcode | 部分(BASEFEE 返回 0 或固定值;无 EIP-1559 费用拍卖) |
| Paris | The Merge(DIFFICULTY → PREVRANDAO) | 完全 |
| Shanghai | PUSH0、warm COINBASE、EIP-3651 | 不 支持 |
| Cancun | 瞬态存储(TLOAD、TSTORE)、MCOPY、BLOBHASH | 不支持 |
设 evmVersion: "paris" 就在支持范围内。
标准 EVM 预编译合约
以太坊标准预编译(0x01 到 0x0a)支持情况:
| 地址 | 功能 | OXN 支持 |
|---|---|---|
0x01 | ecrecover | 完全 |
0x02 | sha256 | 完全 |
0x03 | ripemd160 | 完全 |
0x04 | identity | 完全 |
0x05 | modexp | 完全 |
0x06 | ecAdd(bn128) | 完全 |
0x07 | ecMul(bn128) | 完全 |
0x08 | ecPairing(bn128) | 完全 |
0x09 | blake2f | 完全 |
0x0a | pointEvaluation(KZG) | 不支持 |
OpenZeppelin、Solmate 以及大多数标准库只用 0x01–0x09,这些全部在场。pointEvaluation(用于 EIP-4844 blob 验证)在 OXN 上不需要,因为 OXN 没有 blob 交易。