For the complete documentation index, see llms.txt. This page is also available as Markdown.

Ограничения

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

Важные ограничения и границы при разработке на 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 уровня.

Ограничения 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.

Что дальше

Последнее обновление

Это было полезно?