> 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/klyuchevye-ponyatiya/constraints.md).

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

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

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

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

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

| Ограничение                   | Значение                      | Примечания                                                       |
| ----------------------------- | ----------------------------- | ---------------------------------------------------------------- |
| Слоты хранилища контракта     | 256 на один аккаунт хранилища | Для одного контракта можно создать несколько аккаунтов хранилища |
| Операкоды за итерацию         | Адаптивно                     | Упаковывается в бюджет CU каждой транзакции Solana (VmIt)        |
| TTL блокировки аккаунта       | 3–4 секунды                   | Во время итеративного выполнения                                 |
| Казначейские кошельки         | 64                            | Кошельки пула комиссий                                           |
| Ограничение размера контракта | 24 КБ                         | То же, что и в Ethereum (EIP-170, 24 576 байт)                   |

## Ограничения 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: среда выполнения Solana → программа Rome EVM
Уровень 1: программа Rome EVM → целевой CPI-вызов (например, Jupiter)
Уровень 2: Jupiter → другая программа (например, Raydium)
Уровень 3: Raydium → SPL Token (максимальная глубина)
```

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

| Ограничение                 | Влияние                                                                                       |
| --------------------------- | --------------------------------------------------------------------------------------------- |
| Один hook на mint           | У mint Token-2022 есть единственный слот transfer-hook                                        |
| `transfer_checked` только   | Hooks не срабатывают на обычном `transfer`. Операции моста Rome используют `transfer_checked` |
| Mint/burn не связаны с hook | Управляются через authority mint, а не через hooks                                            |

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

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

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

| Среда             | Chain ID | Идентификатор программы rome-evm              |
| ----------------- | -------- | --------------------------------------------- |
| Локальная         | 1001     | Локальный стек разработки                     |
| Hadrian (devnet)  | 200010   | `RPTWwELXAY4KC9ZPHhaxp7Sq1hHtU3HNEgLbSegCcWf` |
| Martius (testnet) | 121214   | `RomeTaTNPJNBxtB3Wong9geVTtkEFJfUqgktQVq3iSX` |

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

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

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

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

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

1. **Сохраняйте небольшую глубину CPI.** Проектируйте контракты так, чтобы свести вложенность к минимуму. Если вы вызываете Jupiter, который вызывает Raydium, который вызывает SPL Token, вы находитесь на 3 уровнях — опасно близко к пределу.
2. **Предпочитайте атомарный режим.** Проектируйте операции так, чтобы они укладывались примерно в 1,4 млн CU. Итеративный режим добавляет задержку (блокировки на 3–4 секунды) и сложность.
3. **Объявляйте аккаунты заранее.** Все аккаунты Solana, затрагиваемые CPI, должны быть известны на момент создания транзакции. Динамическое обнаружение аккаунтов внутри вызова CPI невозможно.
4. **Используйте `transfer_checked`.** Если вы создаёте что-либо, что работает с токенами Token-2022, всегда используйте `transfer_checked` чтобы гарантировать срабатывание hooks.
5. **Тестируйте потребление CU.** Измеряйте реальные вычислительные единицы Solana по квитанции транзакции (`computeUnitsConsumed`) — EVM `gasUsed` не является точным эквивалентом CU Solana. Оптимизируйте горячие пути с помощью Yul.

## Что дальше

* [Бюджет вычислений](/ru/klyuchevye-ponyatiya/compute-budget.md) — подробная стоимость CU для каждой операции
* [Совместимость токенов](/ru/klyuchevye-ponyatiya/token-interop.md) — модель моста ERC-20 ↔ SPL


---

# 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/klyuchevye-ponyatiya/constraints.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.
