Підсумок
За замовчуванням 200 тис. CU на інструкцію, максимум 1,4 млн на транзакцію.
Використовуйте інструкції SetComputeUnitLimit та SetComputeUnitPrice для
оптимізації. Пріоритетна комісія базується на запитаних CU, а не на фактичному
використанні.
Ліміт обчислювальних одиниць
Кожній інструкції виділяється
за замовчуванням 200 000 CU,
а кожна транзакція обмежена
1 400 000 CU.
Коли явна інструкція 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= 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:
- Симулюйте транзакцію для вимірювання споживання CU.
- Додайте 10% запасу безпеки до симульованого значення.
Пріоритетна комісія визначається запитаним лімітом обчислювальних одиниць у транзакції, а не фактичною кількістю використаних обчислювальних одиниць. Якщо ви встановите ліміт обчислювальних одиниць занадто високим або використаєте значення за замовчуванням, ви платите за невикористані обчислювальні одиниці.
Інструкції бюджету обчислень
Програма бюджету обчислень
(ComputeBudget111111111111111111111111111111) має чотири інструкції.
| Варіант | Дискримінатор | Параметр | Тип | Опис |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Запитуваний розмір купи в байтах для кожної програми в транзакції |
SetComputeUnitLimit | 2 | units | u32 | Максимальна кількість CU, яку може спожити транзакція |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Ціна CU в мікро-лампортах |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Максимальна загальна кількість байтів даних акаунтів, які може завантажити транзакція |
Джерело: 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):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Компоненти вартості
| Компонент | Опис |
|---|---|
| Вартість підпису | Вартість за кожен тип підпису |
| Вартість блокування запису | За кожен акаунт для запису |
| Вартість instruction data | На основі загальної кількості байтів instruction data |
| Вартість виконання програм | Ліміт CU з обчислювального бюджету або за замовчуванням |
| Вартість завантажених даних акаунтів | На основі загального розміру завантажених даних акаунтів |
Усі значення вказані в обчислювальних одиницях.
Константи вартості планувальника
| Константа | Значення |
|---|---|
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 | Максимальна глибина стеку інструкцій (верхній рівень + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Максимальна глибина стеку інструкцій (верхній рівень + CPI) з SIMD-0268 |
MAX_CALL_DEPTH | 64 | Максимальна глибина викликів SBF-to-SBF всередині програми |
STACK_FRAME_SIZE | 4,096 байтів | Розмір одного фрейму стеку SBF |
Is this page helpful?