Ограничения

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

Ограничения 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 для горячих участков. См. Оптимизация CUarrow-up-right.

Что дальше

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

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