Maksujen abstraktio

Jokainen Solana-transaktio vaatii SOL:ia verkkokulujen maksamiseen. Mutta maksusovellukseesi tulevat käyttäjät odottavat voivansa käydä kauppaa stablecoineilla – eivät hallinnoida toista tokenia. Maksujen abstraktio poistaa tämän kitkan antamalla jonkun muun maksaa kulut.

Tämä opas kattaa kaksi tasoa:

  1. Miten maksujen sponsorointi toimii – taustalla oleva Solana-primitiivi
  2. Maksujen abstraktio mittakaavassa Koran avulla – tuotantovalmis maksujen abstraktiointipalvelu

Miten maksujen sponsorointi toimii

Solana-transaktioilla on määritetty maksaja – tili, joka maksaa verkkokulujen. Oletuksena tämä on ensimmäinen allekirjoittaja. Voit kuitenkin määrittää eri tilin maksajaksi, jolloin kolmas osapuoli ("sponsori") voi kattaa kulut lähettäjän puolesta.

Sekä lähettäjän että sponsorin on allekirjoitettava transaktio:

  • Lähettäjä allekirjoittaa valtuuttaakseen tokeniensa siirron
  • Sponsori allekirjoittaa valtuuttaakseen verkkokulujen maksamisen

Katso Miten maksut toimivat Solanassa ydinmaksukonsepteja varten.

Alla olevat vaiheet näyttävät ydinkulun. Katso Demo täydellisestä ajettavasta koodista.

Luo sponsoritili

Luo erillinen keypair sponsorille, joka maksaa transaktiokulut. Sponsori tarvitsee SOL:ia kuluihin, mutta sen ei tarvitse pitää hallussaan siirrettäviä tokeneita.

Luo siirto-ohje

Luo tokenin siirto-ohje lähettäjän ollessa valtuutettu. Lähettäjä omistaa tokenit ja hänen on allekirjoitettava siirto.

Sponsor Transaction Fee
const sponsor = await generateKeyPairSigner();
const transferInstruction = getTransferCheckedInstruction({
source: senderAta,
mint: mint.address,
destination: recipientAta,
authority: sender, // Sender signs for the transfer
amount: 250_000n, // adjusted for the mint's decimals
decimals: 6
});

Lähetä sponsorin ollessa maksajana

Luo asiakas sponsori määritettynä maksun maksajaksi käyttämällä payer(sponsor), sitten kutsu client.sendTransaction. Sponsori allekirjoittaa verkkumaksun maksamiseksi samalla kun lähettäjä allekirjoittaa siirron valtuuttamiseksi—sendTransaction kerää jokaisen viitatun allekirjoittajan automaattisesti.

Sponsor Transaction Fee
const sponsor = await generateKeyPairSigner();
const transferInstruction = getTransferCheckedInstruction({
source: senderAta,
mint: mint.address,
destination: recipientAta,
authority: sender,
amount: 250_000n,
decimals: 6
});
const client = createClient()
.use(payer(sponsor)) // Sponsor pays the transaction fees
.use(solanaLocalRpc());
const { context } = await client.sendTransaction([transferInstruction]);

Luo sponsoritili

Luo erillinen keypair sponsorille, joka maksaa transaktiokulut. Sponsori tarvitsee SOL:ia kuluihin, mutta sen ei tarvitse pitää hallussaan siirrettäviä tokeneita.

Luo siirto-ohje

Luo tokenin siirto-ohje lähettäjän ollessa valtuutettu. Lähettäjä omistaa tokenit ja hänen on allekirjoitettava siirto.

Lähetä sponsorin ollessa maksajana

Luo asiakas sponsori määritettynä maksun maksajaksi käyttämällä payer(sponsor), sitten kutsu client.sendTransaction. Sponsori allekirjoittaa verkkumaksun maksamiseksi samalla kun lähettäjä allekirjoittaa siirron valtuuttamiseksi—sendTransaction kerää jokaisen viitatun allekirjoittajan automaattisesti.

Sponsor Transaction Fee
const sponsor = await generateKeyPairSigner();

Demo

Demo
// Generate keypairs for sender, recipient, and sponsor (fee payer)
const sender = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
const sponsor = await generateKeyPairSigner();
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 = getTransferCheckedInstruction({
source: senderAta,
mint: mint.address,
destination: recipientAta,
authority: sender, // Sender signs to authorize the transfer
amount: 250_000n, // 0.25 tokens
decimals: 6
});
// Send transaction with sponsor as fee payer using @solana/kit
// The sponsor (client.payer) pays fees; the sender signs for the transfer
const { context } = await client.sendTransaction([transferInstruction]);
const signature = context.signature;
console.log("\n=== Sponsored Token Payment Complete ===");
console.log("Transaction Signature:", signature.toString());
// Fetch final token account balances from the RPC
const senderBalance = await client.rpc.getTokenAccountBalance(senderAta).send();
const recipientBalance = await client.rpc
.getTokenAccountBalance(recipientAta)
.send();
console.log("\nSender Token Account Balance:", senderBalance.value.uiAmount);
console.log(
"Recipient Token Account Balance:",
recipientBalance.value.uiAmount
);
// Fetch transaction details
const transaction = await client.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.

Kun luot token accountin loppukäyttäjälle, he voivat sulkea sen ja saada takaisin vuokraan käytetyn SOL:n. Harkitse käyttäjiltä veloittamista tilin luomisesta stablecoineilla tai ota tämä kustannus huomioon tuotteesi taloudessa.

Maksun abstrahointi mittakaavassa Koran avulla

Maksajan primitiivi on tehokas, mutta tuotantotason kaasuttoman järjestelmän rakentaminen vaatii enemmän: sponsorilompakoiden hallintaa, token-muunnosten käsittelyä (jotta käyttäjät voivat "maksaa" maksut USDC:llä), nopeusrajoituksia ja turvallisuuskontrolleja.

Kora käsittelee tämän monimutkaisuuden. Se on JSON-RPC-palvelin, joka tarjoaa maksujen abstraktion, joten käyttäjät eivät koskaan tarvitse SOL:ia. Voit sponsoroida maksut kokonaan tai hyväksyä maksun millä tahansa tokenilla.

Ota Kora käyttöön yhdellä komennolla:

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

Osoita sitten Kit-asiakas Kora-palvelimellesi ja lähetä transaktioita samalla yllä käytetyllä API:lla:

pnpm add @solana/kora
import { address } from "@solana/kit";
import { createKitKoraClient } from "@solana/kora";
// A Kora-backed Kit client: Kora is the fee payer, and users pay
// fees in the SPL token of your choice instead of SOL
const kora = await createKitKoraClient({
endpoint: "https://your-kora-instance",
rpcUrl: "https://api.mainnet-beta.solana.com",
feeToken: address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), // USDC
feePayerWallet: sender // Signs to authorize the token fee payment
});
// Same instruction, same call—Kora sponsors the network fee
const { context } = await kora.sendTransaction([transferInstruction]);
console.log("Signature:", context.signature);

Kora-resurssit

Is this page helpful?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.