Yhteenveto
Oletuksena 200 000 CU:ta per ohje, maksimi 1,4 miljoonaa per transaktio. Käytä
SetComputeUnitLimit- ja SetComputeUnitPrice-ohjeita optimointiin.
Prioriteettimaksu perustuu pyydettyihin CU:ihin, ei todelliseen käyttöön.
Laskentayksikkörajoitus
Jokaiselle ohjeelle allokoidaan
oletuksena 200 000 CU:ta,
ja jokainen transaktio on rajoitettu
1 400 000 CU:hun.
Kun eksplisiittistä SetComputeUnitLimit-ohjetta ei ole läsnä,
oletusarvo lasketaan
ohjeen tyypin perusteella:
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)
- Sisäänrakennetut ohjeet (System Program, Stake, Vote jne., joita ei ole
siirretty SBF:ään): kullekin allokoidaan
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3 000 CU:ta (mukaan lukien SIMD-0170). - Ei-sisäänrakennetut ohjeet (käyttäjän julkaisemat SBF-ohjelmat): kullekin
allokoidaan
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200 000 CU:ta. - Siirtyvät sisäänrakennetut, jotka on siirretty SBF:ään (feature-gated): käsitellään ei-sisäänrakennettuina (200 000 CU:ta kullekin).
Tulos rajataan arvoon MAX_COMPUTE_UNIT_LIMIT (1 400 000).
Voit ohittaa tämän oletusarvon sisällyttämällä
SetComputeUnitLimit-ohjeen
transaktioon.
Sopivan CU-rajan määrittämiseksi:
- Simuloi transaktio CU-kulutuksen mittaamiseksi.
- Lisää 10 %:n turvamarginaali simuloituun arvoon.
Prioriteettimaksu määräytyy transaktion pyydetyn laskentayksikkörajoituksen perusteella, ei todellisten käytettyjen laskentayksiköiden perusteella. Jos asetat laskentayksikkörajoituksen liian korkeaksi tai käytät oletusmäärää, maksat käyttämättömistä laskentayksiköistä.
Laskentabudjetin ohjeet
Laskentabudjetin ohjelmassa
(ComputeBudget111111111111111111111111111111) on neljä ohjetta.
| Variantti | Erottelija | Parametri | Tyyppi | Kuvaus |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Pyydetty heap-koko tavuina jokaiselle transaktion ohjelmalle |
SetComputeUnitLimit | 2 | units | u32 | Maksimi CU-määrä, jonka transaktio voi kuluttaa |
SetComputeUnitPrice | 3 | micro_lamports | u64 | CU-hinta mikrolamporteissa |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Maksimi tavumäärä tilidataa, jonka transaktio voi ladata |
Lähde: ComputeBudgetInstruction enum
Rajoitukset ja virhetilanteet
Seuraavat säännöt pätevät laskentabudjetin ohjeiden käsittelyssä:
- Yksi per tyyppi: vain yksi kutakin ohjevarianttia sallitaan per
transaktio. Duplikaattien sisällyttäminen aiheuttaa
DuplicateInstruction-virheen (koko transaktio epäonnistuu). RequestHeapFrame: arvon on oltava välilläMIN_HEAP_FRAME_BYTES(32 KiB) jaMAX_HEAP_FRAME_BYTES(256 KiB), ja sen on oltava 1 024:n monikerta. Muussa tapauksessa transaktio epäonnistuuInvalidInstructionData-virheeseen. Heap-koko koskee jokaista transaktiossa kutsuttua ohjelmaa (mukaan lukien CPI:t).SetComputeUnitLimit: mikä tahansau32-arvo hyväksytään. Todellinen raja rajataan arvoonMAX_COMPUTE_UNIT_LIMIT(1 400 000).SetComputeUnitPrice: mikä tahansau64-arvo hyväksytään (0–u64::MAX).SetLoadedAccountsDataSizeLimit: arvon on oltava suurempi kuin 0 (NonZeroU32). Arvo 0 aiheuttaaInvalidLoadedAccountsDataSizeLimit-virheen. Todellinen raja rajataan arvoonMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB).- Tunnistamaton data: mikä tahansa laskentabudjetin ohjelmalle lähetetty
ohje, joka ei deserialisoidu tunnetuksi variantiksi, epäonnistuu
InvalidInstructionData-virheeseen.
Alla oleva ajoittimen kustannusmalli kuvaa validatorin sisäistä suoritusta edeltävää kustannusarviointia. Useimmat kehittäjät tarvitsevat vain yllä olevat laskentabudjetin ohjeet.
Ajoittimen kustannusmalli
Validatorin ajoitin käyttää kustannusmallia transaktion resurssien käytön arvioimiseen ennen suoritusta. Nämä suoritusta edeltävät kustannusarviot määrittävät, mahtuuko transaktio lohkon jäljellä olevaan kapasiteettiin. Ne ovat erillisiä suorituksen aikana tapahtuvasta CU-mittauksesta.
Ajoittimen kokonaiskustannus on viiden komponentin summa
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Kustannuskomponentit
| Komponentti | Kuvaus |
|---|---|
| Allekirjoituskustannus | Allekirjoituskohtainen kustannus kullekin allekirjoitustyypille |
| Kirjoituslukituskustannus | Kirjoitettavaa tiliä kohden |
| Instruction data -kustannus | Perustuu instruction data -tavujen kokonaismäärään |
| Ohjelmien suorituskustannus | CU-raja laskentabudjetista tai oletusarvo |
| Ladattujen tilien datakustannus | Perustuu ladattujen tilien datan kokonaiskokoon |
Kaikki arvot ovat laskentayksiköissä.
Ajoittimen kustannusvakiot
| Vakio | Arvo |
|---|---|
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 |
Äänestystransaktion kustannus
Äänestystransaktiot käyttävät staattista kustannusta 3 428 CU riippumatta niiden todellisesta sisällöstä.
Lohkorajat
Ajoitin valvoo lohkokohtaisia rajoja. Jos transaktion lisääminen ylittäisi jonkin rajan, sitä ei sisällytetä lohkoon.
| Rajoitus | Arvo |
|---|---|
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 Mt |
SIMD-0286
ehdottaa MAX_BLOCK_UNITS-arvon nostamista 100 000 000:aan.
Suoritubudjetin vakiot
Seuraavat vakiot tiedostosta
execution_budget.rs
määrittelevät ajonaikaiset rajoitukset transaktion suorituksen aikana:
| Vakio | Arvo | Kuvaus |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1 400 000 | Maksimi CU-raja per transaktio |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200 000 | Oletus-CU:t per ei-sisäänrakennettu käsky |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3 000 | Oletus-CU:t per sisäänrakennettu käsky (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU:ta | Hinta per 32 KiB heap-sivu |
DEFAULT_INVOCATION_COST | 1 000 CU:ta | Yhden CPI-kutsun hinta |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU:ta | CPI-kutsun hinta SIMD-0339:n kanssa |
MIN_HEAP_FRAME_BYTES | 32 768 | Pienin heap-koko (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262 144 | Suurin heap-koko (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67 108 864 | Maksimi ladattu tilidata per transaktio (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Maksimi käskypinon syvyys (ylätaso + CPI:t) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Maksimi käskypinon syvyys (ylätaso + CPI:t) SIMD-0268:n kanssa |
MAX_CALL_DEPTH | 64 | Maksimi SBF-SBF-kutsusyvyys ohjelman sisällä |
STACK_FRAME_SIZE | 4 096 tavua | Yhden SBF-pinokehyksen koko |
Is this page helpful?