Riepilogo
200K CU predefinite per istruzione, massimo 1,4M per transazione. Usa le
istruzioni SetComputeUnitLimit e SetComputeUnitPrice per ottimizzare. La
commissione prioritaria si basa sulle CU richieste, non sull'utilizzo
effettivo.
Limite delle unità di calcolo
A ogni istruzione viene allocato un
valore predefinito di 200.000 CU,
e ogni transazione ha un limite massimo di
1.400.000 CU.
Quando non è presente un'istruzione esplicita SetComputeUnitLimit, il
valore predefinito viene calcolato
in base al tipo di istruzione:
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)
- Istruzioni builtin (System Program, Stake, Vote, ecc. che non sono state
migrate a SBF): a ciascuna vengono allocate
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3.000 CU (secondo SIMD-0170). - Istruzioni non builtin (programmi SBF distribuiti dall'utente): a ciascuna
vengono allocate
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200.000 CU. - Builtin in migrazione che hanno completato la migrazione a SBF (controllati da feature flag): trattati come non builtin (200.000 CU ciascuno).
Il risultato viene limitato a MAX_COMPUTE_UNIT_LIMIT (1.400.000).
Puoi sovrascrivere questo valore predefinito includendo un'istruzione
SetComputeUnitLimit
nella tua transazione.
Per determinare il limite di CU appropriato:
- Simula la transazione per misurare il consumo di CU.
- Aggiungi un margine di sicurezza del 10% al valore simulato.
La commissione prioritaria è determinata dal limite di unità di calcolo richiesto nella transazione, non dal numero effettivo di unità di calcolo utilizzate. Se imposti un limite di unità di calcolo troppo alto o usi l'importo predefinito, paghi per unità di calcolo non utilizzate.
Istruzioni del budget di calcolo
Il
Compute Budget Program
(ComputeBudget111111111111111111111111111111) ha quattro istruzioni.
| Variante | Discriminatore | Parametro | Tipo | Descrizione |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Dimensione heap richiesta in byte per ogni programma nella transazione |
SetComputeUnitLimit | 2 | units | u32 | CU massime che la transazione può consumare |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Prezzo CU in micro-lamport |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Byte totali massimi di dati account che la transazione può caricare |
Fonte: enum ComputeBudgetInstruction
Vincoli e condizioni di errore
Le seguenti regole si applicano durante l'elaborazione delle istruzioni del budget di calcolo:
- Una per tipo: è consentita solo una di ciascuna variante di istruzione per
transazione. L'inclusione di duplicati causa un errore
DuplicateInstruction(l'intera transazione fallisce). RequestHeapFrame: il valore deve essere compreso traMIN_HEAP_FRAME_BYTES(32 KiB) eMAX_HEAP_FRAME_BYTES(256 KiB), e deve essere un multiplo di 1.024. Altrimenti la transazione fallisce conInvalidInstructionData. La dimensione heap si applica a ogni programma invocato nella transazione (inclusi i CPI).SetComputeUnitLimit: qualsiasi valoreu32è accettato. Il limite effettivo è limitato aMAX_COMPUTE_UNIT_LIMIT(1.400.000).SetComputeUnitPrice: qualsiasi valoreu64è accettato (da 0 au64::MAX).SetLoadedAccountsDataSizeLimit: il valore deve essere maggiore di 0 (NonZeroU32). Un valore di 0 causaInvalidLoadedAccountsDataSizeLimit. Il limite effettivo è limitato aMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB).- Dati non riconosciuti: qualsiasi istruzione inviata al Compute Budget
Program che non viene deserializzata in una variante nota fallisce con
InvalidInstructionData.
Il modello di costo dello scheduler descritto di seguito descrive la stima dei costi pre-esecuzione interna del validator. La maggior parte degli sviluppatori necessita solo delle istruzioni del budget di calcolo sopra riportate.
Modello di costo dello scheduler
Lo scheduler del validator utilizza un modello di costo per stimare l'utilizzo delle risorse della transazione prima dell'esecuzione. Queste stime dei costi pre-esecuzione determinano se una transazione rientra nella capacità rimanente del blocco. Sono separate dalla misurazione delle CU che avviene durante l'esecuzione.
Il costo totale dello scheduler è la somma di cinque componenti
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Componenti del costo
| Componente | Descrizione |
|---|---|
| Costo della firma | Costo per firma per ogni tipo di firma |
| Costo del write lock | Per account scrivibile |
| Costo dell'instruction data | Basato sul totale dei byte di instruction data |
| Costo di esecuzione dei programmi | Limite CU dal budget di calcolo o predefinito |
| Costo dei dati degli account caricati | Basato sulla dimensione totale dei dati degli account caricati |
Tutti i valori sono espressi in unità di calcolo.
Costanti del costo dello scheduler
| Costante | Valore |
|---|---|
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 |
Costo della transazione di voto
Le transazioni di voto utilizzano un costo statico di 3.428 CU indipendentemente dal loro contenuto effettivo.
Limiti del blocco
Lo scheduler applica limiti per blocco. Se l'aggiunta di una transazione supera qualsiasi limite, essa non viene inclusa nel blocco.
| Limite | Valore |
|---|---|
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
propone di aumentare MAX_BLOCK_UNITS a 100.000.000.
Costanti del budget di esecuzione
Le seguenti costanti da
execution_budget.rs
definiscono i limiti di runtime durante l'esecuzione delle transazioni:
| Costante | Valore | Descrizione |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1.400.000 | Limite massimo di CU per transazione |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200.000 | CU predefinite per istruzione non builtin |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3.000 | CU predefinite per istruzione builtin (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Costo per pagina heap da 32 KiB |
DEFAULT_INVOCATION_COST | 1.000 CU | Costo di una invocazione CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Costo invocazione CPI con SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32.768 | Dimensione minima heap (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262.144 | Dimensione massima heap (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67.108.864 | Dati account massimi caricati per transazione (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Profondità massima dello stack di istruzioni (top-level + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Profondità massima dello stack di istruzioni (top-level + CPI) con SIMD-0268 |
MAX_CALL_DEPTH | 64 | Profondità massima chiamate SBF-to-SBF all'interno di un programma |
STACK_FRAME_SIZE | 4.096 byte | Dimensione di un frame dello stack SBF |
Is this page helpful?