Budget di calcolo

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

  1. Simula la transazione per misurare il consumo di CU.
  2. 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.

VarianteDiscriminatoreParametroTipoDescrizione
RequestHeapFrame1bytesu32Dimensione heap richiesta in byte per ogni programma nella transazione
SetComputeUnitLimit2unitsu32CU massime che la transazione può consumare
SetComputeUnitPrice3micro_lamportsu64Prezzo CU in micro-lamport
SetLoadedAccountsDataSizeLimit4bytesu32Byte 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 tra MIN_HEAP_FRAME_BYTES (32 KiB) e MAX_HEAP_FRAME_BYTES (256 KiB), e deve essere un multiplo di 1.024. Altrimenti la transazione fallisce con InvalidInstructionData. La dimensione heap si applica a ogni programma invocato nella transazione (inclusi i CPI).
  • SetComputeUnitLimit: qualsiasi valore u32 è accettato. Il limite effettivo è limitato a MAX_COMPUTE_UNIT_LIMIT (1.400.000).
  • SetComputeUnitPrice: qualsiasi valore u64 è accettato (da 0 a u64::MAX).
  • SetLoadedAccountsDataSizeLimit: il valore deve essere maggiore di 0 (NonZeroU32). Un valore di 0 causa InvalidLoadedAccountsDataSizeLimit. Il limite effettivo è limitato a MAX_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):

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

Componenti del costo

ComponenteDescrizione
Costo della firmaCosto per firma per ogni tipo di firma
Costo del write lockPer account scrivibile
Costo dell'instruction dataBasato sul totale dei byte di instruction data
Costo di esecuzione dei programmiLimite CU dal budget di calcolo o predefinito
Costo dei dati degli account caricatiBasato sulla dimensione totale dei dati degli account caricati

Tutti i valori sono espressi in unità di calcolo.

Costanti del costo dello scheduler

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.

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:

CostanteValoreDescrizione
MAX_COMPUTE_UNIT_LIMIT1.400.000Limite massimo di CU per transazione
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200.000CU predefinite per istruzione non builtin
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3.000CU predefinite per istruzione builtin (SIMD-0170)
DEFAULT_HEAP_COST8 CUCosto per pagina heap da 32 KiB
DEFAULT_INVOCATION_COST1.000 CUCosto di una invocazione CPI
INVOKE_UNITS_COST_SIMD_0339946 CUCosto invocazione CPI con SIMD-0339
MIN_HEAP_FRAME_BYTES32.768Dimensione minima heap (32 KiB)
MAX_HEAP_FRAME_BYTES262.144Dimensione massima heap (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67.108.864Dati account massimi caricati per transazione (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Profondità massima dello stack di istruzioni (top-level + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Profondità massima dello stack di istruzioni (top-level + CPI) con SIMD-0268
MAX_CALL_DEPTH64Profondità massima chiamate SBF-to-SBF all'interno di un programma
STACK_FRAME_SIZE4.096 byteDimensione di un frame dello stack SBF

Is this page helpful?

Indice dei contenuti

Modifica pagina

Gestito da

© 2026 Solana Foundation.
Tutti i diritti riservati.
Resta connesso