Laskentabudjetti

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 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)
  • 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:

  1. Simuloi transaktio CU-kulutuksen mittaamiseksi.
  2. 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.

VarianttiErottelijaParametriTyyppiKuvaus
RequestHeapFrame1bytesu32Pyydetty heap-koko tavuina jokaiselle transaktion ohjelmalle
SetComputeUnitLimit2unitsu32Maksimi CU-määrä, jonka transaktio voi kuluttaa
SetComputeUnitPrice3micro_lamportsu64CU-hinta mikrolamporteissa
SetLoadedAccountsDataSizeLimit4bytesu32Maksimi 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) ja MAX_HEAP_FRAME_BYTES (256 KiB), ja sen on oltava 1 024:n monikerta. Muussa tapauksessa transaktio epäonnistuu InvalidInstructionData-virheeseen. Heap-koko koskee jokaista transaktiossa kutsuttua ohjelmaa (mukaan lukien CPI:t).
  • SetComputeUnitLimit: mikä tahansa u32-arvo hyväksytään. Todellinen raja rajataan arvoon MAX_COMPUTE_UNIT_LIMIT (1 400 000).
  • SetComputeUnitPrice: mikä tahansa u64-arvo hyväksytään (0–u64::MAX).
  • SetLoadedAccountsDataSizeLimit: arvon on oltava suurempi kuin 0 (NonZeroU32). Arvo 0 aiheuttaa InvalidLoadedAccountsDataSizeLimit-virheen. Todellinen raja rajataan arvoon MAX_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):

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

Kustannuskomponentit

KomponenttiKuvaus
AllekirjoituskustannusAllekirjoituskohtainen kustannus kullekin allekirjoitustyypille
KirjoituslukituskustannusKirjoitettavaa tiliä kohden
Instruction data -kustannusPerustuu instruction data -tavujen kokonaismäärään
Ohjelmien suorituskustannusCU-raja laskentabudjetista tai oletusarvo
Ladattujen tilien datakustannusPerustuu ladattujen tilien datan kokonaiskokoon

Kaikki arvot ovat laskentayksiköissä.

Ajoittimen kustannusvakiot

Ää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.

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:

VakioArvoKuvaus
MAX_COMPUTE_UNIT_LIMIT1 400 000Maksimi CU-raja per transaktio
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200 000Oletus-CU:t per ei-sisäänrakennettu käsky
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3 000Oletus-CU:t per sisäänrakennettu käsky (SIMD-0170)
DEFAULT_HEAP_COST8 CU:taHinta per 32 KiB heap-sivu
DEFAULT_INVOCATION_COST1 000 CU:taYhden CPI-kutsun hinta
INVOKE_UNITS_COST_SIMD_0339946 CU:taCPI-kutsun hinta SIMD-0339:n kanssa
MIN_HEAP_FRAME_BYTES32 768Pienin heap-koko (32 KiB)
MAX_HEAP_FRAME_BYTES262 144Suurin heap-koko (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67 108 864Maksimi ladattu tilidata per transaktio (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Maksimi käskypinon syvyys (ylätaso + CPI:t)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Maksimi käskypinon syvyys (ylätaso + CPI:t) SIMD-0268:n kanssa
MAX_CALL_DEPTH64Maksimi SBF-SBF-kutsusyvyys ohjelman sisällä
STACK_FRAME_SIZE4 096 tavuaYhden SBF-pinokehyksen koko

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä