Бюджет вычислений

Каждая транзакция Solana имеет бюджет вычислений, измеряемый в Compute Units (CU). Понимание стоимости CU помогает проектировать эффективные контракты Rome.

Обзор бюджета

Режим
Макс. CU
Примечания

Атомарный (VmAt)

~1 400 000 CU

Одна транзакция Solana

Итеративный (VmIt)

Неограниченно (мульти-транзакции)

~500 опкодов за шаг итерации

Каждая транзакция Solana имеет бюджет по умолчанию в 200 000 CU, который можно увеличить примерно до 1,4 млн CU с помощью инструкций бюджета вычислений (автоматически добавляются SDK Rome).

Оценки стоимости CU

Операции EVM

Операция
Примерно CU
Примечания

Проверка подписи (ecrecover)

~5 000 CU

secp256k1 через системный вызов Solana

Простое перевод

~50 000–100 000 CU

Только обновления баланса

Перевод ERC-20

~100 000–150 000 CU

Включает вызов SPL precompile

Развертывание контракта (малого)

~200 000–400 000 CU

Зависит от размера байткода

Запись в хранилище (SSTORE)

~5 000–20 000 CU

Холодный vs. тёплый доступ

Операции CPI

Операция
Примерно CU
Примечания

Базовые накладные расходы transfer hook

100 000 CU

За каждый перевод

Нативный sub-hook

50 000 CU

За каждый нативный хук Solana

EVM sub-hook

200 000 CU

За каждый EVM-хук

Рекомендуемый EVM-перевод с хукaми

800 000 CU

Безопасный бюджет для переводов с хуками

Операции precompile

Прекомпиляция
Примерно CU

ecrecover

~3 000–5 000 CU

SHA-256

~1 000 CU

BN254 ecAdd

~10 000 CU

BN254 ecMul

~40 000 CU

BN254 ecPairing

~200 000+ CU

Методы оптимизации

1. Используйте Yul для горячих путей

Оптимизатор Solidity выдаёт вполне приемлемый код, но Yul (встроенная ассемблерная вставка) может значительно снизить CU для критически важных операций:

2. Кэшируйте вычисления PDA

Вычисление PDA через find_program_address дорогостоящее. Сохраняйте вычисленные PDA в хранилище контракта вместо того, чтобы вычислять их при каждом вызове:

3. Жёстко задавайте известные ID программ

Не загружайте ID программ из хранилища — используйте константы:

4. Минимизируйте количество аккаунтов

Каждый аккаунт в транзакции Solana увеличивает накладные расходы CU. Сократите число аккаунтов за счёт:

  • Пакетирования операций, которые используют общие аккаунты

  • Использования меньшего числа промежуточных аккаунтов

  • Избегания избыточных проверок создания ATA

5. Используйте настройки оптимизатора

Измерение потребления CU

Используйте eth_estimateGas чтобы измерить CU перед отправкой:

Или через ethers.js:

Что дальше

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

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