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

Архитектура

Как компоненты Rome взаимодействуют между собой — выполнение EVM внутри программы Solana.

Rome встраивает интерпретатор байткода EVM в on-chain-программу Solana. Пользователи взаимодействуют с Rome Proxy через стандартный Ethereum JSON-RPC, а прокси напрямую отправляет их транзакции в программу Rome EVM в Solana. Отдельного уровня исполнения, который нужно синхронизировать, нет — состояние EVM является состоянием Solana.

Обзор системы

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

Компоненты

Программа Rome EVM (on-chain)

Ядро Rome — программа Solana BPF, содержащая полный интерпретатор байткода EVM (форк SputnikVM). Она:

  • Получает сериализованные EVM-транзакции в виде инструкций Solana

  • Выполняет байткод Solidity в среде выполнения Solana

  • Сопоставляет каждый адрес Ethereum (H160) с PDA Solana

  • Предоставляет предкомпиляции для вызова Solana (CPI, System, Helper, Withdraw) наряду со стандартными Ethereum предкомпиляциями

  • Хранит состояние EVM (балансы, nonce, код, хранилище) как данные аккаунтов Solana

Rome Proxy (JSON-RPC-сервер)

Стандартный Ethereum JSON-RPC-сервер на порту 9090 — точка входа для публичных сетей. Он преобразует вызовы Ethereum API в действия Solana:

  • eth_sendRawTransaction → сериализовать EVM-транзакцию → отправить инструкцию Solana

  • eth_call → эмулировать выполнение вне цепочки с помощью эмулятора Mollusk SVM

  • eth_estimateGas → симулировать для оценки газа

  • eth_getBalance, eth_getCode, eth_getBlockByNumber, квитанции, логи → предоставляются из индексированного состояния

Он также предоставляет расширения Rome: rome_emulateTx, rome_emulateRegRollup, rome_mintId, rome_buildInfo, rome_getResources, и многое другое.

Hercules (индексатор)

Отслеживает программу Rome EVM в Solana и воссоздаёт Ethereum-совместимые блоки — транзакции, квитанции, логи и изменения состояния — с опорой на PostgreSQL. В публичных сетях работает в режиме выравнивания по слотам, поэтому номер блока сопоставляется со слотом Solana, а один и тот же слот даёт один и тот же блок на любом индексаторе. Прокси предоставляет эти блоки кошелькам и обозревателям.

Предкомпиляции

Rome реализует стандартные Ethereum предкомпиляции (ecrecover, SHA-256, RIPEMD-160, identity, modexp, операции кривой BN254, blake2f) с семантикой, эквивалентной mainnet, а также не-EVM предкомпиляции, обращающиеся в Solana: CpiProgram (0xFF…08, произвольный CPI), System (0xFF…07, вычисление PDA и вспомогательные функции base58), HelperProgram (0xFF…09, создание ATA/PDA, переводы SPL, газ↔lamports), и Withdraw (0x42…16). См. Адреса контрактов для полной таблицы.

Режимы исполнения

Rome выполняет EVM-транзакцию одним из двух способов:

Атомарный (VmAt)

Одна транзакция Solana. Вся EVM-транзакция выполняется в пределах вычислительного бюджета одной транзакции Solana (~1,4 млн вычислительных единиц). Используется для большинства операций — переводов, обычных вызовов контрактов, свопов.

Итеративный (VmIt)

Для задач, превышающих бюджет одной транзакции. Выполнение разбивается на несколько транзакций Solana:

  1. Каждый шаг (транзакция Solana) выполняет столько EVM-операций, сколько помещается в её вычислительный бюджет, — размер шага адаптивный, а не фиксированный

  2. Состояние VM сериализуется в Borsh в StateHolder аккаунт между шагами

  3. Аккаунты блокируются по TTL на несколько секунд во время выполнения

  4. Используется для ресурсоёмких операций, таких как pairing на BN254

Сопоставление аккаунтов

Каждый адрес Ethereum детерминированно сопоставляется с PDA Solana, полученным из идентификатора сети и адреса в рамках программы Rome EVM. Этот PDA владеет балансом аккаунта (в виде SPL token accounts), кодом контракта, слотами хранилища и nonce — всё это хранится как данные аккаунта Solana.

Аккаунты-держатели

Транзакции Solana ограничены 1 232 байтами, но EVM-транзакции (особенно развёртывания контрактов) могут быть значительно больше. Rome помещает крупные транзакции в аккаунты-держатели: транзакция разбивается на фрагменты, которые последовательно записываются в holder (до 80 КБ), затем собираются и выполняются on-chain. SDK Rome делает это прозрачно.

Газ и ценообразование

У каждой сети есть собственный газовый токен — любой SPL-токен. Для ценообразования газа читается пул Meteora DAMM (v1 или v2, настраиваемо), чтобы конвертировать газовый токен и SOL для базовых комиссий транзакций Solana.

Что дальше

Последнее обновление

Это было полезно?