Budget de calcul

Résumé

Par défaut 200K CUs par instruction, 1,4M maximum par transaction. Utilisez les instructions SetComputeUnitLimit et SetComputeUnitPrice pour optimiser. Les frais de priorité sont basés sur les CUs demandées, pas sur l'utilisation réelle.

Limite d'unités de calcul

Chaque instruction se voit allouer par défaut 200 000 CUs, et chaque transaction est plafonnée à 1 400 000 CUs. Lorsqu'aucune instruction SetComputeUnitLimit explicite n'est présente, la valeur par défaut est calculée en fonction du type d'instruction :

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)
  • Instructions intégrées (System Program, Stake, Vote, etc. qui n'ont pas été migrées vers SBF) : chacune se voit allouer MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3 000 CUs (selon SIMD-0170).
  • Instructions non intégrées (programmes SBF déployés par l'utilisateur) : chacune se voit allouer DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200 000 CUs.
  • Intégrées en cours de migration ayant terminé la migration vers SBF (contrôlées par feature gate) : traitées comme non intégrées (200 000 CUs chacune).

Le résultat est plafonné à MAX_COMPUTE_UNIT_LIMIT (1 400 000).

Vous pouvez remplacer cette valeur par défaut en incluant une instruction SetComputeUnitLimit dans votre transaction.

Pour déterminer la limite de CUs appropriée :

  1. Simulez la transaction pour mesurer la consommation de CUs.
  2. Ajoutez une marge de sécurité de 10 % à la valeur simulée.

Les frais de priorité sont déterminés par la limite d'unités de calcul demandée sur la transaction, et non par le nombre réel d'unités de calcul utilisées. Si vous définissez une limite d'unités de calcul trop élevée ou utilisez le montant par défaut, vous payez pour des unités de calcul non utilisées.

Instructions du budget de calcul

Le programme de budget de calcul (ComputeBudget111111111111111111111111111111) comporte quatre instructions.

VarianteDiscriminateurParamètreTypeDescription
RequestHeapFrame1bytesu32Taille de tas demandée en octets pour chaque programme dans la transaction
SetComputeUnitLimit2unitsu32Nombre maximum d'unités de calcul que la transaction peut consommer
SetComputeUnitPrice3micro_lamportsu64Prix de l'unité de calcul en micro-lamports
SetLoadedAccountsDataSizeLimit4bytesu32Nombre maximum d'octets de données de compte que la transaction peut charger

Source : énumération ComputeBudgetInstruction

Contraintes et conditions d'erreur

Les règles suivantes s'appliquent lors du traitement des instructions de budget de calcul :

  • Une par type : une seule instruction de chaque variante est autorisée par transaction. L'inclusion de doublons provoque une erreur DuplicateInstruction (la transaction entière échoue).
  • RequestHeapFrame : la valeur doit être comprise entre MIN_HEAP_FRAME_BYTES (32 Kio) et MAX_HEAP_FRAME_BYTES (256 Kio), et doit être un multiple de 1 024. Sinon, la transaction échoue avec InvalidInstructionData. La taille du tas s'applique à chaque programme invoqué dans la transaction (y compris les CPI).
  • SetComputeUnitLimit : toute valeur u32 est acceptée. La limite effective est plafonnée à MAX_COMPUTE_UNIT_LIMIT (1 400 000).
  • SetComputeUnitPrice : toute valeur u64 est acceptée (0 à u64::MAX).
  • SetLoadedAccountsDataSizeLimit : la valeur doit être supérieure à 0 (NonZeroU32). Une valeur de 0 provoque InvalidLoadedAccountsDataSizeLimit. La limite effective est plafonnée à MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 Mio).
  • Données non reconnues : toute instruction envoyée au programme de budget de calcul qui ne se désérialise pas en une variante connue échoue avec InvalidInstructionData.

Le modèle de coût du planificateur ci-dessous décrit l'estimation des coûts de pré-exécution interne au validateur. La plupart des développeurs n'ont besoin que des instructions de budget de calcul ci-dessus.

Modèle de coût du planificateur

Le planificateur du validateur utilise un modèle de coût pour estimer l'utilisation des ressources de la transaction avant l'exécution. Ces estimations de coût de pré-exécution déterminent si une transaction correspond à la capacité restante du bloc. Elles sont distinctes de la mesure des CU qui se produit pendant l'exécution.

Le coût total du planificateur est la somme de cinq composants (UsageCostDetails::sum) :

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

Composants de coût

ComposantDescription
Coût de signatureCoût par signature pour chaque type de signature
Coût de verrouillage en écriturePar compte inscriptible
Coût des données d'instructionBasé sur le total des octets de données d'instruction
Coût d'exécution des programmesLimite de CU du budget de calcul ou valeur par défaut
Coût des données de comptes chargésBasé sur la taille totale des données de compte chargées

Toutes les valeurs sont en unités de calcul.

Constantes de coût du planificateur

Coût de transaction de vote

Les transactions de vote utilisent un coût statique de 3 428 CU indépendamment de leur contenu réel.

Limites de bloc

Le planificateur applique des limites par bloc. Si l'ajout d'une transaction dépassait l'une des limites, elle n'est pas incluse dans le bloc.

SIMD-0286 propose d'augmenter MAX_BLOCK_UNITS à 100 000 000.

Constantes du budget d'exécution

Les constantes suivantes de execution_budget.rs définissent les limites d'exécution lors de l'exécution des transactions :

ConstanteValeurDescription
MAX_COMPUTE_UNIT_LIMIT1 400 000Limite maximale de CU par transaction
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200 000CU par défaut par instruction non intégrée
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3 000CU par défaut par instruction intégrée (SIMD-0170)
DEFAULT_HEAP_COST8 CUCoût par page de heap de 32 Kio
DEFAULT_INVOCATION_COST1 000 CUCoût d'une invocation CPI
INVOKE_UNITS_COST_SIMD_0339946 CUCoût d'invocation CPI avec SIMD-0339
MIN_HEAP_FRAME_BYTES32 768Taille minimale du heap (32 Kio)
MAX_HEAP_FRAME_BYTES262 144Taille maximale du heap (256 Kio)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67 108 864Données de compte chargées maximales par transaction (64 Mio)
MAX_INSTRUCTION_STACK_DEPTH5Profondeur maximale de la pile d'instructions (niveau supérieur + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Profondeur maximale de la pile d'instructions (niveau supérieur + CPI) avec SIMD-0268
MAX_CALL_DEPTH64Profondeur maximale d'appel SBF-vers-SBF au sein d'un programme
STACK_FRAME_SIZE4 096 octetsTaille d'une frame de pile SBF

Is this page helpful?

Table des matières

Modifier la page

Géré par

© 2026 Fondation Solana.
Tous droits réservés.
Restez connecté