> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/ru/nachalo-raboty/architecture.md).

# Архитектура

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

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

<figure><img src="/files/80677f8e1becdc16492b1b5db7ae8f36493b4c08" alt="User to Rome Proxy to the Rome EVM program on Solana, with Hercules indexing back"><figcaption></figcaption></figure>

## Компоненты

### Программа 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`). См.  [Адреса контрактов](/ru/spravochnik/contract-addresses.md) для полной таблицы.

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

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.

## Что дальше

* [Сети](/ru/seti/networks.md) — подключитесь к Martius или Hadrian
* [Быстрый старт](/ru/nachalo-raboty/quickstart.md) — разверните свой первый контракт
* [Модель выполнения](/ru/osnovnye-ponyatiya/execution-model.md) — подробнее об атомарном и итеративном выполнении


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.rome.builders/ru/nachalo-raboty/architecture.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
