Budżet obliczeniowy

Podsumowanie

Domyślnie 200 tys. CU na instrukcję, maksymalnie 1,4 mln na transakcję. Użyj SetComputeUnitLimit oraz SetComputeUnitPrice, aby zoptymalizować. Opłata priorytetowa zależy od żądanej liczby CU, a nie od faktycznego zużycia.

Limit jednostek obliczeniowych

Każda instrukcja otrzymuje domyślnie 200 000 CU, a każda transakcja jest ograniczona do 1 400 000 CU. Gdy nie ma jawnej instrukcji SetComputeUnitLimit, domyślna wartość jest wyliczana w zależności od typu instrukcji:

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)
  • Instrukcje wbudowane (System Program, Stake, Vote itd., które nie zostały zmigrowane do SBF): każda otrzymuje MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3 000 CU (zgodnie z SIMD-0170).
  • Instrukcje niewbudowane (programy SBF wdrożone przez użytkowników): każda otrzymuje DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200 000 CU.
  • Wbudowane w trakcie migracji, które zakończyły migrację do SBF (feature-gated): traktowane jak niewbudowane (200 000 CU każda).

Wynik jest ograniczany do MAX_COMPUTE_UNIT_LIMIT (1 400 000).

Możesz nadpisać tę wartość domyślną, dodając instrukcję SetComputeUnitLimit do swojej transakcji.

Aby określić odpowiedni limit CU:

  1. Zasymuluj transakcję, aby zmierzyć zużycie CU.
  2. Dodaj 10% marginesu bezpieczeństwa do uzyskanej wartości.

Opłata priorytetowa jest ustalana na podstawie żądanego limitu jednostek obliczeniowych w transakcji, nie faktycznej liczby zużytych jednostek. Jeśli ustawisz limit zbyt wysoki lub użyjesz domyślnej wartości, zapłacisz za niewykorzystane jednostki.

Instrukcje budżetu obliczeniowego

Compute Budget Program (ComputeBudget111111111111111111111111111111) zawiera cztery instrukcje.

WariantDyskryminatorParametrTypOpis
RequestHeapFrame1bytesu32Żądany rozmiar sterty w bajtach dla każdego programu w transakcji
SetComputeUnitLimit2unitsu32Maksymalna liczba CU, jaką może zużyć transakcja
SetComputeUnitPrice3micro_lamportsu64Cena CU w mikro-lamportach
SetLoadedAccountsDataSizeLimit4bytesu32Maksymalna łączna liczba bajtów danych kont, które może załadować transakcja

Źródło: enum ComputeBudgetInstruction

Ograniczenia i warunki błędów

Poniższe zasady obowiązują podczas przetwarzania instrukcji budżetu obliczeniowego:

  • Jedna na typ: dozwolona jest tylko jedna instrukcja danego wariantu na transakcję. Dodanie duplikatów powoduje błąd DuplicateInstruction (cała transakcja zostaje odrzucona).
  • RequestHeapFrame: wartość musi mieścić się w zakresie od MIN_HEAP_FRAME_BYTES (32 KiB) do MAX_HEAP_FRAME_BYTES (256 KiB) i być wielokrotnością 1 024. W przeciwnym razie transakcja zostanie odrzucona z błędem InvalidInstructionData. Rozmiar sterty dotyczy każdego programu wywoływanego w transakcji (w tym CPI).
  • SetComputeUnitLimit: akceptowana jest dowolna wartość u32. Efektywny limit jest ograniczony do MAX_COMPUTE_UNIT_LIMIT (1 400 000).
  • SetComputeUnitPrice: akceptowana jest dowolna wartość u64 (od 0 do u64::MAX).
  • SetLoadedAccountsDataSizeLimit: wartość musi być większa niż 0 (NonZeroU32). Wartość 0 powoduje InvalidLoadedAccountsDataSizeLimit. Efektywny limit jest ograniczony do MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 MiB).
  • Nierozpoznane dane: każda instrukcja wysłana do Compute Budget Program, która nie deserializuje się do znanego wariantu, kończy się błędem InvalidInstructionData.

Model kosztów scheduler'a opisany poniżej dotyczy wewnętrznej, przedwykonawczej estymacji kosztów przez validatora. Większość deweloperów potrzebuje jedynie instrukcji budżetu obliczeniowego opisanych powyżej.

Model kosztów scheduler'a

Validator używa scheduler'a oraz modelu kosztów do szacowania zużycia zasobów przez transakcję przed jej wykonaniem. Te przedwykonawcze estymacje kosztów określają, czy transakcja mieści się w pozostałej pojemności bloku. Są one niezależne od mierzenia CU, które odbywa się podczas wykonania.

Całkowity koszt scheduler'a to suma pięciu składników (UsageCostDetails::sum):

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

Składniki kosztów

SkładnikOpis
Signature costKoszt za każdy typ podpisu
Write lock costZa każde zapisywalne konto
Instruction data costNa podstawie łącznej liczby bajtów instruction data
Programs execution costLimit CU z compute budget lub domyślny
Loaded accounts data costNa podstawie łącznego rozmiaru danych załadowanych kont

Wszystkie wartości podawane są w jednostkach obliczeniowych (compute units).

Stałe kosztów scheduler'a

Koszt transakcji głosujących

Transakcje głosujące używają stałego kosztu 3 428 CU niezależnie od ich faktycznej zawartości.

Limity bloku

Scheduler wymusza limity na blok. Jeśli dodanie transakcji przekroczyłoby którykolwiek z limitów, nie zostanie ona uwzględniona w bloku.

SIMD-0286 proponuje zwiększenie MAX_BLOCK_UNITS do 100 000 000.

Stałe budżetu wykonania

Następujące stałe z pliku execution_budget.rs definiują limity środowiska wykonawczego podczas realizacji transakcji:

StałaWartośćOpis
MAX_COMPUTE_UNIT_LIMIT1 400 000Maksymalny limit CU na transakcję
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200 000Domyślna liczba CU na instrukcję niebędącą wbudowaną
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3 000Domyślna liczba CU na instrukcję wbudowaną (SIMD-0170)
DEFAULT_HEAP_COST8 CUKoszt za stronę sterty 32 KiB
DEFAULT_INVOCATION_COST1 000 CUKoszt jednego wywołania CPI
INVOKE_UNITS_COST_SIMD_0339946 CUKoszt wywołania CPI z SIMD-0339
MIN_HEAP_FRAME_BYTES32 768Minimalny rozmiar sterty (32 KiB)
MAX_HEAP_FRAME_BYTES262 144Maksymalny rozmiar sterty (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67 108 864Maksymalna załadowana ilość danych konta na transakcję (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Maksymalna głębokość stosu instrukcji (top-level + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Maksymalna głębokość stosu instrukcji (top-level + CPI) z SIMD-0268
MAX_CALL_DEPTH64Maksymalna głębokość wywołań SBF-to-SBF w ramach programu
STACK_FRAME_SIZE4 096 bajtówRozmiar jednej ramki stosu SBF

Is this page helpful?

Spis treści

Edytuj stronę

Zarządzane przez

© 2026 Solana Foundation.
Wszelkie prawa zastrzeżone.
Bądź na bieżąco