Compute budget

Samenvatting

Standaard 200K CU's per instructie, 1,4M max per transactie. Gebruik SetComputeUnitLimit en SetComputeUnitPrice instructies om te optimaliseren. Prioriteitsfee is gebaseerd op aangevraagde CU's, niet op daadwerkelijk gebruik.

Compute unit-limiet

Elke instructie krijgt standaard 200.000 CU's toegewezen, en elke transactie is gelimiteerd tot 1.400.000 CU's. Wanneer er geen expliciete SetComputeUnitLimit-instructie aanwezig is, wordt de standaardwaarde berekend op basis van het instructietype:

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)
  • Builtin-instructies (System Program, Stake, Vote, etc. die nog niet zijn gemigreerd naar SBF): elk toegewezen MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3.000 CU's (volgens SIMD-0170).
  • Niet-builtin-instructies (door gebruikers geïmplementeerde SBF-programma's): elk toegewezen DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200.000 CU's.
  • Migrerende builtins die de migratie naar SBF hebben voltooid (feature-gated): behandeld als niet-builtin (200.000 CU's elk).

Het resultaat wordt begrensd tot MAX_COMPUTE_UNIT_LIMIT (1.400.000).

Je kunt deze standaardwaarde overschrijven door een SetComputeUnitLimit-instructie in je transactie op te nemen.

Om de juiste CU-limiet te bepalen:

  1. Simuleer de transactie om het CU-verbruik te meten.
  2. Voeg een veiligheidsmarge van 10% toe aan de gesimuleerde waarde.

De prioriteitsfee wordt bepaald door de aangevraagde compute unit-limiet op de transactie, niet door het daadwerkelijke aantal gebruikte compute units. Als je een compute unit-limiet instelt die te hoog is of de standaardhoeveelheid gebruikt, betaal je voor ongebruikte compute units.

Compute budget instructies

Het Compute Budget Program (ComputeBudget111111111111111111111111111111) heeft vier instructies.

VariantDiscriminatorParameterTypeBeschrijving
RequestHeapFrame1bytesu32Gevraagde heap-grootte in bytes voor elk programma in de transactie
SetComputeUnitLimit2unitsu32Maximale CU's die de transactie mag verbruiken
SetComputeUnitPrice3micro_lamportsu64CU-prijs in micro-lamports
SetLoadedAccountsDataSizeLimit4bytesu32Maximale totale bytes aan accountgegevens die de transactie mag laden

Bron: ComputeBudgetInstruction enum

Beperkingen en foutcondities

De volgende regels zijn van toepassing bij het verwerken van compute budget instructies:

  • Eén per type: slechts één van elke instructievariant is toegestaan per transactie. Het opnemen van duplicaten veroorzaakt een DuplicateInstruction fout (de gehele transactie mislukt).
  • RequestHeapFrame: de waarde moet tussen MIN_HEAP_FRAME_BYTES (32 KiB) en MAX_HEAP_FRAME_BYTES (256 KiB) liggen, en moet een veelvoud van 1.024 zijn. Anders mislukt de transactie met InvalidInstructionData. De heap-grootte is van toepassing op elk programma dat in de transactie wordt aangeroepen (inclusief CPI's).
  • SetComputeUnitLimit: elke u32 waarde wordt geaccepteerd. De effectieve limiet wordt begrensd tot MAX_COMPUTE_UNIT_LIMIT (1.400.000).
  • SetComputeUnitPrice: elke u64 waarde wordt geaccepteerd (0 tot u64::MAX).
  • SetLoadedAccountsDataSizeLimit: de waarde moet groter zijn dan 0 (NonZeroU32). Een waarde van 0 veroorzaakt InvalidLoadedAccountsDataSizeLimit. De effectieve limiet wordt begrensd tot MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 MiB).
  • Onherkende gegevens: elke instructie die naar het Compute Budget Program wordt gestuurd en niet kan worden gedeserialiseerd naar een bekende variant, mislukt met InvalidInstructionData.

Het onderstaande scheduler-kostenmodel beschrijft de validator-interne pre-executie kostenschatting. De meeste ontwikkelaars hebben alleen de bovenstaande compute budget instructies nodig.

Scheduler-kostenmodel

De validator's scheduler gebruikt een kostenmodel om het resourcegebruik van transacties te schatten vóór uitvoering. Deze pre-executie kostenschattingen bepalen of een transactie past binnen de resterende capaciteit van het blok. Ze zijn gescheiden van de CU-meting die plaatsvindt tijdens uitvoering.

De totale scheduler-kosten zijn de som van vijf componenten (UsageCostDetails::sum):

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

Kostencomponenten

ComponentBeschrijving
HandtekeningkostenKosten per handtekening voor elk handtekeningtype
Write lock-kostenPer schrijfbaar account
Instruction data-kostenGebaseerd op totaal aantal instruction data bytes
Programma-uitvoeringskostenCU-limiet van compute budget of standaardwaarde
Geladen accountdata-kostenGebaseerd op totale grootte van geladen accountdata

Alle waarden zijn in compute units.

Scheduler-kostenconstanten

Stemtransactiekosten

Stemtransacties gebruiken statische kosten van 3.428 CU's ongeacht hun daadwerkelijke inhoud.

Bloklimieten

De scheduler handhaaft limieten per blok. Als het toevoegen van een transactie een limiet zou overschrijden, wordt deze niet opgenomen in het blok.

SIMD-0286 stelt voor om MAX_BLOCK_UNITS te verhogen naar 100.000.000.

Uitvoeringsbudgetconstanten

De volgende constanten uit execution_budget.rs definiëren runtime-limieten tijdens transactie-uitvoering:

ConstanteWaardeBeschrijving
MAX_COMPUTE_UNIT_LIMIT1.400.000Maximale CU-limiet per transactie
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200.000Standaard CU's per niet-builtin instructie
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3.000Standaard CU's per builtin instructie (SIMD-0170)
DEFAULT_HEAP_COST8 CU'sKosten per 32 KiB heap-pagina
DEFAULT_INVOCATION_COST1.000 CU'sKosten van één CPI-aanroep
INVOKE_UNITS_COST_SIMD_0339946 CU'sCPI-aanroepkosten met SIMD-0339
MIN_HEAP_FRAME_BYTES32.768Minimale heap-grootte (32 KiB)
MAX_HEAP_FRAME_BYTES262.144Maximale heap-grootte (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67.108.864Maximale geladen accountgegevens per transactie (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Maximale instructiestackdiepte (top-level + CPI's)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Maximale instructiestackdiepte (top-level + CPI's) met SIMD-0268
MAX_CALL_DEPTH64Maximale SBF-naar-SBF aanroepdiepte binnen een programma
STACK_FRAME_SIZE4.096 bytesGrootte van één SBF-stackframe

Is this page helpful?

Inhoudsopgave

Pagina Bewerken

Beheerd door

© 2026 Solana Foundation.
Alle rechten voorbehouden.
Blijf Verbonden