Ограничения
Важные ограничения и пределы при разработке на 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 перед отправкой
Ограничения, зависящие от сети
Локальная
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
Смещения парсера
Эмпирически проверены — перед повторным развертыванием требуется повторная проверка
Рекомендации по проектированию
Делайте глубину CPI минимальной. Проектируйте контракты так, чтобы минимизировать вложенность. Если вы вызываете Jupiter, который вызывает Raydium, который вызывает SPL Token, вы находитесь на 3 уровнях — опасно близко к пределу.
Предпочитайте атомарный режим. Проектируйте операции так, чтобы они укладывались примерно в 1,4 млн CU. Итеративный режим добавляет задержку (блокировки на 3–4 секунды) и сложность.
Объявляйте учетные записи заранее. Все учетные записи Solana, затрагиваемые через CPI, должны быть известны на момент создания транзакции. Динамическое обнаружение учетных записей внутри CPI-вызова невозможно.
Используйте
только. Если вы создаете что-либо, что работает с токенами Token-2022, всегда используйтетолькочтобы гарантировать срабатывание hooks.Тестируйте потребление CU. Используйте
eth_estimateGasв ходе разработки. Оптимизируйте с помощью Yul для горячих участков. См. Оптимизация CU.
Что дальше
Бюджет вычислений — подробные затраты CU по операциям
Взаимодействие токенов — модель мостика ERC-20 ↔ SPL
Руководство по оптимизации CU — практические техники оптимизации
Последнее обновление
Это было полезно?