Frais de transaction
Chaque transaction Solana nécessite des frais de base (SOL) pour rémunérer les validators qui traitent la transaction. Vous pouvez également payer des frais de priorisation optionnels pour augmenter les chances que le leader actuel (validator) traite votre transaction.
Points clés
- Les frais de base pour une transaction sont de 5000 lamports par signature sur la transaction.
- Les frais de priorisation (optionnels) sont des frais supplémentaires que vous payez au validator pour augmenter les chances que le leader actuel traite votre transaction.
- Les frais de priorisation équivalent à : (limite d'unités de calcul * prix de l'unité de calcul).
- La limite d'unités de calcul est le maximum d'unités de calcul que votre transaction peut utiliser.
- Le prix de l'unité de calcul est le prix par unité de calcul, en micro-lamports.
- 1 000 000 micro-lamports = 1 lamport
- Le payeur des frais de transaction doit être un compte détenu par le System Program.
Frais de transaction de base
Les frais de base correspondent au coût d'envoi d'une transaction. Le coût est de 5000 lamports par signature incluse dans la transaction.
Les frais de base sont prélevés sur le compte du payeur des frais de transaction, qui est le premier signataire de la transaction. Le payeur des frais doit être un compte détenu par le System Program.
- 50% brûlés : La moitié des frais de base est brûlée.
- 50% de distribution : La moitié est versée au validator qui a traité la transaction.
Frais de priorisation
Les frais de priorisation sont des frais optionnels payés pour augmenter les chances que le leader actuel traite votre transaction.
- SIMD-0096 : Le validator qui traite la transaction reçoit 100 % des frais prioritaires.
Unités de calcul et limites
Lorsqu'une transaction est traitée, elle utilise des ressources informatiques mesurées en unités de calcul (CU). Chaque instruction déduit du budget d'unités de calcul de la transaction.
- Limite maximale : Une transaction peut utiliser jusqu'à 1,4 million d'unités de calcul.
- Limite par défaut : Par défaut, chaque instruction peut utiliser jusqu'à 200 000 unités de calcul.
- Limite personnalisée : Vous pouvez demander une limite d'unités de calcul
spécifique en incluant une instruction
SetComputeUnitLimit
dans votre transaction.
Pour plus de détails sur l'utilisation des unités de calcul :
Consultez le guide Comment demander un calcul optimal pour plus de détails sur l'utilisation des unités de calcul.
Prix de l'unité de calcul
Le prix de l'unité de calcul est un montant optionnel, spécifié en micro-lamports, que vous payez pour chaque unité de calcul demandée. Ce prix est utilisé pour calculer les frais de priorisation de votre transaction.
Utilisez ces ressources pour obtenir des recommandations en temps réel sur le prix actuel des unités de calcul :
Fournisseur | API de frais prioritaires |
---|---|
Helius | Documentation |
QuickNode | Documentation |
Triton | Documentation |
Consultez le guide Comment utiliser les frais prioritaires pour plus de détails sur les frais prioritaires.
Calculer 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
L'approche recommandée pour définir les frais prioritaires est d'abord de
simuler la
transaction pour estimer les unités de calcul requises. Ensuite, ajoutez une
marge de sécurité de 10 % à cette estimation et utilisez la valeur résultante
comme Compute Unit Limit
.
La priorité de transaction, qui détermine comment elle est priorisée par rapport aux autres transactions, est calculée selon la formule suivante :
Priorité = ((Limite d'unités de calcul * Prix par unité de calcul) + Frais de base) / (1 + Limite d'unités de calcul + Unités de calcul pour signatures + Unités de calcul pour verrous d'écriture)
Utilisez ces instructions pour définir la limite et le prix des unités de calcul sur une transaction :
SetComputeUnitLimit
pour définir une limite d'unités spécifique.SetComputeUnitPrice
pour définir le prix par unité de calcul.
Si vous ne fournissez pas ces instructions, la transaction utilise la limite d'unités de calcul par défaut avec un prix d'unité de calcul de 0 (pas de frais de priorisation).
Les frais de priorité dépendent de la limite d'unités de calcul que vous demandez pour la transaction, et non des unités de calcul réellement utilisées. Si vous définissez une limite d'unités de calcul trop élevée ou utilisez le montant par défaut, vous pourriez payer pour des unités de calcul inutilisées.
Exemples
Les exemples suivants montrent comment définir la limite et le prix des unités de calcul pour une transaction.
SDK | Référence du code source |
---|---|
solana-sdk (Rust) | ComputeBudgetInstruction |
@solana/web3.js (Typescript) | ComputeBudgetProgram |
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?