Commissioni di transazione
Ogni transazione Solana richiede una commissione di transazione, pagata in SOL. Le commissioni di transazione sono suddivise in due parti: la commissione base e la commissione di priorità. La commissione base compensa i validator per l'elaborazione della transazione. La commissione di priorità è una commissione opzionale, per aumentare la probabilità che il leader attuale elabori la tua transazione.
Commissione base
Ogni transazione costa 5000 lamport per ogni firma inclusa. Questa commissione viene pagata dal primo firmatario della transazione e deve essere pagata da un account posseduto dal System Program. La commissione base è suddivisa come segue:
- 50% bruciato: Metà viene bruciata (rimossa dalla fornitura circolante di SOL).
- 50% distribuito: Metà viene pagata al validator che ha elaborato la transazione.
Commissione di priorità
Una commissione di priorità è una commissione opzionale utilizzata per aumentare la probabilità che il leader attuale (validator) elabori la tua transazione. Il validator riceve il 100% della commissione di priorità. Le commissioni di priorità possono essere impostate regolando il prezzo delle unità di calcolo (CU) della transazione e il limite CU. (Vedi la guida su come utilizzare le commissioni di priorità per maggiori dettagli sulle commissioni di priorità.)
La commissione di priorità viene calcolata come segue:
Commissione di priorità = Limite di unità di calcolo × Prezzo dell'unità di calcolo
La commissione di priorità viene utilizzata per determinare la priorità della tua transazione, rispetto ad altre transazioni. Viene calcolata utilizzando la seguente formula:
Priorità della transazione = Commissione di priorità ÷ Dimensione della transazione
Limite di unità di calcolo
Per
impostazione predefinita,
a ogni istruzione vengono allocate
200.000 CU
e a ogni transazione vengono allocate
1,4 milioni di CU.
Puoi modificare questi valori predefiniti includendo un'istruzione
SetComputeUnitLimit
nella tua transazione.
Per calcolare il limite CU appropriato per la tua transazione, consigliamo i seguenti passaggi:
- Stima le unità CU richieste simulando la transazione
- Aggiungi un margine di sicurezza del 10% a questa stima
La commissione di priorità è determinata dal limite di unità di calcolo richiesto nella transazione, non dal numero effettivo di unità di calcolo utilizzate. Se imposti un limite di unità di calcolo troppo alto o utilizzi l'importo predefinito, potresti pagare per unità di calcolo non utilizzate.
Prezzo dell'unità di calcolo
Il prezzo dell'unità di calcolo è un importo opzionale di micro-lamport pagato per ogni CU richiesta. Puoi considerare il prezzo CU come una mancia per incoraggiare il validator a dare priorità alla tua transazione. Per impostare il prezzo CU, includi un'istruzione ComputeBudgetInstruction::SetComputeUnitPrice nella tua transazione.
Il prezzo CU predefinito è 0, il che significa che anche la commissione di priorità predefinita è 0.
Per determinare il miglior prezzo CU per la tua transazione, consulta la raccomandazione sul prezzo CU in tempo reale elencata nella tabella seguente.
Provider | API per commissione di priorità |
---|---|
Helius | Documentazione |
QuickNode | Documentazione |
Triton | Documentazione |
Esempio
Gli esempi seguenti mostrano come impostare il limite CU e il prezzo CU su una transazione utilizzando gli SDK di Solana.
SDK | Riferimento al codice sorgente |
---|---|
@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?