Обчислювальний бюджет

Підсумок

За замовчуванням 200 тис. CU на інструкцію, максимум 1,4 млн на транзакцію. Використовуйте інструкції SetComputeUnitLimit та SetComputeUnitPrice для оптимізації. Пріоритетна комісія базується на запитаних CU, а не на фактичному використанні.

Ліміт обчислювальних одиниць

Кожній інструкції виділяється за замовчуванням 200 000 CU, а кожна транзакція обмежена 1 400 000 CU. Коли явна інструкція 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 = 3000 CU (згідно з SIMD-0170).
  • Невбудовані інструкції (розгорнуті користувачем SBF-програми): кожній виділяється DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200 000 CU.
  • Вбудовані програми, що мігрують, які завершили міграцію до SBF (керовані feature-flag): розглядаються як невбудовані (по 200 000 CU кожна).

Результат обмежується значенням MAX_COMPUTE_UNIT_LIMIT (1 400 000).

Ви можете перевизначити це значення за замовчуванням, включивши інструкцію SetComputeUnitLimit у вашу транзакцію.

Щоб визначити відповідний ліміт CU:

  1. Симулюйте транзакцію для вимірювання споживання CU.
  2. Додайте 10% запасу безпеки до симульованого значення.

Пріоритетна комісія визначається запитаним лімітом обчислювальних одиниць у транзакції, а не фактичною кількістю використаних обчислювальних одиниць. Якщо ви встановите ліміт обчислювальних одиниць занадто високим або використаєте значення за замовчуванням, ви платите за невикористані обчислювальні одиниці.

Інструкції бюджету обчислень

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

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

Джерело: enum ComputeBudgetInstruction

Обмеження та умови помилок

Наступні правила застосовуються під час обробки інструкцій бюджету обчислень:

  • Один на тип: дозволено лише один екземпляр кожного варіанту інструкції на транзакцію. Включення дублікатів викликає помилку DuplicateInstruction (вся транзакція не виконується).
  • RequestHeapFrame: значення має бути між MIN_HEAP_FRAME_BYTES (32 КіБ) та MAX_HEAP_FRAME_BYTES (256 КіБ), і має бути кратним 1024. Інакше транзакція не виконується з помилкою 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.

Модель вартості планувальника, описана нижче, стосується внутрішньої оцінки вартості валідатора перед виконанням. Більшості розробників потрібні лише інструкції обчислювального бюджету, описані вище.

Модель вартості планувальника

Планувальник валідатора використовує модель вартості для оцінки використання ресурсів транзакції перед виконанням. Ці оцінки вартості перед виконанням визначають, чи вміщується транзакція в межах залишкової ємності блоку. Вони є окремими від вимірювання обчислювальних одиниць (CU), що відбувається під час виконання.

Загальна вартість планувальника є сумою п'яти компонентів (UsageCostDetails::sum):

Scheduler cost formula
total_cost = signature_cost
+ write_lock_cost
+ data_bytes_cost
+ programs_execution_cost
+ loaded_accounts_data_size_cost

Компоненти вартості

КомпонентОпис
Вартість підписуВартість за кожен тип підпису
Вартість блокування записуЗа кожен акаунт для запису
Вартість instruction dataНа основі загальної кількості байтів instruction data
Вартість виконання програмЛіміт CU з обчислювального бюджету або за замовчуванням
Вартість завантажених даних акаунтівНа основі загального розміру завантажених даних акаунтів

Усі значення вказані в обчислювальних одиницях.

Константи вартості планувальника

Вартість транзакції голосування

Транзакції голосування використовують статичну вартість 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Максимальна глибина стеку інструкцій (верхній рівень + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Максимальна глибина стеку інструкцій (верхній рівень + CPI) з SIMD-0268
MAX_CALL_DEPTH64Максимальна глибина викликів SBF-to-SBF всередині програми
STACK_FRAME_SIZE4,096 байтівРозмір одного фрейму стеку SBF

Is this page helpful?

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку