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

Кратко

По умолчанию 200 000 ВЕ на инструкцию, максимум 1,4 млн на транзакцию. Используйте инструкции SetComputeUnitLimit и SetComputeUnitPrice для оптимизации. Приоритетная комиссия рассчитывается исходя из запрошенного количества ВЕ, а не фактического использования.

Лимит вычислительных единиц

Каждой инструкции выделяется по умолчанию 200 000 ВЕ, а на каждую транзакцию установлен предел в 1 400 000 ВЕ. Если явная инструкция SetComputeUnitLimit отсутствует, значение по умолчанию рассчитывается в зависимости от типа инструкции:

Default CU limit calculation
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 в свою транзакцию.

Чтобы определить подходящий лимит ВЕ:

  1. Смоделируйте транзакцию, чтобы измерить потребление ВЕ.
  2. Добавьте 10% запаса к полученному значению.

Приоритетная комиссия определяется по запрошенному лимиту вычислительных единиц в транзакции, а не по фактическому количеству использованных ВЕ. Если вы установите лимит слишком высоким или оставите значение по умолчанию, вы заплатите за неиспользованные вычислительные единицы.

Инструкции по вычислительному бюджету

Программа вычислительного бюджета (ComputeBudget111111111111111111111111111111) содержит четыре инструкции.

ВариантДискриминаторПараметрТипОписание
RequestHeapFrame1bytesu32Запрошенный размер кучи в байтах для каждой программы в транзакции
SetComputeUnitLimit2unitsu32Максимальное количество CU, которое может потребить транзакция
SetComputeUnitPrice3micro_lamportsu64Цена CU в микролампортах
SetLoadedAccountsDataSizeLimit4bytesu32Максимальный общий объём данных аккаунта, который может быть загружен транзакцией

Источник: перечисление 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):

Scheduler cost formula
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.

Константы стоимости планировщика

Стоимость транзакции голосования

Транзакции голосования используют фиксированную стоимость 3 428 CU независимо от их фактического содержимого.

Лимиты блока

Планировщик применяет лимиты на блок. Если добавление транзакции превышает какой-либо лимит, она не включается в блок.

ЛимитЗначение
MAX_BLOCK_UNITS60 000 000
MAX_WRITABLE_ACCOUNT_UNITS12 000 000
MAX_VOTE_UNITS36 000 000
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA100 МБ

SIMD-0286 предлагает увеличить MAX_BLOCK_UNITS до 100 000 000.

Константы бюджета исполнения

Следующие константы из execution_budget.rs определяют лимиты времени выполнения при исполнении транзакций:

КонстантаЗначениеОписание
MAX_COMPUTE_UNIT_LIMIT1 400 000Максимальный лимит CU на транзакцию
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200 000CU по умолчанию за не встроенную инструкцию
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3 000CU по умолчанию за встроенную инструкцию (SIMD-0170)
DEFAULT_HEAP_COST8 CUСтоимость одной страницы heap (32 КБ)
DEFAULT_INVOCATION_COST1 000 CUСтоимость одного вызова CPI
INVOKE_UNITS_COST_SIMD_0339946 CUСтоимость вызова CPI с SIMD-0339
MIN_HEAP_FRAME_BYTES32 768Минимальный размер heap (32 КБ)
MAX_HEAP_FRAME_BYTES262 144Максимальный размер heap (256 КБ)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67 108 864Максимальный объем данных аккаунта, загружаемых за транзакцию (64 МБ)
MAX_INSTRUCTION_STACK_DEPTH5Максимальная глубина стека инструкций (top-level + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Максимальная глубина стека инструкций (top-level + CPI) с SIMD-0268
MAX_CALL_DEPTH64Максимальная глубина вызова SBF-to-SBF внутри программы
STACK_FRAME_SIZE4 096 байтРазмер одного stack frame SBF

Is this page helpful?

Управляется

© 2026 Solana Foundation.
Все права защищены.
Связаться с нами