执行模型
Rome EVM 如何在 Solana 上处理以太坊交易——代理仿真、原子(VmAt)与迭代(VmIt)模式,以及完整的交易生命周期。
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 交易中。
工作方式:
每一步(即一笔 Solana 交易)都会执行 尽可能多的 EVM 操作码 ——这是自适应步长,而非固定计数
每一步之后,VM 状态都会序列化(Borsh 格式)到一个
StateHolder账户中下一步会反序列化状态并继续执行
涉及的账户在多步骤执行期间会被 TTL 锁定 3-4 秒 期间
状态机: FromStateHolder → Lock → Init → Execute → Serialize → NextIteration → ... → Completed
账户锁定:
RoLock(共享只读) —— 多个迭代式交易可以同时持有
RwLock(独占写入) —— 同一时间只能有一个交易修改某个账户
TTL: 3 秒(标准),4 秒(使用地址查找表时)
何时使用: BN254 配对验证、大型合约部署、深层调用栈,以及任何超过约 140 万 CU 的操作。
模拟
在将交易提交到 Solana 之前,Proxy 会使用 Mollusk SVM 模拟器在链下模拟它。这样可以:
估算 gas 消耗
判断需要原子式还是迭代式模式
识别交易将接触到的所有 Solana 账户
验证交易不会在链上失败
该模拟器执行与链上程序相同的 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 交易——尤其是合约部署——可能大得多。
拆分机制:
SDK 会将 RLP 编码的交易拆分为多个分片
每个分片都会写入到一个
TxHolder账户,通过TransmitTx指令当所有分片都暂存完成后,
DoTxHolder指令会组装并执行完整交易最大 holder 大小: 80 KB 每个 TxHolder
这对开发者来说完全透明——Rome SDK 会自动处理拆分与重组。
支持的交易类型
Legacy
—
传统以太坊交易
Access List
EIP-2930
优化的状态访问模式
动态费用
EIP-1559
基础费用 + 优先费用
Deposit
类型 0x7E
存款交易,例如桥接入账结算
日志化状态
Rome EVM 在执行期间使用日志化状态模型来管理状态变更:
所有变更(nonce、余额、存储、代码)都会记录在一个
日志嵌套的 CALL/CREATE 操作会推入快照帧
发生回滚时:日志条目回退到快照
成功时:变更会提交到 Solana 账户
非 EVM CPI 指令会立即执行(Solana 自身的原子性保证了正确性)
下一步
最后更新于
这有帮助吗?