تجريد الرسوم

تتطلب كل معاملة على سولانا عملة SOL لدفع رسوم الشبكة. لكن المستخدمين القادمين إلى تطبيق الدفع الخاص بك يتوقعون التعامل بالعملات المستقرة - وليس إدارة رصيد رمز ثانٍ. يزيل تجريد الرسوم هذا الاحتكاك من خلال قيام شخص آخر بدفع الرسوم.

يغطي هذا الدليل مستويين:

  1. كيفية عمل رعاية الرسوم — البنية الأساسية لسولانا
  2. تجريد الرسوم على نطاق واسع باستخدام Kora — خدمة تجريد رسوم جاهزة للإنتاج

كيفية عمل رعاية الرسوم

تحتوي معاملات سولانا على دافع رسوم محدد - الحساب الذي يدفع رسوم الشبكة. افتراضيًا، هذا هو الموقّع الأول. لكن يمكنك تحديد حساب مختلف كدافع للرسوم، مما يسمح لطرف ثالث ("الراعي") بتغطية الرسوم نيابة عن المرسل.

يجب على كل من المرسل والراعي التوقيع على المعاملة:

  • يوقع المرسل للترخيص بنقل رموزه
  • يوقع الراعي للترخيص بدفع رسوم الشبكة

راجع كيفية عمل المدفوعات على سولانا لمفاهيم الدفع الأساسية.

توضح الخطوات أدناه التدفق الأساسي. راجع العرض التوضيحي للحصول على كود كامل قابل للتشغيل.

إنشاء حساب راعٍ

قم بإنشاء زوج مفاتيح منفصل للراعي الذي سيدفع رسوم المعاملات. يحتاج الراعي إلى SOL للرسوم لكنه لا يحتاج إلى الاحتفاظ بالرموز التي يتم نقلها.

إنشاء تعليمات النقل

قم بإنشاء تعليمات نقل الرمز مع المرسل كسلطة. يمتلك المرسل الرموز ويجب عليه التوقيع على النقل.

الإرسال مع الممول كدافع للرسوم

استخدم prepareAndSend مع كل من authority (المرسل الذي يوقع على التحويل) و feePayer (الممول الذي يدفع الرسوم). يجب على كليهما التوقيع على المعاملة.

إنشاء حساب راعٍ

قم بإنشاء زوج مفاتيح منفصل للراعي الذي سيدفع رسوم المعاملات. يحتاج الراعي إلى SOL للرسوم لكنه لا يحتاج إلى الاحتفاظ بالرموز التي يتم نقلها.

إنشاء تعليمات النقل

قم بإنشاء تعليمات نقل الرمز مع المرسل كسلطة. يمتلك المرسل الرموز ويجب عليه التوقيع على النقل.

الإرسال مع الممول كدافع للرسوم

استخدم prepareAndSend مع كل من authority (المرسل الذي يوقع على التحويل) و feePayer (الممول الذي يدفع الرسوم). يجب على كليهما التوقيع على المعاملة.

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

عرض توضيحي

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.

عندما تنشئ حساب رمز لمستخدم نهائي، يمكنه إغلاقه واستعادة SOL المستخدم للإيجار. فكر في فرض رسوم على المستخدمين مقابل إنشاء الحساب بالعملات المستقرة، أو ضع هذه التكلفة في الاعتبار ضمن اقتصاديات منتجك.

تجريد الرسوم على نطاق واسع مع Kora

بدائية دافع الرسوم قوية، لكن بناء نظام بدون رسوم للإنتاج يتطلب المزيد: إدارة محافظ الممولين، والتعامل مع تحويلات الرموز (حتى يتمكن المستخدمون من "دفع" الرسوم بـ USDC)، وتحديد المعدل، وضوابط الأمان.

Kora يتعامل مع هذا التعقيد. إنه خادم JSON-RPC يوفر تجريد الرسوم بحيث لا يحتاج المستخدمون أبدًا إلى SOL. يمكنك تمويل الرسوم بالكامل أو قبول دفع الرسوم بأي رمز.

انشر Kora بأمر واحد:

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

ثم استخدم عميل Kora للتوقيع وإرسال المعاملات:

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

Is this page helpful?

جدول المحتويات

تعديل الصفحة

تدار بواسطة

© 2026 مؤسسة سولانا.
جميع الحقوق محفوظة.
تواصل معنا