Jede Solana-Transaktion erfordert eine Transaktionsgebühr, die in SOL bezahlt wird. Transaktionsgebühren werden in zwei Teile aufgeteilt: die Basisgebühr und die Priorisierungsgebühr. Die Basisgebühr entschädigt Validatoren für die Verarbeitung der Transaktion. Die Priorisierungsgebühr ist eine optionale Gebühr, um die Chance zu erhöhen, dass der aktuelle Leader Ihre Transaktion verarbeitet.
Basisgebühr
Jede Transaktion kostet 5000 Lamports pro enthaltener Signatur. Diese Gebühr wird vom ersten Signer der Transaktion bezahlt. Nur Konten, die dem System Program gehören, können Transaktionsgebühren bezahlen. Die Basisgebühr wird wie folgt aufgeteilt:
- 50% verbrannt: Die Hälfte wird verbrannt (aus dem zirkulierenden SOL-Angebot entfernt).
- 50% verteilt: Die Hälfte wird an den Validator gezahlt, der die Transaktion verarbeitet hat.
Priorisierungsgebühr
Eine Priorisierungsgebühr ist eine optionale Gebühr, die verwendet wird, um die Chance zu erhöhen, dass der aktuelle Leader (Validator) Ihre Transaktion verarbeitet. Der Validator erhält 100% der priority fee. Priorisierungsgebühren können durch Anpassung des Compute Unit (CU) Preises und CU-Limits der Transaktion festgelegt werden. (Siehe den How to Use Priority Fees Guide für weitere Details zu Priorisierungsgebühren.)
Die Priorisierungsgebühr wird wie folgt berechnet:
Prioritization fee = CU limit * CU price
Die Priorisierungsgebühr wird verwendet, um die Priorität Ihrer Transaktion im Verhältnis zu anderen Transaktionen zu bestimmen. Sie wird mit der folgenden Formel berechnet:
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
Compute Unit Limit
Standardmäßig
werden jeder Instruktion
200.000 CUs
und jeder Transaktion
1,4 Millionen CUs
zugewiesen. Sie können diese Standardwerte ändern, indem Sie eine
SetComputeUnitLimit
Instruktion in Ihre Transaktion einfügen.
Um das passende CU-Limit für Ihre Transaktion zu berechnen, empfehlen wir die folgenden Schritte:
- Schätzen Sie die erforderlichen CU-Einheiten, indem Sie die Transaktion simulieren
- Fügen Sie einen Sicherheitspuffer von 10% zu dieser Schätzung hinzu
Die priority fee wird durch das angeforderte Compute-Unit-Limit der Transaktion bestimmt, nicht durch die tatsächlich verwendete Anzahl an Compute-Units. Wenn Sie ein zu hohes Compute-Unit-Limit festlegen oder den Standardwert verwenden, zahlen Sie möglicherweise für ungenutzte Compute-Units.
Compute-Unit-Preis
Der Compute-Unit-Preis ist ein optionaler Betrag in
Micro-Lamports, der für jede
angeforderte CU gezahlt wird. Sie können sich den CU-Preis als Trinkgeld
vorstellen, um den Validator zu ermutigen, Ihre Transaktion zu priorisieren. Um
den CU-Preis festzulegen, fügen Sie eine
SetComputeUnitPrice-Anweisung
in Ihre Transaktion ein.
Der Standard-CU-Preis beträgt 0, was bedeutet, dass auch die Standard-priority fee 0 ist.
Für Hilfe bei der Bestimmung des besten CU-Preises für Ihre Transaktion siehe die Echtzeit-CU-Preis-Empfehlung in der unten stehenden Tabelle.
| Anbieter | Priority-Fee-API |
|---|---|
| Helius | Dokumentation |
| QuickNode | Dokumentation |
| Triton | Dokumentation |
Beispiel
Die folgenden Beispiele zeigen, wie Sie das CU-Limit und den CU-Preis für eine Transaktion mit Solana-SDKs festlegen.
| SDK | Quellcode-Referenz |
|---|---|
@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?