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 = (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 :
- Simulez la transaction pour mesurer la consommation de CUs.
- 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.
| Variante | Discriminateur | Paramètre | Type | Description |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Taille de tas demandée en octets pour chaque programme dans la transaction |
SetComputeUnitLimit | 2 | units | u32 | Nombre maximum d'unités de calcul que la transaction peut consommer |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Prix de l'unité de calcul en micro-lamports |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Nombre 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 entreMIN_HEAP_FRAME_BYTES(32 Kio) etMAX_HEAP_FRAME_BYTES(256 Kio), et doit être un multiple de 1 024. Sinon, la transaction échoue avecInvalidInstructionData. La taille du tas s'applique à chaque programme invoqué dans la transaction (y compris les CPI).SetComputeUnitLimit: toute valeuru32est acceptée. La limite effective est plafonnée àMAX_COMPUTE_UNIT_LIMIT(1 400 000).SetComputeUnitPrice: toute valeuru64est acceptée (0 àu64::MAX).SetLoadedAccountsDataSizeLimit: la valeur doit être supérieure à 0 (NonZeroU32). Une valeur de 0 provoqueInvalidLoadedAccountsDataSizeLimit. 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)
:
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Composants de coût
| Composant | Description |
|---|---|
| Coût de signature | Coût par signature pour chaque type de signature |
| Coût de verrouillage en écriture | Par compte inscriptible |
| Coût des données d'instruction | Basé sur le total des octets de données d'instruction |
| Coût d'exécution des programmes | Limite de CU du budget de calcul ou valeur par défaut |
| Coût des données de comptes chargés | Basé 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
| Constante | Valeur |
|---|---|
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 |
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.
| Limite | Valeur |
|---|---|
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 Mo |
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 :
| Constante | Valeur | Description |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1 400 000 | Limite maximale de CU par transaction |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200 000 | CU par défaut par instruction non intégrée |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3 000 | CU par défaut par instruction intégrée (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Coût par page de heap de 32 Kio |
DEFAULT_INVOCATION_COST | 1 000 CU | Coût d'une invocation CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Coût d'invocation CPI avec SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32 768 | Taille minimale du heap (32 Kio) |
MAX_HEAP_FRAME_BYTES | 262 144 | Taille maximale du heap (256 Kio) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67 108 864 | Données de compte chargées maximales par transaction (64 Mio) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Profondeur maximale de la pile d'instructions (niveau supérieur + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Profondeur maximale de la pile d'instructions (niveau supérieur + CPI) avec SIMD-0268 |
MAX_CALL_DEPTH | 64 | Profondeur maximale d'appel SBF-vers-SBF au sein d'un programme |
STACK_FRAME_SIZE | 4 096 octets | Taille d'une frame de pile SBF |
Is this page helpful?