Transaktionsgebühren
Jede Solana-Transaktion erfordert eine Basisgebühr (SOL), um Validatoren für die Verarbeitung der Transaktion zu entschädigen. Sie können auch eine optionale Priority Fee zahlen, um die Wahrscheinlichkeit zu erhöhen, dass der aktuelle Leader (Validator) Ihre Transaktion verarbeitet.
Wichtige Punkte
- Die Basisgebühr für eine Transaktion beträgt 5000 Lamports pro Signatur auf der Transaktion.
- Die Priority Fee (optional) ist eine zusätzliche Gebühr, die Sie an den Validator zahlen, um die Wahrscheinlichkeit zu erhöhen, dass der aktuelle Leader Ihre Transaktion verarbeitet.
- Die Priority Fee entspricht: (Compute-Unit-Limit * Compute-Unit-Preis).
- Das Compute-Unit-Limit ist die maximale Anzahl an Compute-Units, die Ihre Transaktion verwenden kann.
- Der Compute-Unit-Preis ist der Preis pro Compute-Unit in Mikro-Lamports.
- 1.000.000 Mikro-Lamports = 1 Lamport
- Der Zahler der Transaktionsgebühr muss ein Konto sein, das dem System Program gehört.
Basis-Transaktionsgebühr
Die Basisgebühr sind die Kosten für das Senden einer Transaktion. Die Kosten betragen 5000 Lamports pro Signatur, die in der Transaktion enthalten ist.
Die Basisgebühr wird vom Konto des Transaktionsgebührenzahlers abgezogen, welches der erste Signer der Transaktion ist. Der Gebührenzahler muss ein Konto sein, das dem System Program gehört.
- 50% verbrannt: Die Hälfte der Basisgebühr wird verbrannt.
- 50% Verteilung: Die Hälfte wird an den Validator gezahlt, der die Transaktion verarbeitet hat.
Priority Fee
Die Priority Fee ist eine optionale Gebühr, die gezahlt wird, um die Wahrscheinlichkeit zu erhöhen, dass der aktuelle Leader Ihre Transaktion verarbeitet.
- SIMD-0096: Der Validator, der die Transaktion verarbeitet, erhält 100% der priority fee.
Compute-Einheiten und Limits
Wenn eine Transaktion verarbeitet wird, nutzt sie Rechenressourcen, die in Compute-Einheiten (CU) gemessen werden. Jede Anweisung zieht vom Compute-Einheiten-Budget der Transaktion ab.
- Maximales Limit: Eine Transaktion kann bis zu 1,4 Millionen Compute-Einheiten verwenden.
- Standard-Limit: Standardmäßig kann jede Anweisung bis zu 200.000 Compute-Einheiten verwenden.
- Benutzerdefiniertes Limit: Sie können ein spezifisches Compute-Einheiten-Limit
anfordern, indem Sie eine
SetComputeUnitLimit
Anweisung in Ihre Transaktion einfügen.
Weitere Details zur Nutzung von Compute-Einheiten:
Weitere Details zur Nutzung von Compute-Einheiten finden Sie im Leitfaden zur Anforderung optimaler Compute-Ressourcen.
Compute-Einheiten-Preis
Der Compute-Einheiten-Preis ist ein optionaler Betrag, angegeben in Mikro-lamport, den Sie für jede angeforderte Compute-Einheit zahlen. Dieser Preis wird verwendet, um die priority fee für Ihre Transaktion zu berechnen.
Nutzen Sie diese Ressourcen, um Echtzeit-Empfehlungen zum aktuellen Compute-Einheiten-Preis zu erhalten:
Anbieter | Priority Fee API |
---|---|
Helius | Dokumentation |
QuickNode | Dokumentation |
Triton | Dokumentation |
Weitere Details zu priority fees finden Sie im Leitfaden zur Verwendung von Priority Fees.
Berechnung der priority fee
Die priority fee wird wie folgt berechnet:
Priority Fee = Compute-Einheiten-Limit × Compute-Einheiten-Preis
Der empfohlene Ansatz für die Festlegung von priority fees besteht darin,
zunächst die Transaktion zu
simulieren, um die
erforderlichen Recheneinheiten zu schätzen. Dann fügt man einen
Sicherheitszuschlag von 10% zu dieser Schätzung hinzu und verwendet den
resultierenden Wert als Compute Unit Limit
.
Die Transaktionspriorität, die bestimmt, wie sie im Verhältnis zu anderen Transaktionen priorisiert wird, wird mit der folgenden Formel berechnet:
Priorität = ((Recheneinheitslimit * Recheneinheitspreis) + Basisgebühr) / (1 + Recheneinheitslimit + Signatur-Recheneinheiten + Schreibsperre-Recheneinheiten)
Verwenden Sie diese Anweisungen, um das Recheneinheitslimit und den Preis für eine Transaktion festzulegen:
SetComputeUnitLimit
um ein spezifisches Einheitenlimit festzulegen.SetComputeUnitPrice
um den Preis pro Recheneinheit zu definieren.
Wenn Sie diese Anweisungen nicht angeben, verwendet die Transaktion das Standard-Recheneinheitslimit mit einem Recheneinheitspreis von 0 (keine priority fee).
Die priority fee hängt vom Recheneinheitslimit ab, das Sie für die Transaktion anfordern, nicht von den tatsächlich verwendeten Recheneinheiten. Wenn Sie ein zu hohes Recheneinheitslimit festlegen oder den Standardbetrag verwenden, könnten Sie für ungenutzte Recheneinheiten bezahlen.
Beispiele
Die folgenden Beispiele zeigen, wie man das Recheneinheitslimit und den Preis für eine Transaktion festlegt.
SDK | Quellcode-Referenz |
---|---|
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?