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:
- Miten maksujen sponsorointi toimii – taustalla oleva Solana-primitiivi
- 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.
const sponsor = (await generateKeypair()).signer;const transferInstruction = getTransferInstruction({source: senderAta,destination: recipientAta,authority: sender, // Sender signs for the transferamount: 250_000n // adjusted for the mint's decimals});
Lähetä sponsorin ollessa maksajana
Käytä prepareAndSend -funktiota sekä authority (lähettäjä, joka
allekirjoittaa siirron) että feePayer (sponsori, joka maksaa maksut).
Molempien on allekirjoitettava transaktio.
const sponsor = (await generateKeypair()).signer;const transferInstruction = getTransferInstruction({source: senderAta,destination: recipientAta,authority: sender,amount: 250_000n});const signature = await client.transaction.prepareAndSend({authority: sender, // Signs the transfer instructionfeePayer: sponsor, // Pays the transaction feesinstructions: [transferInstruction],version: 0});
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 tokensconst { client, mint } = await demoSetup(sender, recipient, sponsor);console.log("\nMint Address:", mint.address);// Derive the Associated Token Accounts addresses (ATAs) for sender and recipientconst [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 addressamount: 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 transferconst signature = await client.transaction.prepareAndSend({authority: sender, // Sender signs the transfer instructionfeePayer: 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 helperconst 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 detailsconst 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// =============================================================================
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 maksun abstrahoinnin, joten käyttäjät eivät koskaan tarvitse SOL:ia. Voit täysin sponsoroida maksut tai hyväksyä maksun missä tahansa tokenissa.
Ota Kora käyttöön yhdellä komennolla:
cargo install kora-clikora --config path/to/kora.toml rpc start --signers-config path/to/signers.toml
Käytä sitten Kora-clientia allekirjoittaaksesi ja lähettääksesi transaktioita:
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-resurssit
Is this page helpful?