Frais de transaction
Chaque transaction Solana nécessite des frais de transaction, payés en SOL. Les frais de transaction sont divisés en deux parties : les frais de base et les frais de priorisation. Les frais de base compensent les validateurs pour le traitement de la transaction. Les frais de priorisation sont des frais optionnels, pour augmenter la probabilité que le leader actuel traite votre transaction.
Frais de base
Chaque transaction coûte 5000 lamports par signature incluse. Ces frais sont payés par le premier signataire de la transaction et doivent être payés par un compte détenu par le System Program. Les frais de base sont répartis comme suit :
- 50% brûlés : La moitié est brûlée (retirée de l'offre circulante de SOL).
- 50% distribués : L'autre moitié est versée au validateur qui a traité la transaction.
Frais de priorisation
Les frais de priorisation sont des frais optionnels utilisés pour augmenter la probabilité que le leader actuel (validateur) traite votre transaction. Le validateur reçoit 100% des frais de priorité. Les frais de priorisation peuvent être définis en ajustant le prix des unités de calcul (CU) et la limite de CU de la transaction. (Consultez le guide Comment utiliser les frais de priorité pour plus de détails sur les frais de priorisation.)
Les frais de priorisation sont calculés comme suit :
Frais de priorisation = Limite d'unités de calcul × Prix de l'unité de calcul
Les frais de priorisation sont utilisés pour déterminer la priorité de votre transaction, par rapport aux autres transactions. Ils sont calculés selon la formule suivante :
Priorité de la transaction = Frais de priorisation / Nombre de signatures
Limite d'unités de calcul
Par
défaut,
chaque instruction se voit attribuer
200 000 CU
et chaque transaction se voit attribuer
1,4 million de CU.
Vous pouvez modifier ces valeurs par défaut en incluant une instruction
SetComputeUnitLimit
dans votre transaction.
Pour calculer la limite CU appropriée pour votre transaction, nous recommandons les étapes suivantes :
- Estimez les unités CU requises en simulant la transaction
- Ajoutez une marge de sécurité de 10 % à cette estimation
Les frais de priorité sont déterminés par la limite d'unités de calcul demandée pour la transaction, pas 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 risquez de payer pour des unités de calcul non utilisées.
Prix de l'unité de calcul
Le prix de l'unité de calcul est un montant optionnel en
micro-lamports payé pour chaque
CU demandée. Vous pouvez considérer le prix CU comme un pourboire pour
encourager le validator à prioriser votre transaction. Pour définir le prix 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 de 0.
Pour déterminer le meilleur prix CU pour votre transaction, consultez la recommandation de prix CU en temps réel fournie dans le tableau ci-dessous.
Fournisseur | API de frais prioritaires |
---|---|
Helius | Documentation |
QuickNode | Documentation |
Triton | Documentation |
Exemple
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);
Console
Click to execute the code.
Is this page helpful?