# Ограничения

Важные ограничения и пределы при разработке на Rome EVM. Понимание этих ограничений помогает проектировать контракты, которые работают надежно.

## Ограничения транзакций Solana

| Ограничение                            | Значение     | Влияние                                                                      |
| -------------------------------------- | ------------ | ---------------------------------------------------------------------------- |
| Размер транзакции                      | 1 232 байта  | Крупные EVM-транзакции разбиваются по учетным записям-хранилищам (прозрачно) |
| Вычислительные единицы на транзакцию   | \~1,4 млн CU | Операции, превышающие это значение, используют итеративный режим             |
| Учетные записи на транзакцию (без ALT) | 28           | Для большего числа используйте таблицы поиска адресов                        |
| Учетные записи на транзакцию (с ALT)   | 64+          | ALT автоматически используется при количестве > 28 учетных записей           |
| Максимальный размер хранилища          | 80 КБ        | Максимальный размер RLP для одной EVM-транзакции                             |

## Ограничения выполнения EVM

| Ограничение                   | Значение                              | Примечания                                                              |
| ----------------------------- | ------------------------------------- | ----------------------------------------------------------------------- |
| Слоты хранения контракта      | 256 на каждую учетную запись хранения | Для одного контракта можно создавать несколько учетных записей хранения |
| Opcodes за итерацию           | \~500                                 | Для итеративного режима (VmIt)                                          |
| TTL блокировки учетной записи | 3–4 секунды                           | Во время итеративного выполнения                                        |
| Кошельки казначейства         | 64                                    | Кошельки пула комиссий                                                  |
| Ограничение размера контракта | 480 КБ                                | Увеличено по сравнению с 24 КБ в Ethereum (режим OP-Geth)               |

## Ограничения CPI

| Ограничение                 | Значение                              | Примечания                                               |
| --------------------------- | ------------------------------------- | -------------------------------------------------------- |
| Глубина CPI                 | Максимум 4 уровня                     | Ограничение глубины CPI в Solana                         |
| Учетные записи на вызов CPI | Ограничено размером транзакции Solana | На практике \~20 учетных записей на один CPI             |
| Глубина CPI + Transfer Hook | Использует уровни CPI                 | Transfer hook, вызванные из CPI, могут превысить глубину |

**Глубина CPI — наиболее критичное ограничение.** Rome EVM использует один уровень CPI, когда Solana вызывает программу Rome. Если ваш контракт Solidity затем вызывает другую программу Solana через CPI, это уровень 2. Если эта программа вызывает еще одну, это уровень 3. Всего у вас максимум 4 уровня.

```
Уровень 0: Runtime Solana → программа Rome EVM
Уровень 1: программа Rome EVM → целевая программа CPI (например, Jupiter)
Уровень 2: Jupiter → другая программа (например, Raydium)
Уровень 3: Raydium → SPL Token (максимальная глубина)
```

## Ограничения Token-2022 Transfer Hook

| Ограничение                     | Влияние                                                                                                                   |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Один hook на один mint          | Meta-Hook Router решает эту проблему (до 8 подхуков)                                                                      |
| `только` transfer\_checked      | Hooks не срабатывают на обычном `transfer`. Мост Rome ДОЛЖЕН использовать `только`                                        |
| Mint/burn не подключены к hooks | Управляется через mint authority, а не через hooks                                                                        |
| Только однорежимное состояние   | OP-Geth недоступен изнутри транзакции Solana                                                                              |
| Обход через упаковку токенов    | Пользователи могут упаковывать токены, чтобы обойти hooks. Смягчается с помощью blacklist для wrapper и PermanentDelegate |

## Ограничения газа и ценообразования

| Ограничение           | Примечания                                                     |
| --------------------- | -------------------------------------------------------------- |
| Источник цены газа    | Пул Meteora DAMM V1 (токен газа SPL)                           |
| Множитель цены газа   | Настраивается для каждого прокси (`gas_price_mul`)             |
| Минимальная цена газа | Устанавливается конфигурацией прокси                           |
| Оценка газа           | Выполняется вне цепочки через эмулятор Mollusk перед отправкой |

## Ограничения, зависящие от сети

| Окружение         | ID сети | ID программы                                  |
| ----------------- | ------- | --------------------------------------------- |
| Локальная         | 1001    | Устанавливается в `rome-setup` конфиге        |
| Devnet (montispl) | 200002  | `RD2Gg7Lcnv62XmRHAzxh6fQQfMRzHtN5LeKPVBhYU5S` |
| Testnet (Martius) | 121214  | Проверьте конфигурацию развертывания          |
| Testnet (Caelian) | 121215  | Проверьте конфигурацию развертывания          |

## Ограничения прекомпиляций

| Прекомпиляция                 | Ограничение                                                               |
| ----------------------------- | ------------------------------------------------------------------------- |
| Modexp (0x05)                 | **Отключено** — может быть включено через флаг функции                    |
| BN254 ecPairing (0x08)        | Высокая стоимость CU — обычно требуется итеративный режим (\~200 тыс. CU) |
| CPI-прекомпиляция (0xFF...08) | Учетные записи должны быть заранее объявлены в транзакции Solana          |

## Ограничения оракулов

| Ограничение                                | Значение                                                                            |
| ------------------------------------------ | ----------------------------------------------------------------------------------- |
| Стандартный максимальный порог устаревания | 60 секунд                                                                           |
| Исторические данные раунда                 | Не поддерживаются — `getRoundData(roundId)` вызывает revert                         |
| EMA Switchboard                            | Не поддерживаются — `latestEMAData()` вызывает revert на SwitchboardV3              |
| Смещения парсера                           | Эмпирически проверены — перед повторным развертыванием требуется повторная проверка |

## Рекомендации по проектированию

1. **Делайте глубину CPI минимальной.** Проектируйте контракты так, чтобы минимизировать вложенность. Если вы вызываете Jupiter, который вызывает Raydium, который вызывает SPL Token, вы находитесь на 3 уровнях — опасно близко к пределу.
2. **Предпочитайте атомарный режим.** Проектируйте операции так, чтобы они укладывались примерно в 1,4 млн CU. Итеративный режим добавляет задержку (блокировки на 3–4 секунды) и сложность.
3. **Объявляйте учетные записи заранее.** Все учетные записи Solana, затрагиваемые через CPI, должны быть известны на момент создания транзакции. Динамическое обнаружение учетных записей внутри CPI-вызова невозможно.
4. **Используйте `только`.** Если вы создаете что-либо, что работает с токенами Token-2022, всегда используйте `только` чтобы гарантировать срабатывание hooks.
5. **Тестируйте потребление CU.** Используйте `eth_estimateGas` в ходе разработки. Оптимизируйте с помощью Yul для горячих участков. См. [Оптимизация CU](https://github.com/rome-protocol/docs/blob/main/developer-guides/cu-optimization.md).

## Что дальше

* [Бюджет вычислений](/ru/osnovnye-koncepcii/compute-budget.md) — подробные затраты CU по операциям
* [Взаимодействие токенов](/ru/osnovnye-koncepcii/token-interop.md) — модель мостика ERC-20 ↔ SPL
* [Руководство по оптимизации CU](https://github.com/rome-protocol/docs/blob/main/developer-guides/cu-optimization.md) — практические техники оптимизации


---

# 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/osnovnye-koncepcii/constraints.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.
