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 rekening moet eigendom zijn 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-eenheden en limieten

Wanneer een transactie wordt verwerkt, gebruikt deze computationele bronnen gemeten in compute-eenheden (CU). Elke instructie trekt af van het compute-eenhedenbudget van de transactie.

  • Maximale limiet: Een transactie kan tot 1,4 miljoen compute-eenheden gebruiken.
  • Standaardlimiet: Standaard kan elke instructie tot 200.000 compute-eenheden gebruiken.
  • Aangepaste limiet: Je kunt een specifieke compute-eenhedenlimiet aanvragen door een SetComputeUnitLimit instructie in je transactie op te nemen.

Voor meer details over het gebruik van compute-eenheden:

Zie de Hoe optimale compute aan te vragen gids voor meer details over het gebruik van compute-eenheden.

Prijs van compute-eenheden

De prijs van compute-eenheden is een optioneel bedrag, gespecificeerd in micro-lamports, dat je betaalt voor elke aangevraagde compute-eenheid. Deze prijs wordt gebruikt om de prioriteitstoeslag voor je transactie te berekenen.

1.000.000 micro-lamports = 1 lamport

Gebruik deze bronnen om realtime aanbevelingen te krijgen over de huidige prijs van compute-eenheden:

Zie de Hoe prioriteitsvergoedingen te gebruiken gids voor meer details over prioriteitsvergoedingen.

Prioriteitstoeslag berekenen

De prioriteitstoeslag wordt als volgt berekend:

Prioriteitstoeslag = Compute-eenhedenlimiet × Prijs per compute-eenheid

De aanbevolen aanpak voor het instellen van prioriteitsvergoedingen is om eerst de transactie te simuleren om de benodigde compute-eenheden 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 = ((Rekeneenheid limiet * Rekeneenheid prijs) + Basisvergoeding) / (1 + Rekeneenheid limiet + Handtekening REs + Schrijfvergrendeling REs)

Gebruik deze instructies om de rekeneenheid limiet en prijs voor een transactie in te stellen:

Als je deze instructies niet opgeeft, gebruikt de transactie de standaard rekeneenheid limiet met een rekeneenheid prijs van 0 (geen prioriteringsvergoeding).

De prioriteitsvergoeding is afhankelijk van de rekeneenheid limiet die je aanvraagt voor de transactie, niet de daadwerkelijk gebruikte rekeneenheden. Als je een rekeneenheid limiet instelt die te hoog is of de standaardhoeveelheid gebruikt, betaal je mogelijk voor ongebruikte rekeneenheden.

Voorbeelden

De volgende voorbeelden tonen hoe je de rekeneenheid limiet en prijs voor een transactie instelt.

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

Inhoudsopgave

Pagina Bewerken