Résumé
Frais totaux = frais de base (5 000 lamports/signature, 50 % brûlés) + frais de priorité (prix_CU * limite_CU / 1M lamports, 100 % au validator). Facturés que la transaction réussisse ou échoue.
Algorithme de calcul des frais
Les frais totaux d'une transaction sont calculés par
calculate_fee_details
:
total_fee = base_fee + prioritization_fee
Les entrées sont le message de transaction, le lamports_per_signature actuel
(actuellement 5 000), et les frais de priorisation dérivés des instructions de
budget de calcul. Les frais totaux sont déduits du payeur de frais avant le
début de l'exécution. Si la transaction échoue, les frais sont quand même
facturés.
Frais de base
Les frais de base couvrent le coût de la vérification de signature Ed25519 plus toute vérification de signature de précompilation. Chaque signature dans la transaction est facturée, y compris les signatures vérifiées par les programmes de précompilation Ed25519, Secp256k1 et Secp256r1.
La fonction
calculate_signature_fee
calcule :
signature_count = num_transaction_signatures+ num_ed25519_signatures+ num_secp256k1_signatures+ num_secp256r1_signatures (if feature enabled)base_fee = signature_count * lamports_per_signature
num_transaction_signatures: le nombre de signatures Ed25519 sur la transaction (généralement une par signataire).num_ed25519_signatures,num_secp256k1_signatures,num_secp256r1_signatures: signatures vérifiées par les programmes de précompilation correspondants.lamports_per_signature: actuellement 5 000 lamports.
Distribution des frais
Les frais de base et les frais de priorisation sont distribués différemment. La
fonction
calculate_reward_and_burn_fee_details
dans le runtime calcule :
burn_amount = transaction_fee * 50 / 100validator_share = (transaction_fee - burn_amount) + priority_fee
- Frais de base (transaction_fee) : 50 % sont
brûlés
(retirés de l'offre en circulation) et 50 % vont au validator producteur de
bloc. Le pourcentage brûlé est
DEFAULT_BURN_PERCENT = 50. - Frais de priorisation : 100 % vont au validator (aucun n'est brûlé), selon SIMD-0096.
La récompense totale du validateur pour une transaction est :
validator_reward = (base_fee / 2) + prioritization_fee
Frais de priorisation
Les frais de priorisation sont des frais optionnels qui augmentent la priorité de planification d'une transaction. Une unité de calcul (CU) est une unité de calcul que le runtime mesure pendant l'exécution de la transaction. Chaque opération (arithmétique, accès mémoire, syscall) coûte un nombre fixe de CU. Vous pouvez définir les frais de priorisation en incluant des instructions de budget de calcul dans votre transaction. (Consultez le guide Comment utiliser les frais de priorité pour plus de détails.)
Formule des frais de priorisation
La fonction
get_prioritization_fee
calcule :
micro_lamport_fee = compute_unit_price * compute_unit_limitprioritization_fee = ceil(micro_lamport_fee / 1,000,000)
| Variable | Description | Par défaut |
|---|---|---|
compute_unit_price | Micro-lamports par CU, défini via SetComputeUnitPrice | 0 micro-lamport |
compute_unit_limit | CU maximum que la transaction peut consommer, défini via SetComputeUnitLimit | Somme des valeurs par défaut par instruction |
1,000,000 | Facteur de conversion des micro-lamports en lamports (MICRO_LAMPORTS_PER_LAMPORT) | -- |
Limite d'unités de calcul
La limite d'unités de calcul est le nombre maximum de CU qu'une transaction peut
consommer. Si aucune instruction
SetComputeUnitLimit
n'est incluse, la valeur par défaut est calculée à partir du nombre et du type
d'instructions (200 000 CU par instruction non intégrée, 3 000 par instruction
intégrée). Consultez Budget de calcul pour
plus de détails sur le calcul par défaut.
Les frais de priorité sont basés sur la limite de CU demandée, et non sur l'utilisation réelle des CU. Définir une limite supérieure à celle nécessaire signifie payer pour des unités de calcul inutilisées.
Prix de l'unité de calcul
Le prix de l'unité de calcul est un montant optionnel de micro-lamports payé
pour chaque CU demandée. Le prix de la CU détermine directement les frais de
priorisation. Pour définir le prix de la CU, incluez une instruction
SetComputeUnitPrice
dans votre transaction.
Le prix CU par défaut est 0, ce qui signifie que les frais de priorisation par défaut sont également 0.
Pour des estimations de prix CU en temps réel, consultez les fournisseurs d'API de frais de priorité ci-dessous.
| Fournisseur | API de frais de priorité |
|---|---|
| Helius | Documentation |
| QuickNode | Documentation |
| Triton | Documentation |
Priorité de planification des transactions
Le planificateur classe les transactions en utilisant la fonction
calculate_priority_and_cost
:
Priority = reward * 1,000,000 / (cost + 1)
- reward : le revenu de frais du validateur = frais de priorisation +
portion non brûlée des frais de base. Calculé par
calculate_reward_for_transaction. - cost : le coût CU estimé du planificateur (coûts de signature + coûts de verrouillage en écriture + coûts de données d'instruction + coûts d'exécution de programme + coût de taille des données de comptes chargés). Voir Budget de calcul pour plus de détails.
- 1 000 000 : un multiplicateur pour préserver la précision, car le coût dépasse souvent la récompense en lamports bruts.
- +1 : empêche la division par zéro.
La priorité détermine l'ordre dans lequel les transactions sont retirées de la file d'attente du planificateur pour exécution.
Exemple : définir la limite CU et le prix CU
Les exemples ci-dessous montrent comment définir la limite CU et le prix CU sur une transaction en utilisant les SDK Solana.
| SDK | Référence du code source |
|---|---|
@solana/web3.js (Typescript) | ComputeBudgetProgram |
solana-sdk (Rust) | ComputeBudgetInstruction |
const limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,Keypair,Connection,ComputeBudgetProgram,sendAndConfirmTransaction} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = Keypair.generate();const recipient = new Keypair();const airdropSignature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(airdropSignature, "confirmed");// Create compute budget instructionsconst limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: recipient.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});// Add the compute budget and transfer instructions to a new transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?