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 = (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:
- Zasymuluj transakcję, aby zmierzyć zużycie CU.
- 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.
| Wariant | Dyskryminator | Parametr | Typ | Opis |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Żądany rozmiar sterty w bajtach dla każdego programu w transakcji |
SetComputeUnitLimit | 2 | units | u32 | Maksymalna liczba CU, jaką może zużyć transakcja |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Cena CU w mikro-lamportach |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Maksymalna łą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 odMIN_HEAP_FRAME_BYTES(32 KiB) doMAX_HEAP_FRAME_BYTES(256 KiB) i być wielokrotnością 1 024. W przeciwnym razie transakcja zostanie odrzucona z błędemInvalidInstructionData. Rozmiar sterty dotyczy każdego programu wywoływanego w transakcji (w tym CPI).SetComputeUnitLimit: akceptowana jest dowolna wartośću32. Efektywny limit jest ograniczony doMAX_COMPUTE_UNIT_LIMIT(1 400 000).SetComputeUnitPrice: akceptowana jest dowolna wartośću64(od 0 dou64::MAX).SetLoadedAccountsDataSizeLimit: wartość musi być większa niż 0 (NonZeroU32). Wartość 0 powodujeInvalidLoadedAccountsDataSizeLimit. Efektywny limit jest ograniczony doMAX_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):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Składniki kosztów
| Składnik | Opis |
|---|---|
| Signature cost | Koszt za każdy typ podpisu |
| Write lock cost | Za każde zapisywalne konto |
| Instruction data cost | Na podstawie łącznej liczby bajtów instruction data |
| Programs execution cost | Limit CU z compute budget lub domyślny |
| Loaded accounts data cost | Na podstawie łącznego rozmiaru danych załadowanych kont |
Wszystkie wartości podawane są w jednostkach obliczeniowych (compute units).
Stałe kosztów scheduler'a
| Stała | Wartość |
|---|---|
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 |
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.
| Limit | Wartość |
|---|---|
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 MB |
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ła | Wartość | Opis |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1 400 000 | Maksymalny limit CU na transakcję |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200 000 | Domyślna liczba CU na instrukcję niebędącą wbudowaną |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3 000 | Domyślna liczba CU na instrukcję wbudowaną (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Koszt za stronę sterty 32 KiB |
DEFAULT_INVOCATION_COST | 1 000 CU | Koszt jednego wywołania CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Koszt wywołania CPI z SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32 768 | Minimalny rozmiar sterty (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262 144 | Maksymalny rozmiar sterty (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67 108 864 | Maksymalna załadowana ilość danych konta na transakcję (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Maksymalna głębokość stosu instrukcji (top-level + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Maksymalna głębokość stosu instrukcji (top-level + CPI) z SIMD-0268 |
MAX_CALL_DEPTH | 64 | Maksymalna głębokość wywołań SBF-to-SBF w ramach programu |
STACK_FRAME_SIZE | 4 096 bajtów | Rozmiar jednej ramki stosu SBF |
Is this page helpful?