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

Rome Protocol встраивает интерпретатор байткода EVM внутрь on-chain программы Solana. На этой странице объясняется, как компоненты взаимодействуют друг с другом.

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

```
┌─────────────────────────────────────────────────────────────────┐
│                        Уровень пользователя                    │
│   MetaMask / ethers.js / Hardhat / Foundry                      │
│   (стандартный Ethereum JSON-RPC)                               │
└──────────────────────┬──────────────────────────────────────────┘
                       │
            ┌──────────┴──────────┐
            ▼                     ▼
   ┌────────────────┐    ┌────────────────┐
   │  Rome Proxy    │    │   OP-Geth      │
   │  (:9090)       │    │   (:8545)      │
   │  JSON-RPC      │    │   EVM RPC      │
   └───────┬────────┘    └───────┬────────┘
           │                     │
           │              ┌──────┴──────┐
           │              │    Rhea     │  (ретранслирует транзакции geth в Solana)
           │              └──────┬──────┘
           │                     │
           └──────────┬──────────┘
                      ▼
   ┌──────────────────────────────────────────────────────────────┐
   │                    Среда выполнения Solana                    │
   │                                                              │
   │   ┌──────────────────────────────────────────────────┐       │
   │   │              Программа Rome EVM                  │       │
   │   │                                                   │       │
   │   │   Интерпретатор байткода EVM (форк SputnikVM)     │       │
   │   │   Сопоставление аккаунтов: H160 → Solana PDA     │       │
   │   │   Прекомпайлы: ecrecover, BN254, SPL, CPI и т. д. │       │
   │   └───────────────────────┬───────────────────────────┘       │
   │                           │ CPI                               │
   │   ┌───────────┬───────────┼───────────┬───────────┐          │
   │   │SPL Token  │ Jupiter   │ Kamino    │ Meteora   │  ...     │
   │   └───────────┴───────────┴───────────┴───────────┘          │
   └──────────────────────────────────────────────────────────────┘
                      ▲
                      │ Индексирует события
               ┌──────┴──────┐
               │  Hercules   │  (блок-индексатор → Engine API → OP-Geth)
               └─────────────┘
```

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

### Программа Rome EVM (On-Chain)

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

* Получает сериализованные EVM-транзакции из инструкций Solana
* Выполняет байткод Solidity в среде выполнения Solana
* Сопоставляет Ethereum-адреса (H160) с Solana PDA
* Предоставляет интерфейсы прекомпайлов для CPI, SPL Token, System Program
* Управляет состоянием EVM (хранилище контрактов, балансы, nonce) как данными аккаунтов Solana

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

Стандартный сервер Ethereum JSON-RPC на порту 9090, который преобразует вызовы Ethereum API в транзакции Solana:

* `eth_sendRawTransaction` → сериализовать EVM-транзакцию → отправить инструкцию Solana
* `eth_call` → эмулировать выполнение EVM вне цепочки (через эмулятор Mollusk SVM)
* `eth_estimateGas` → симулировать выполнение для оценки газа
* `eth_getBalance`, `eth_getCode`, и т. д. → читать из данных аккаунта Solana

Расширения Rome: `rome_emulateTx`, `rome_emulateRegRollup`, `rome_mintId`, `rome_buildInfo`, `rome_getResources`.

### OP-Geth (опциональный уровень EVM RPC)

Модифицированный клиент Go-Ethereum, предоставляющий полную совместимость с Ethereum RPC. В режиме op-geth:

1. Пользователи отправляют транзакции в OP-Geth (:8545)
2. Rhea ретранслирует транзакции в Rome Proxy → Solana
3. Hercules индексирует события Solana и передает блоки EVM в OP-Geth через Engine API (:8551)

В режиме single-state пользователи подключаются напрямую к Rome Proxy (:9090), полностью минуя OP-Geth.

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

Отслеживает программу Rome EVM в Solana и формирует данные блоков, совместимые с EVM:

* Отслеживает события программы Rome в Solana
* Восстанавливает блоки EVM с квитанциями транзакций, логами и изменениями состояния
* Передает блоки в OP-Geth через Engine API для стандартной совместимости с блок-эксплорерами
* Поддерживается PostgreSQL

### Rhea (мост мемпула)

Связывает мемпул OP-Geth с Solana:

* Читает ожидающие транзакции из мемпула OP-Geth
* Обертывает их как инструкции Solana, нацеленные на программу Rome EVM
* Отправляет в Solana для выполнения

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

Rome поддерживает два режима выполнения для EVM-транзакций:

### Атомарное выполнение (VmAt)

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

### Итеративное выполнение (VmIt)

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

1. Каждый шаг выполняет \~500 опкодов EVM
2. Состояние VM сериализуется в Borsh в `StateHolder` аккаунт между шагами
3. Аккаунты блокируются по TTL на 3–4 секунды во время выполнения
4. Используется для тяжелых операций, таких как pairings BN254 (верификация ZK-доказательств)

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

Каждый Ethereum-адрес (20 байт) сопоставляется с Solana PDA (32 байта), производным от программы Rome EVM:

```
Ethereum Address (H160) → PDA = findProgramAddress([address], ROME_EVM_PROGRAM)
```

Этот PDA владеет следующими данными аккаунта:

* ETH/токен баланс (как SPL token accounts)
* Байткод контракта (хранится в данных аккаунта Solana)
* Слоты хранилища контракта (хранятся в данных аккаунта Solana)
* Nonce

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

Транзакции Solana ограничены 1 232 байтами. EVM-транзакции (особенно развертывание контрактов) могут быть значительно больше. Rome решает это с помощью **holding accounts**:

1. Крупные EVM-транзакции разбиваются на части
2. Части последовательно размещаются в holding account (макс. 80 КБ)
3. После записи всех частей полная транзакция собирается и выполняется
4. Это прозрачно управляется Rome SDK

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

Каждое приложение (chain ID) в Rome имеет собственный газовый токен — любой SPL-токен. Ценообразование газа использует пулы Meteora DAMM V1 для конвертации между газовым токеном и SOL для базовых комиссий транзакций Solana.

## Режимы развертывания

| Режим                  | Поток данных                                                                 | Сценарий использования                        |
| ---------------------- | ---------------------------------------------------------------------------- | --------------------------------------------- |
| **Режим OP-Geth**      | Пользователи → OP-Geth → Rhea → Proxy → Solana; Hercules индексирует обратно | Полная совместимость с Ethereum RPC           |
| **Режим single-state** | Пользователи → Proxy → Solana напрямую                                       | Более простое развертывание, меньшая задержка |

## Что дальше

* [Quickstart](/ru/nachalo-raboty/quickstart.md) — разверните свой первый контракт
* [Модель выполнения](/ru/osnovnye-koncepcii/execution-model.md) — углубленный разбор атомарного и итеративного выполнения
* [Бюджет вычислений](/ru/osnovnye-koncepcii/compute-budget.md) — понимание затрат CU и оптимизации


---

# Agent Instructions: 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:

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

The question should be specific, self-contained, and written in natural language.
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.
