Кратко
По умолчанию 200 000 ВЕ на инструкцию, максимум 1,4 млн на транзакцию.
Используйте инструкции SetComputeUnitLimit и SetComputeUnitPrice для
оптимизации. Приоритетная комиссия рассчитывается исходя из запрошенного
количества ВЕ, а не фактического использования.
Лимит вычислительных единиц
Каждой инструкции выделяется
по умолчанию 200 000 ВЕ,
а на каждую транзакцию установлен предел в
1 400 000 ВЕ.
Если явная инструкция SetComputeUnitLimit отсутствует,
значение по умолчанию рассчитывается
в зависимости от типа инструкции:
default_cu_limit = (num_non_migratable_builtin_instructions * 3,000)+ (num_not_migrated_builtin_instructions * 3,000)+ (num_non_builtin_instructions * 200,000)+ (num_migrated_builtin_instructions * 200,000)
- Встроенные инструкции (System Program, Stake, Vote и др., которые ещё не
переведены на SBF): каждой выделяется
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3 000 ВЕ (см. SIMD-0170). - Невстроенные инструкции (развёрнутые пользователями SBF-программы): каждой
выделяется
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200 000 ВЕ. - Мигрирующие встроенные инструкции, полностью переведённые на SBF (с фичей): считаются невстроенными (по 200 000 ВЕ на каждую).
Результат ограничивается значением MAX_COMPUTE_UNIT_LIMIT (1 400 000).
Вы можете переопределить это значение, добавив инструкцию
SetComputeUnitLimit
в свою транзакцию.
Чтобы определить подходящий лимит ВЕ:
- Смоделируйте транзакцию, чтобы измерить потребление ВЕ.
- Добавьте 10% запаса к полученному значению.
Приоритетная комиссия определяется по запрошенному лимиту вычислительных единиц в транзакции, а не по фактическому количеству использованных ВЕ. Если вы установите лимит слишком высоким или оставите значение по умолчанию, вы заплатите за неиспользованные вычислительные единицы.
Инструкции по вычислительному бюджету
Программа вычислительного бюджета
(ComputeBudget111111111111111111111111111111) содержит четыре инструкции.
| Вариант | Дискриминатор | Параметр | Тип | Описание |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Запрошенный размер кучи в байтах для каждой программы в транзакции |
SetComputeUnitLimit | 2 | units | u32 | Максимальное количество CU, которое может потребить транзакция |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Цена CU в микролампортах |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Максимальный общий объём данных аккаунта, который может быть загружен транзакцией |
Источник: перечисление ComputeBudgetInstruction
Ограничения и условия ошибок
Следующие правила применяются при обработке инструкций вычислительного бюджета:
- Одна на тип: допускается только одна инструкция каждого варианта в одной
транзакции. Включение дубликатов вызывает ошибку
DuplicateInstruction(вся транзакция отклоняется). RequestHeapFrame: значение должно быть междуMIN_HEAP_FRAME_BYTES(32 КиБ) иMAX_HEAP_FRAME_BYTES(256 КиБ) и должно быть кратным 1 024. В противном случае транзакция завершится ошибкойInvalidInstructionData. Размер кучи применяется ко всем программам, вызываемым в транзакции (включая CPI).SetComputeUnitLimit: допускается любое значениеu32. Фактический лимит ограниченMAX_COMPUTE_UNIT_LIMIT(1 400 000).SetComputeUnitPrice: допускается любое значениеu64(от 0 доu64::MAX).SetLoadedAccountsDataSizeLimit: значение должно быть больше 0 (NonZeroU32). Значение 0 вызываетInvalidLoadedAccountsDataSizeLimit. Фактический лимит ограниченMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 МиБ).- Неопознанные данные: любая инструкция, отправленная в программу
вычислительного бюджета, которая не десериализуется в известный вариант,
завершится ошибкой
InvalidInstructionData.
Модель стоимости планировщика, описанная ниже, относится к внутренней предварительной оценке стоимости выполнения у validator. Большинству разработчиков достаточно использовать инструкции compute budget, приведённые выше.
Модель стоимости планировщика
Планировщик validator (scheduler) использует модель стоимости для оценки использования ресурсов транзакцией до выполнения. Эти предварительные оценки стоимости определяют, помещается ли транзакция в оставшуюся ёмкость блока. Они отделены от учёта compute units (CU), который происходит во время выполнения.
Общая стоимость по модели планировщика — это сумма пяти компонентов
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Компоненты стоимости
| Компонент | Описание |
|---|---|
| Signature cost | Стоимость за каждую подпись по типу |
| Write lock cost | За каждый изменяемый аккаунт |
| Instruction data cost | По общему количеству байт instruction data |
| Programs execution cost | Лимит CU из compute budget или по умолчанию |
| Loaded accounts data cost | По общему размеру данных загруженных аккаунтов |
Все значения указаны в compute units.
Константы стоимости планировщика
| Константа | Значение |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 CU |
SECP256K1_VERIFY_COST | 6 690 CU |
ED25519_VERIFY_COST | 2 280 CU |
ED25519_VERIFY_STRICT_COST | 2 400 CU |
SECP256R1_VERIFY_COST | 4 800 CU |
WRITE_LOCK_UNITS | 300 CU |
INSTRUCTION_DATA_BYTES_COST | 4 |
Стоимость транзакции голосования
Транзакции голосования используют фиксированную стоимость 3 428 CU независимо от их фактического содержимого.
Лимиты блока
Планировщик применяет лимиты на блок. Если добавление транзакции превышает какой-либо лимит, она не включается в блок.
| Лимит | Значение |
|---|---|
MAX_BLOCK_UNITS | 60 000 000 |
MAX_WRITABLE_ACCOUNT_UNITS | 12 000 000 |
MAX_VOTE_UNITS | 36 000 000 |
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA | 100 МБ |
SIMD-0286
предлагает увеличить MAX_BLOCK_UNITS до 100 000 000.
Константы бюджета исполнения
Следующие константы из
execution_budget.rs
определяют лимиты времени выполнения при исполнении транзакций:
| Константа | Значение | Описание |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1 400 000 | Максимальный лимит CU на транзакцию |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200 000 | CU по умолчанию за не встроенную инструкцию |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3 000 | CU по умолчанию за встроенную инструкцию (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Стоимость одной страницы heap (32 КБ) |
DEFAULT_INVOCATION_COST | 1 000 CU | Стоимость одного вызова CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Стоимость вызова CPI с SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32 768 | Минимальный размер heap (32 КБ) |
MAX_HEAP_FRAME_BYTES | 262 144 | Максимальный размер heap (256 КБ) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67 108 864 | Максимальный объем данных аккаунта, загружаемых за транзакцию (64 МБ) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Максимальная глубина стека инструкций (top-level + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Максимальная глубина стека инструкций (top-level + CPI) с SIMD-0268 |
MAX_CALL_DEPTH | 64 | Максимальная глубина вызова SBF-to-SBF внутри программы |
STACK_FRAME_SIZE | 4 096 байт | Размер одного stack frame SBF |
Is this page helpful?