Fee-Abstraktion

Jede Solana-Transaktion erfordert SOL zur Zahlung von Netzwerk-Fees. Aber Nutzer, die zu Ihrer Zahlungsanwendung kommen, erwarten Transaktionen in Stablecoins – nicht die Verwaltung eines zweiten Token-Guthabens. Fee-Abstraktion beseitigt diese Reibung, indem jemand anderes die Fees zahlt.

Dieser Leitfaden behandelt zwei Ebenen:

  1. Wie Fee-Sponsoring funktioniert – die zugrunde liegende Solana-Primitive
  2. Fee-Abstraktion im großen Maßstab mit Kora – ein produktionsreifer Fee-Abstraktions-Service

Wie Fee-Sponsoring funktioniert

Solana-Transaktionen haben einen festgelegten Fee-Zahler – das Konto, das die Netzwerk-Fee zahlt. Standardmäßig ist dies der erste Signer. Sie können jedoch ein anderes Konto als Fee-Zahler angeben, sodass ein Dritter (der "Sponsor") Fees im Namen des Absenders übernehmen kann.

Sowohl der Absender als auch der Sponsor müssen die Transaktion signieren:

  • Der Absender signiert, um die Übertragung seiner Token zu autorisieren
  • Der Sponsor signiert, um die Zahlung der Netzwerk-Fee zu autorisieren

Siehe Wie Zahlungen auf Solana funktionieren für grundlegende Zahlungskonzepte.

Die folgenden Schritte zeigen den grundlegenden Ablauf. Siehe die Demo für vollständigen ausführbaren Code.

Sponsor-Konto erstellen

Generieren Sie ein separates Keypair für den Sponsor, der Transaktions-Fees zahlen wird. Der Sponsor benötigt SOL für Fees, muss aber nicht die zu übertragenden Token halten.

Transfer-Instruktion erstellen

Erstellen Sie die Token-Transfer-Instruktion mit dem Absender als Autorität. Der Absender besitzt die Token und muss die Übertragung signieren.

Senden mit Sponsor als Fee-Zahler

Verwenden Sie prepareAndSend mit sowohl authority (dem Absender, der die Übertragung signiert) als auch feePayer (dem Sponsor, der die Fee zahlt). Beide müssen die Transaktion signieren.

Sponsor-Konto erstellen

Generieren Sie ein separates Keypair für den Sponsor, der Transaktions-Fees zahlen wird. Der Sponsor benötigt SOL für Fees, muss aber nicht die zu übertragenden Token halten.

Transfer-Instruktion erstellen

Erstellen Sie die Token-Transfer-Instruktion mit dem Absender als Autorität. Der Absender besitzt die Token und muss die Übertragung signieren.

Senden mit Sponsor als Fee-Zahler

Verwenden Sie prepareAndSend mit sowohl authority (dem Absender, der die Übertragung signiert) als auch feePayer (dem Sponsor, der die Fee zahlt). Beide müssen die Transaktion signieren.

Sponsor Transaction Fee
const sponsor = (await generateKeypair()).signer;

Demo

Demo
// Generate keypairs for sender, recipient, and sponsor (fee payer)
const sender = (await generateKeypair()).signer;
const recipient = (await generateKeypair()).signer;
const sponsor = (await generateKeypair()).signer;
console.log("Sender Address:", sender.address);
console.log("Recipient Address:", recipient.address);
console.log("Sponsor Address (Fee Payer):", sponsor.address);
// Demo Setup: Create client, mint account, token accounts, and fund with initial tokens
const { client, mint } = await demoSetup(sender, recipient, sponsor);
console.log("\nMint Address:", mint.address);
// Derive the Associated Token Accounts addresses (ATAs) for sender and recipient
const [senderAta] = await findAssociatedTokenPda({
mint: mint.address,
owner: sender.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
const [recipientAta] = await findAssociatedTokenPda({
mint: mint.address,
owner: recipient.address,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS
});
console.log("Sender Token Account:", senderAta.toString());
console.log("Recipient Token Account:", recipientAta.toString());
// =============================================================================
// Sponsored Token Payment Demo
// =============================================================================
// Create instruction to transfer tokens from sender to recipient
// Transferring 250,000 base units = 0.25 tokens (with 6 decimals)
const transferInstruction = getTransferInstruction({
source: senderAta,
destination: recipientAta,
authority: sender, // Pass signer, not just address
amount: 250_000n // 0.25 tokens
});
// Prepare and send transaction with sponsor as fee payer using @solana/client
// The sponsor pays transaction fees, sender signs for the transfer
const signature = await client.transaction.prepareAndSend({
authority: sender, // Sender signs the transfer instruction
feePayer: sponsor, // Sponsor pays the transaction fees (different account)
instructions: [transferInstruction],
version: 0
});
console.log("\n=== Sponsored Token Payment Complete ===");
console.log("Transaction Signature:", signature.toString());
// Fetch final token account balances using @solana/client SPL token helper
const splToken = client.splToken({
mint: mint.address,
tokenProgram: "auto"
});
const senderBalance = await splToken.fetchBalance(sender.address);
const recipientBalance = await splToken.fetchBalance(recipient.address);
console.log("\nSender Token Account Balance:", senderBalance);
console.log("Recipient Token Account Balance:", recipientBalance);
// Fetch transaction details
const transaction = await client.runtime.rpc
.getTransaction(signature, {
encoding: "jsonParsed",
maxSupportedTransactionVersion: 0
})
.send();
const feePayer = transaction?.transaction.message.accountKeys?.[0];
console.log("\nNote: The first account in accountKeys is always the fee payer");
console.log("Fee Payer Address:", feePayer);
// =============================================================================
// Demo Setup Helper Function
// =============================================================================
Console
Click to execute the code.

Wenn Sie ein Token-Konto für einen Endbenutzer erstellen, kann dieser es schließen und die für Rent verwendeten SOL zurückfordern. Erwägen Sie, Benutzern die Kontoerstellung in Stablecoins in Rechnung zu stellen, oder berücksichtigen Sie diese Kosten in Ihrer Produktökonomie.

Fee-Abstraktion im großen Maßstab mit Kora

Das Fee-Payer-Primitiv ist leistungsstark, aber der Aufbau eines produktionsreifen Gasless-Systems erfordert mehr: Verwaltung von Sponsor-Wallets, Handhabung von Token-Konvertierungen (damit Benutzer Fees in USDC "zahlen" können), Rate-Limiting und Sicherheitskontrollen.

Kora bewältigt diese Komplexität. Es ist ein JSON-RPC-Server, der Fee-Abstraktion bereitstellt, sodass Benutzer niemals SOL benötigen. Sie können Fees vollständig sponsern oder die Fee-Zahlung in jedem Token akzeptieren.

Deployen Sie Kora mit einem einzigen Befehl:

cargo install kora-cli
kora --config path/to/kora.toml rpc start --signers-config path/to/signers.toml

Verwenden Sie dann den Kora-Client, um Transaktionen zu signieren und zu senden:

pnpm add @solana/kora
import { KoraClient } from "@solana/kora";
const kora = new KoraClient({ rpcUrl: "https://your-kora-instance" });
const { signature } = await kora.signAndSendTransaction({
transaction: base64EncodedTransaction
});

Kora-Ressourcen

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

© 2026 Solana Foundation.
Alle Rechte vorbehalten.
Verbinden Sie sich