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 prioritizzazione. La commissione base compensa i validator per l'elaborazione della transazione. La commissione di prioritizzazione è una commissione opzionale per aumentare la probabilità che il leader attuale elabori la tua transazione.
Commissione base
Ogni transazione costa 5000 lamports per firma inclusa. Questa commissione è pagata dal primo firmatario della transazione. Solo gli account di proprietà del System Program possono pagare le commissioni di transazione. 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 prioritizzazione
Una commissione di prioritizzazione è 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 prioritizzazione possono essere impostate regolando il prezzo dell'unità di calcolo (computation unit) (CU) della transazione e il limite CU. (Vedi la guida su come utilizzare le commissioni prioritarie per maggiori dettagli sulle commissioni di prioritizzazione.)
La commissione di prioritizzazione viene calcolata come segue:
Prioritization fee formula
Prioritization fee = CU limit * CU price
La commissione di prioritizzazione viene utilizzata per determinare la priorità della tua transazione, rispetto ad altre transazioni. Viene calcolata utilizzando la seguente formula:
Transaction priority formula
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
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 queste impostazioni predefinite includendo un'istruzione
SetComputeUnitLimit
nella tua transazione.
Per calcolare il limite CU appropriato per la tua transazione, raccomandiamo 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
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);
Console
Click to execute the code.
Is this page helpful?