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 = (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:
- Simuleer de transactie om het CU-verbruik te meten.
- 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.
| Variant | Discriminator | Parameter | Type | Beschrijving |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Gevraagde heap-grootte in bytes voor elk programma in de transactie |
SetComputeUnitLimit | 2 | units | u32 | Maximale CU's die de transactie mag verbruiken |
SetComputeUnitPrice | 3 | micro_lamports | u64 | CU-prijs in micro-lamports |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Maximale 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
DuplicateInstructionfout (de gehele transactie mislukt). RequestHeapFrame: de waarde moet tussenMIN_HEAP_FRAME_BYTES(32 KiB) enMAX_HEAP_FRAME_BYTES(256 KiB) liggen, en moet een veelvoud van 1.024 zijn. Anders mislukt de transactie metInvalidInstructionData. De heap-grootte is van toepassing op elk programma dat in de transactie wordt aangeroepen (inclusief CPI's).SetComputeUnitLimit: elkeu32waarde wordt geaccepteerd. De effectieve limiet wordt begrensd totMAX_COMPUTE_UNIT_LIMIT(1.400.000).SetComputeUnitPrice: elkeu64waarde wordt geaccepteerd (0 totu64::MAX).SetLoadedAccountsDataSizeLimit: de waarde moet groter zijn dan 0 (NonZeroU32). Een waarde van 0 veroorzaaktInvalidLoadedAccountsDataSizeLimit. De effectieve limiet wordt begrensd totMAX_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):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Kostencomponenten
| Component | Beschrijving |
|---|---|
| Handtekeningkosten | Kosten per handtekening voor elk handtekeningtype |
| Write lock-kosten | Per schrijfbaar account |
| Instruction data-kosten | Gebaseerd op totaal aantal instruction data bytes |
| Programma-uitvoeringskosten | CU-limiet van compute budget of standaardwaarde |
| Geladen accountdata-kosten | Gebaseerd op totale grootte van geladen accountdata |
Alle waarden zijn in compute units.
Scheduler-kostenconstanten
| Constante | Waarde |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 CU's |
SECP256K1_VERIFY_COST | 6.690 CU's |
ED25519_VERIFY_COST | 2.280 CU's |
ED25519_VERIFY_STRICT_COST | 2.400 CU's |
SECP256R1_VERIFY_COST | 4.800 CU's |
WRITE_LOCK_UNITS | 300 CU's |
INSTRUCTION_DATA_BYTES_COST | 4 |
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.
| Limiet | Waarde |
|---|---|
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
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:
| Constante | Waarde | Beschrijving |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1.400.000 | Maximale CU-limiet per transactie |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200.000 | Standaard CU's per niet-builtin instructie |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3.000 | Standaard CU's per builtin instructie (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU's | Kosten per 32 KiB heap-pagina |
DEFAULT_INVOCATION_COST | 1.000 CU's | Kosten van één CPI-aanroep |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU's | CPI-aanroepkosten met SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32.768 | Minimale heap-grootte (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262.144 | Maximale heap-grootte (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67.108.864 | Maximale geladen accountgegevens per transactie (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Maximale instructiestackdiepte (top-level + CPI's) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Maximale instructiestackdiepte (top-level + CPI's) met SIMD-0268 |
MAX_CALL_DEPTH | 64 | Maximale SBF-naar-SBF aanroepdiepte binnen een programma |
STACK_FRAME_SIZE | 4.096 bytes | Grootte van één SBF-stackframe |
Is this page helpful?