> 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,4 млн CU, лимиты аккаунтов, структура хранения и то, как Rome обходит каждое из них.

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

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

| Ограничение                          | Значение          | Влияние                                                                                                            |
| ------------------------------------ | ----------------- | ------------------------------------------------------------------------------------------------------------------ |
| Размер транзакции                    | 4 КБ (4 096 байт) | Rome отправляет транзакции Solana v1; более крупные EVM-транзакции размещаются в аккаунтах-хранилищах (прозрачно)  |
| Вычислительные единицы на транзакцию | \~1,4 млн CU      | Операции, превышающие это значение, используют итеративный режим, у которого есть собственные лимиты (ниже)        |
| Аккаунтов на транзакцию              | 64 адреса         | Лимит транзакции v1; учитывается всё, к чему обращаются EVM-транзакция и её CPI, включая собственные аккаунты Rome |
| Максимальный размер хранилища        | 80 КБ             | Максимальный размер RLP для одной EVM-транзакции                                                                   |

## Лимиты выполнения EVM

| Ограничение                               | Значение                                               | Примечания                                                                                                                                                                                          |
| ----------------------------------------- | ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Слоты хранения контракта                  | 256 на аккаунт хранения                                | Для одного контракта можно создать несколько аккаунтов хранения                                                                                                                                     |
| Операций за одну итерацию                 | Адаптивно                                              | Упаковано в бюджет CU каждой транзакции Solana (VmIt)                                                                                                                                               |
| Время жизни блокировки аккаунта           | 3 с (4 с, когда сессия затрагивает более 28 аккаунтов) | Во время итеративного выполнения; обновляется на каждом шаге                                                                                                                                        |
| Длительность итеративной сессии           | 160 шагов                                              | После превышения лимита следующий шаг освобождает блокировки сессии и завершает её без фиксации каких-либо изменений                                                                                |
| Этапы, планируемые Rust SDK Rome          | 128                                                    | Предел итеративного компоновщика; реальные вызовы завершаются гораздо раньше                                                                                                                        |
| Транзакций на план, подписанный кошельком | 64                                                     | Максимум `rome_submitSignedV1Plan` принимает за один вызов; см. [Ретранслируемые вызовы и длинные вызовы](/ru/rukovodstva-dlya-razrabotchikov/call-evm-from-solana.md#relayed-calls-and-long-calls) |
| Кошельки казначейства                     | 64                                                     | Кошельки пула комиссий                                                                                                                                                                              |
| Ограничение размера контракта             | 24 КБ                                                  | То же, что и в Ethereum (EIP-170, 24 576 байт)                                                                                                                                                      |

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

| Ограничение                                       | Значение                                                                    | Примечания                                                                                                                         |
| ------------------------------------------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| Глубина CPI                                       | Максимум 4 уровня                                                           | Ограничение глубины CPI в Solana                                                                                                   |
| Аккаунтов на вызов CPI                            | В пределах лимита транзакции в 64 адреса                                    | Совместно используется со всеми прочими аккаунтами, к которым обращается транзакция                                                |
| Глубина CPI + Transfer Hook                       | Использует уровни CPI                                                       | Хуки передачи, вызванные изнутри CPI, могут превысить глубину                                                                      |
| Одна ветка на контракт                            | Устаревший (`0xff…07/08/09`, `0x42…16`) **или** cached (`0xff…04/05/06/0b`) | Смешивание изменяющих вызовов из обоих вариантов в одной транзакции запрещено                                                      |
| CPI по устаревшему треку в итеративной транзакции | Не допускается                                                              | CPI по устаревшему треку в итеративной транзакции завершается ошибкой `CpiProhibitedInIterativeTx`; эффекты cached-трека разрешены |

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

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

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

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

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

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

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

| Окружение         | ID цепочки | Program ID rome-evm                           |
| ----------------- | ---------- | --------------------------------------------- |
| Hadrian (testnet) | 200010     | `RPTWwELXAY4KC9ZPHhaxp7Sq1hHtU3HNEgLbSegCcWf` |
| Rubicon (mainnet) | 7531       | `RomePq9X3iAoTr813HR7uRarafFDUJty6GdiEceYpzX` |

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

| Precompile                 | Ограничение                                                                                                                       |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| Modexp (0x05)              | **Отключено** — вызов завершается с ошибкой `вызов big_mod_exp отключен` пока Solana не активирует `big_mod_exp` системный вызов  |
| BN254 ecPairing (0x08)     | Около 22K CU плюс 12,8K на пару по цене, установленной программой; проверка на четыре пары помещается в одну атомарную транзакцию |
| CPI precompile (0xFF...08) | Аккаунты должны быть заранее объявлены в транзакции Solana                                                                        |

## Проверка транзакции

| Правило                      | Эффект                                                                                                                                                                                                            |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Изменяемость подписи (EIP-2) | Подписанная транзакция, у которой `s` больше половины порядка кривой, отклоняется                                                                                                                                 |
| Форма RLP                    | Транзакция, у которой список RLP содержит лишние байты после последнего элемента, отклоняется                                                                                                                     |
| Не реализованный opcode      | Прерывает всю транзакцию (`IncompatibleVersionEVM(opcode)`); ничего не фиксируется, и вызывающий контракт не может подавить это исключение                                                                        |
| Учет газа                    | В Rome нет почасового/покомандного графика газа: газ, переданный в `CALL`/`CREATE` не принудительно применяется, и нет стимула в 2300 газа — не полагайтесь на защиту от реентерабельности, основанную на stipend |

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

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

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

1. **Держите глубину CPI небольшой.** Проектируйте контракты так, чтобы минимизировать вложенность. Если вы вызываете Jupiter, который вызывает Raydium, который вызывает SPL Token, вы находитесь на 3 уровнях — опасно близко к лимиту.
2. **Предпочитайте атомарный режим.** Проектируйте операции так, чтобы они укладывались примерно в 1,4 млн CU. Итеративный режим добавляет задержку (блокировки на 3–4 секунды), лимит в 160 итераций на сессию и запрос на подпись кошельку на каждом шаге на стороне Solana, когда кошелек подписывает шаги самостоятельно. Вызов, который использует CPI по устаревшему треку, вообще не может выполняться итеративно.
3. **Заранее объявляйте аккаунты.** Все аккаунты Solana, к которым обращается CPI, должны быть известны на момент создания транзакции (эмуляция прокси их обнаруживает). Динамическое обнаружение аккаунтов внутри вызова CPI невозможно, а общий объем должен укладываться в лимит 64 адресов.
4. **Выбирайте один precompile-трек на контракт.** Вызов пользовательской программы Solana (`invoke_signed`) относится к устаревшему треку и допускается только в атомарном режиме; см. [Интеграция программы Solana](/ru/rukovodstva-dlya-razrabotchikov/integrate-solana-program.md).
5. **Используйте `transfer_checked`.** Если вы создаете что-либо, что работает с токенами Token-2022, всегда используйте `transfer_checked` чтобы гарантировать срабатывание хуков.
6. **Проверяйте потребление CU.** Измеряйте реальные вычислительные единицы Solana по квитанции транзакции (`computeUnitsConsumed`) — EVM `gasUsed` не является точной заменой CU Solana. Оптимизируйте горячие пути с помощью Yul.

## Что дальше

* [Бюджет вычислений](/ru/klyuchevye-ponyatiya/compute-budget.md) — подробная стоимость CU по операциям
* [Совместимость токенов](/ru/klyuchevye-ponyatiya/token-interop.md) — модель моста ERC-20 ↔ SPL
* [Справочник precompile](/ru/spravochnik/precompiles.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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.rome.builders/ru/klyuchevye-ponyatiya/constraints.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
