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.

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.

1 000 000 micro lamports = 1 lamport

Utilisez ces ressources pour obtenir des recommandations en temps réel sur le prix actuel des unités de calcul :

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 :

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.

SDKRé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 instructions
const 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 transaction
const 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?

Table des matières

Modifier la page