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:

  1. Stima le unità CU richieste simulando la transazione
  2. 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.

Esempio

Gli esempi seguenti mostrano come impostare il limite CU e il prezzo CU su una transazione utilizzando gli SDK di Solana.

SDKRiferimento 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 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?

Indice

Modifica Pagina