执行模型

Rome EVM 在 Solana 链上程序内执行 Solidity 字节码。本页说明 EVM 交易是如何处理的。

交易生命周期

1. 用户签名 EVM 交易(MetaMask / ethers.js)

2. Rome Proxy 通过 eth_sendRawTransaction 接收

3. Proxy 在链下模拟交易(Mollusk SVM 模拟器)
   → 估算 gas,检查原子性,识别所需账户

4. Proxy 将 EVM 交易封装为 Solana 指令
   → 若交易可放入一个 Solana 交易中 → 原子模式(VmAt)
   → 若交易超过 CU 预算 → 迭代模式(VmIt)

5. Solana 验证者执行该指令
   → Rome EVM 程序解释 EVM 字节码
   → 调用其他 Solana 程序的 CPI 调用(如有)

6. 状态变更提交到 Solana 账户

7. Hercules 为事件建立索引 → 生成 EVM 区块

原子执行(VmAt)

默认模式。整个 EVM 交易在单个 Solana 交易内执行。

状态机: Lock → Init → Execute → Commit → GasTransfer → Exit

特性:

  • 要么全部执行,要么全部回滚——如果任一步骤失败,整个交易将回滚

  • 每个 Solana 交易可用约 140 万计算单元

  • 适用于转账、简单合约调用、交换以及大多数 DeFi 操作

  • 亚秒级最终性(Solana 区块时间)

何时使用: 当模拟器判断交易可在单个 Solana 交易的计算预算内完成时,会自动选择该模式。

迭代执行(VmIt)

适用于超出单笔交易预算的高计算量操作。EVM 执行会拆分到多个 Solana 交易中。

工作方式:

  1. 每一步大约执行 500 个 EVM 操作码

  2. 每一步之后,VM 状态都会以 Borsh 格式序列化到 StateHolder 账户中

  3. 下一步会反序列化状态并继续执行

  4. 涉及的账户在多步执行期间会被 TTL 锁定 3-4 秒 期间

状态机: FromStateHolder → Lock → Init → Execute → Serialize → NextIteration → ... → Completed

账户锁定:

  • RoLock(共享只读) — 多个迭代交易可同时持有

  • RwLock(独占写入) — 同一时间只有一个交易可以修改某个账户

  • TTL: 3 秒(标准),4 秒(使用 Address Lookup Tables 时)

何时使用: BN254 配对验证、大型合约部署、深层调用栈,以及任何超过约 140 万 CU 的操作。

模拟

在将交易提交到 Solana 之前,Proxy 会使用 Mollusk SVM 模拟器在链下对其进行模拟。这会:

  1. 估算 gas 消耗

  2. 确定是否需要原子模式或迭代模式

  3. 识别交易将涉及的所有 Solana 账户

  4. 验证该交易不会在链上失败

该模拟器执行的 EVM 逻辑与链上程序完全相同—— entrypoint! 宏确保程序和模拟器代码库中的分发表完全一致。

Mollusk SVM 还可以在模拟期间执行任意 Solana BPF 程序,这意味着 eth_call 以及 eth_estimateGas 能够正确处理对 SPL Token、Jupiter、Kamino 等的 CPI 调用。

账户映射

每个以太坊地址都会映射到一个 Solana PDA:

链上存储的账户类型:

类型
种子
用途

余额

[chain, "ACCOUN_SEED", H160, bump]

nonce、余额、合约代码

存储

[chain, "STORAGE", H160, slot_index, bump]

合约存储(每个账户 256 个槽位)

TxHolder

[signer, "TX_HOLDER_SEED", index, bump]

暂存的交易数据(最大 80 KB)

StateHolder

[signer, "STATE_HOLDER_SEED", index, bump]

迭代之间序列化的 VM 状态

Holder 账户

Solana 交易限制为 1,232 字节。EVM 交易——尤其是合约部署——可能大得多。

拆分机制:

  1. SDK 会将 RLP 编码的交易拆分为多个分片

  2. 每个分片都会通过 TxHolder 账户写入到 TransmitTx 指令中

  3. 当所有分片都已暂存后, DoTxHolder 指令会组装并执行完整交易

  4. 最大 holder 大小: 80 KB 每个 TxHolder

对开发者而言,这完全是透明的——Rome SDK 会自动处理拆分与重组。

支持的交易类型

类型
EIP
描述

Legacy

传统以太坊交易

访问列表

EIP-2930

优化的状态访问模式

动态费用

EIP-1559

基础费用 + 优先费用

存款

类型 0x7E

L2 存款交易(由排序器发起)

带日志的状态

Rome EVM 使用带日志的状态模型来管理执行过程中的状态变更:

  • 所有变更(nonce、余额、存储、代码)都会被跟踪在一个 Journal

  • 嵌套的 CALL/CREATE 操作会压入快照帧

  • 回滚时:日志条目回退到快照

  • 成功时:变更提交到 Solana 账户

  • 非 EVM CPI 指令会立即执行(Solana 自身的原子性保证了正确性)

下一步

最后更新于

这有帮助吗?