For the complete documentation index, see llms.txt. This page is also available as Markdown.

架构

Rome 的各个组件如何协同工作——在 Solana 程序内部执行 EVM。

Rome 在一个 Solana 链上程序内部嵌入了一个 EVM 字节码解释器。用户通过标准的以太坊 JSON-RPC 与 Rome Proxy 通信,代理则将他们的交易直接提交到 Solana 上的 Rome EVM 程序。无需维护独立的执行层同步——EVM 状态 是 Solana 状态。

系统概览

User to Rome Proxy to the Rome EVM program on Solana, with Hercules indexing back

组件

Rome EVM 程序(链上)

Rome 的核心——一个包含完整 EVM 字节码解释器(SputnikVM 的分叉)的 Solana BPF 程序。它:

  • 接收序列化的 EVM 交易作为 Solana 指令

  • 在 Solana 运行时中执行 Solidity 字节码

  • 将每个以太坊地址(H160)映射到一个 Solana PDA

  • 提供用于调用 Solana 的预编译(CPI、System、Helper、Withdraw),并与标准以太坊预编译并列

  • 将 EVM 状态(余额、nonce、代码、存储)存储为 Solana 账户数据

Rome Proxy(JSON-RPC 服务器)

一个运行在 9090 端口的标准以太坊 JSON-RPC 服务器——公链的入口。它将以太坊 API 调用转换为 Solana 活动:

  • eth_sendRawTransaction → 序列化 EVM 交易 → 提交 Solana 指令

  • eth_call → 通过 Mollusk SVM 模拟器在链下模拟执行

  • eth_estimateGas → 用于 gas 估算的模拟

  • eth_getBalance, eth_getCode, eth_getBlockByNumber,回执、日志 → 由索引状态提供

它还提供 Rome 扩展: rome_emulateTx, rome_emulateRegRollup, rome_mintId, rome_buildInfo, rome_getResources,以及更多。

Hercules(索引器)

监视 Solana 上的 Rome EVM 程序,并重构与以太坊兼容的区块——交易、回执、日志和状态变更——由 PostgreSQL 提供支持。在公链上,它以 slot 对齐模式运行,因此区块号映射到一个 Solana slot,同一个 slot 在任何索引器上都会得到相同的区块。Proxy 将这些区块提供给钱包和区块浏览器。

预编译

Rome 实现了标准以太坊预编译(ecrecover、SHA-256、RIPEMD-160、identity、modexp、BN254 曲线运算、blake2f),语义与主网等价,并额外提供可访问 Solana 的非 EVM 预编译: CpiProgram (0xFF…08,任意 CPI), 系统 (0xFF…07,PDA 推导和 base58 辅助函数), HelperProgram (0xFF…09,ATA/PDA 创建、SPL 转账、gas↔lamports),以及 Withdraw (0x42…16)。请参阅 Contract Addresses 参考文档中的完整表格。

执行模式

Rome 以两种方式之一执行 EVM 交易:

原子式(VmAt)

一个 Solana 交易。整个 EVM 交易在一个 Solana 交易的计算预算内执行(约 140 万计算单元)。用于大多数操作——转账、普通合约调用、兑换。

迭代式(VmIt)

适用于超出单个交易预算的工作。执行被拆分到多个 Solana 交易中:

  1. 每一步(一个 Solana 交易)执行尽可能多、符合其计算预算的 EVM 操作码——步长是自适应的,而非固定的

  2. VM 状态被 Borsh 序列化到一个 StateHolder 步骤之间的账户中

  3. 账户在执行期间会被 TTL 锁定几秒钟

  4. 用于诸如 BN254 配对之类的重型操作

账户映射

每个以太坊地址都会确定性地映射到 Rome EVM 程序下、由链 ID 和该地址派生出的 Solana PDA。该 PDA 拥有该账户的余额(以 SPL 代币账户形式)、合约代码、存储槽和 nonce——全部作为 Solana 账户数据。

承载账户

Solana(v1)交易上限为 4 KB,但 EVM 交易(尤其是合约部署)可能大得多。Rome 会将大型交易分段存入 承载账户:交易被拆分为多个分块,按顺序写入承载账户(最多 80 KB),然后在链上组装并执行。Rome SDK 会透明地管理这一过程。

Gas 与定价

每条链都有自己的 gas 代币——任意 SPL 代币。Gas 定价会读取 Meteora DAMM 池(可配置为 v1 或 v2),以在 gas 代币与 SOL 之间转换,用于底层 Solana 交易手续费。

下一步

最后更新于

这有帮助吗?