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.

1.000.000 Mikro-lamport = 1 lamport

Nutzen Sie diese Ressourcen, um Echtzeit-Empfehlungen zum aktuellen Compute-Einheiten-Preis zu erhalten:

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:

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.

SDKQuellcode-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 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);
Click to execute the code.

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten