Transactiekosten
Elke Solana-transactie vereist een basisvergoeding (SOL) om validators te compenseren voor het verwerken van de transactie. Je kunt ook een optionele prioriteitsvergoeding betalen om de kans te vergroten dat de huidige leider (validator) je transactie verwerkt.
Belangrijke punten
- De basisvergoeding voor een transactie is 5000 lamports per handtekening op de transactie.
- De prioriteitsvergoeding (optioneel) is een extra vergoeding die je aan de validator betaalt om de kans te vergroten dat de huidige leider je transactie verwerkt.
- De prioriteitsvergoeding is gelijk aan: (compute-eenheidslimiet * compute-eenheidsprijs).
- De compute-eenheidslimiet is het maximum aantal compute-eenheden dat je transactie kan gebruiken.
- De compute-eenheidsprijs is de prijs per compute-eenheid, in micro-lamports.
- 1.000.000 micro-lamports = 1 lamport
- De betaler van de transactiekosten moet een account zijn dat eigendom is van het System Program.
Basis transactiekosten
De basisvergoeding is de kosten om een transactie te verzenden. De kosten bedragen 5000 lamports per handtekening die in de transactie is opgenomen.
De basisvergoeding komt uit het account van de betaler van de transactiekosten, wat de eerste ondertekenaar van de transactie is. De kostenbetalende partij moet een account zijn dat eigendom is van het System Program.
- 50% Verbrand: De helft van de basisvergoeding wordt verbrand.
- 50% Distributie: De helft wordt betaald aan de validator die de transactie heeft verwerkt.
Prioriteitsvergoeding
De prioriteitsvergoeding is een optionele vergoeding die wordt betaald om de kans te vergroten dat de huidige leider je transactie verwerkt.
- SIMD-0096: De validator die de transactie verwerkt, ontvangt 100% van de prioriteitsvergoeding.
Compute units en limieten
Wanneer een transactie wordt verwerkt, gebruikt deze computationele bronnen die worden gemeten in compute units (CU). Elke instructie trekt af van het compute unit budget van de transactie.
- Maximale limiet: Een transactie kan tot 1,4 miljoen compute units gebruiken.
- Standaardlimiet: Standaard kan elke instructie tot 200.000 compute units gebruiken.
- Aangepaste limiet: Je kunt een specifieke compute unit limiet aanvragen door
een
SetComputeUnitLimit
instructie in je transactie op te nemen.
Voor meer details over compute unit gebruik:
Bekijk de Hoe optimale compute aan te vragen gids voor meer details over compute unit gebruik.
Compute unit prijs
De compute unit prijs is een optioneel bedrag, gespecificeerd in micro-lamports, dat je betaalt voor elke aangevraagde compute unit. Deze prijs wordt gebruikt om de prioriteitvergoeding voor je transactie te berekenen.
Gebruik deze bronnen om realtime aanbevelingen te krijgen over de huidige compute unit prijs:
Provider | Priority Fee API |
---|---|
Helius | Documentatie |
QuickNode | Documentatie |
Triton | Documentatie |
Bekijk de Hoe prioriteitsvergoedingen te gebruiken gids voor meer details over prioriteitsvergoedingen.
Prioriteitsvergoeding berekenen
De prioriteitsvergoeding wordt als volgt berekend:
Prioriteitsvergoeding = Compute Unit Limiet × Compute Unit Prijs
De aanbevolen aanpak voor het instellen van prioriteitsvergoedingen is om eerst
de transactie te
simuleren om de
benodigde rekeneenheden in te schatten. Voeg vervolgens een veiligheidsmarge van
10% toe aan deze schatting en gebruik de resulterende waarde als de
Compute Unit Limit
.
De transactieprioriteit, die bepaalt hoe deze wordt geprioriteerd ten opzichte van andere transacties, wordt berekend met de volgende formule:
Prioriteit = ((Rekeneenheidslimiet * Rekeneenheidsprijs) + Basisvergoeding) / (1 + Rekeneenheidslimiet + Handtekening REs + Schrijfvergrendeling REs)
Gebruik deze instructies om de rekeneenheidslimiet en prijs voor een transactie in te stellen:
SetComputeUnitLimit
om een specifieke eenheidslimiet in te stellen.SetComputeUnitPrice
om de prijs per rekeneenheid te definiëren.
Als je deze instructies niet opgeeft, gebruikt de transactie de standaard rekeneenheidslimiet met een rekeneenheidsprijs van 0 (geen prioriteitsvergoeding).
De prioriteitsvergoeding is afhankelijk van de rekeneenheidslimiet die je aanvraagt voor de transactie, niet de daadwerkelijk gebruikte rekeneenheden. Als je een rekeneenheidslimiet instelt die te hoog is of de standaardhoeveelheid gebruikt, betaal je mogelijk voor ongebruikte rekeneenheden.
Voorbeelden
De volgende voorbeelden tonen hoe je de rekeneenheidslimiet en prijs voor een transactie kunt instellen.
SDK | Broncode referentie |
---|---|
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?