آخر تحديث: 2025-10-31
ما ستقوم ببنائه
في دليل البدء السريع، تعلمت كيفية إعداد Kora RPC وإجراء الاستدعاءات الأساسية. الآن سنقوم ببناء نظام معاملات كامل بدون رسوم غاز يوضح القدرات الكاملة لـ Kora. بنهاية هذا الدليل، ستكون قد نفذت تدفق معاملات يقوم بـ:
- إنشاء تعليمات تحويل متعددة (رموز SPL وسولانا)
- الحصول على تعليمات الدفع من Kora لتغطية الرسوم
- توقيع المعاملات بمفاتيح المستخدم بينما تتولى Kora رسوم الغاز
- إرسال المعاملات الموقعة بالكامل إلى شبكة سولانا
النتيجة النهائية ستكون نظام معاملات بدون رسوم غاز يعمل بكفاءة:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━KORA GASLESS TRANSACTION DEMO━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[1/6] Initializing clients→ Kora RPC: http://localhost:8080/→ Solana RPC: http://127.0.0.1:8899[2/6] Setting up keypairs→ Sender: BYJVBqQ2xV9GECc84FeoPQy2DpgoonZQFQu97MMWTbBc→ Destination: C8MC9E6nf9Am1rVqdDedDavm53uCJMiSwarEko1aXmny→ Kora signer address: 3Z1Ef7YaxK8oUMoi6exf7wYZjZKWJJsrzJXSt1c3qrDE[3/6] Creating demonstration instructions→ Payment token: 9BgeTKqmFsPVnfYscfM6NvsgmZxei7XfdciShQ6D3bxJ✓ Token transfer instruction created✓ SOL transfer instruction created✓ Memo instruction created→ Total: 3 instructions[4/6] Estimating Kora fee and assembling payment instruction→ Fee payer: 3Z1Ef7Ya...→ Blockhash: 7HZUaMqV...✓ Estimate transaction built✓ Payment instruction received from Kora[5/6] Creating and signing final transaction (with payment)✓ Final transaction built with payment✓ Transaction signed by user[6/6] Signing transaction with Kora and sending to Solana cluster✓ Transaction co-signed by Kora✓ Transaction submitted to network⏳ Awaiting confirmation...━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━SUCCESS: Transaction confirmed on Solana━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━Transaction signature:41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCEView on explorer:https://explorer.solana.com/tx/41hmwmkMfHR5mmhG9sNkjiakwHxpmr1H3Gi3bBL8v5PbsRrH7FhpUT8acHaf2mrPKNVD894dSYXfjp6LfAbVpcCE?cluster=custom&customUrl=http%3A%2F%2Flocalhost%3A8899
لنبدأ ببنائه خطوة بخطوة!
المتطلبات الأساسية
قبل البدء في هذا البرنامج التعليمي، تأكد من توفر ما يلي:
- إكمال دليل البدء السريع لـ Kora - سنستخدم نفس بيئة الاختبار الموجودة في دليل البدء السريع.
- Node.js (إصدار LTS أو أحدث)
- Solana CLI الإصدار v2.2.x أو أحدث
- إلمام بـ معاملات سولانا ورموز SPL
- خادم Kora RPC قيد التشغيل مع موقعين مُعدّين (راجع دليل البدء السريع للحصول على التعليمات)
تدفق معاملات Kora
تتيح Kora المعاملات بدون رسوم غاز من خلال العمل كدافع للرسوم نيابة عن مستخدميك. يتكون تدفق المعاملات بدون رسوم غاز من الخطوات الرئيسية التالية:
- إنشاء المعاملة - بناء المعاملة المقصودة للمستخدم (التحويلات، استدعاءات البرامج، إلخ.)
- تقدير الرسوم - إنشاء معاملة تقديرية لحساب الرسوم المطلوبة
- تعليمات الدفع - الحصول على تعليمات الدفع من Kora التي تحدد مبلغ الرسوم
- توقيع المستخدم - يقوم المستخدم بتوقيع المعاملة بما في ذلك تعليمات الدفع
- التوقيع المشترك من Kora - تتحقق Kora من الدفع وتوقع كدافع للرسوم
- الإرسال - إرسال المعاملة الموقعة بالكامل إلى سولانا
*ملاحظة: يمكن تكوين Kora بحيث لا يتطلب الدفع، ولكننا سنستخدمه لتوضيح التدفق الكامل.
إعداد المشروع
اعتبارات خادم Kora
- قائمة الرموز المسموح بها - يمكن استخدام الرموز المُكوّنة في
kora.tomlفقط للدفع - تأكد من أن الرمز المحدد في.envمُضمّن في kora.toml قائمة السماح الخاصة بك. - قيود البرنامج - يمكن للمعاملات التفاعل فقط مع البرامج المُدرجة في القائمة البيضاء. لقد قمنا بتكوين kora.toml مسبقاً للسماح بالتفاعل مع System Program وToken Program وبرنامج وحدة الحساب وبرنامج Memo.
إعداد العميل
يفترض هذا الدليل أنك أكملت البداية السريعة وأن لديك مشروع تجريبي مُعدّ. إذا لم يكن كذلك، يُرجى إكماله أولاً.
انتقل إلى دليل العميل التجريبي الخاص بك:
cd kora/examples/getting-started/demo/client
ملاحظة: توجد الملفات التجريبية في مستودع GitHub حيث تتطلب إعداد تطوير كاملاً.
التنفيذ
قبل أن نبدأ في تشغيل النسخة التجريبية، دعنا نستعرض النسخة التجريبية الكاملة خطوة بخطوة:
الاستيرادات والتكوين
تبدأ النسخة التجريبية بالاستيرادات والتكوين الضروري:
import { KoraClient } from "@solana/kora";import {createKeyPairSignerFromBytes,getBase58Encoder,createNoopSigner,address,getBase64EncodedWireTransaction,partiallySignTransactionMessageWithSigners,Blockhash,Base64EncodedWireTransaction,partiallySignTransaction,TransactionVersion,Instruction,KeyPairSigner,Rpc,SolanaRpcApi,createSolanaRpc,createSolanaRpcSubscriptions,pipe,createTransactionMessage,setTransactionMessageFeePayerSigner,setTransactionMessageLifetimeUsingBlockhash,MicroLamports,appendTransactionMessageInstructions} from "@solana/kit";import { getAddMemoInstruction } from "@solana-program/memo";import { createRecentSignatureConfirmationPromiseFactory } from "@solana/transaction-confirmation";import {updateOrAppendSetComputeUnitLimitInstruction,updateOrAppendSetComputeUnitPriceInstruction} from "@solana-program/compute-budget";import dotenv from "dotenv";import path from "path";dotenv.config({ path: path.join(process.cwd(), "..", ".env") });const CONFIG = {computeUnitLimit: 200_000,computeUnitPrice: 1_000_000n as MicroLamports,solanaRpcUrl: "http://127.0.0.1:8899",solanaWsUrl: "ws://127.0.0.1:8900",koraRpcUrl: "http://localhost:8080/"};
نقوم باستيراد عميل Kora من Kora SDK وبعض الأنواع/المساعدات من مكتبة Solana Kit لبناء المعاملات.
نقوم أيضاً بإنشاء كائن تكوين عام يحدد:
- ميزانية الحساب - الوحدات والسعر لتحديد أولويات المعاملات
- إصدار المعاملة - استخدام V0لدعم جدول البحث عن العناوين
- نقاط نهاية RPC - خوادم سولانا المحلية وخوادم Kora RPC
اترك هذه الإعدادات الافتراضية الآن - بعد النسخة التجريبية، يمكنك تجربة قيم مختلفة لترى كيف تؤثر على تدفق المعاملات.
الدوال المساعدة
يتضمن العرض التوضيحي دالة مساعدة لتحميل أزواج المفاتيح من متغيرات البيئة:
async function getEnvKeyPair(envKey: string) {if (!process.env[envKey]) {throw new Error(`Environment variable ${envKey} is not set`);}const base58Encoder = getBase58Encoder();const b58SecretEncoded = base58Encoder.encode(process.env[envKey]);return await createKeyPairSignerFromBytes(b58SecretEncoded);}
تقوم هذه الدالة بـ:
- قراءة المفاتيح الخاصة المشفرة بنظام base58 من متغيرات البيئة
- تشفير سلسلة المفتاح الخاص إلى مصفوفة بايت U8
- تحويلها إلى كائنات موقّع زوج المفاتيح
الخطوة 1: تهيئة العملاء
أولاً، نقوم بإعداد اتصالنا بكل من Kora وسولانا:
async function initializeClients() {console.log("\n[1/6] Initializing clients");console.log(" → Kora RPC:", CONFIG.koraRpcUrl);console.log(" → Solana RPC:", CONFIG.solanaRpcUrl);const client = new KoraClient({rpcUrl: CONFIG.koraRpcUrl// apiKey: process.env.KORA_API_KEY, // Uncomment if authentication is enabled// hmacSecret: process.env.KORA_HMAC_SECRET, // Uncomment if HMAC is enabled});const rpc = createSolanaRpc(CONFIG.solanaRpcUrl);const rpcSubscriptions = createSolanaRpcSubscriptions(CONFIG.solanaWsUrl);const confirmTransaction = createRecentSignatureConfirmationPromiseFactory({rpc,rpcSubscriptions});return { client, rpc, confirmTransaction };}
تقوم هذه الدالة بـ:
- إنشاء نسخة عميل Kora من خلال تمرير عنوان URL الخاص بـ Kora RPC.
- إنشاء اتصال Solana RPC مع دعم الاشتراك (سنستخدم هذا لإرسال وتأكيد المعاملات إلى مجموعة سولانا)
- إعداد أدوات تأكيد المعاملات
ملاحظة: ملف kora.toml الخاص بنا لا يتضمن أي مصادقة، لذا لسنا بحاجة إلى تمرير مفتاح api أو سر hmac، لكننا تركنا الكود المعلق عليه للرجوع إليه.
الخطوة 2: إعداد المفاتيح
قم بتحميل أزواج المفاتيح المطلوبة من متغيرات البيئة وجلب عنوان الموقّع في Kora:
async function setupKeys(client: KoraClient) {console.log("\n[2/6] Setting up keypairs");const testSenderKeypair = await getEnvKeyPair("TEST_SENDER_KEYPAIR");const destinationKeypair = await getEnvKeyPair("DESTINATION_KEYPAIR");const { signer_address } = await client.getPayerSigner();console.log(" → Sender:", testSenderKeypair.address);console.log(" → Destination:", destinationKeypair.address);console.log(" → Kora signer address:", signer_address);return { testSenderKeypair, destinationKeypair, signer_address };}
هنا نستخدم دالة getEnvKeyPair لتحميل أزواج المفاتيح من متغيرات البيئة. تمثل
أزواج المفاتيح:
- المرسل - المستخدم الذي يبدأ المعاملة والمسؤول عن الدفع لعقدة Kora برموز الدفع.
- الوجهة - المستلم للتحويلات.
نستخدم أيضاً طريقة getPayerSigner لجلب عنوان موقّع Kora. هذا هو العنوان الذي
سيُستخدم لتوقيع المعاملة بتوقيع Kora. من المهم أن نجلب موقّعاً صالحاً من عقدة
Kora ونستخدمه بشكل متسق في جميع مراحل تدفق المعاملات.
الخطوة 3: إنشاء تعليمات العرض التوضيحي
بعد ذلك، نقوم ببناء مجموعة من التعليمات التي يريد testSender إرسالها إلى
الشبكة. سنستخدم Kora Client لبناء بعض هذه التعليمات ومكتبة @solana/programs
لبناء تعليمات أخرى لتوضيح كيفية استخدام كليهما.
async function createInstructions(client: KoraClient,testSenderKeypair: KeyPairSigner,destinationKeypair: KeyPairSigner) {console.log("\n[3/6] Creating demonstration instructions");const paymentToken = await client.getConfig().then((config) => config.validation_config.allowed_spl_paid_tokens[0]);console.log(" → Payment token:", paymentToken);// Create token transfer (will initialize ATA if needed)const transferTokens = await client.transferTransaction({amount: 10_000_000, // 10 USDC (6 decimals)token: paymentToken,source: testSenderKeypair.address,destination: destinationKeypair.address});console.log(" ✓ Token transfer instruction created");// Create SOL transferconst transferSol = await client.transferTransaction({amount: 10_000_000, // 0.01 SOL (9 decimals)token: "11111111111111111111111111111111", // SOL mint addresssource: testSenderKeypair.address,destination: destinationKeypair.address});console.log(" ✓ SOL transfer instruction created");// Add memo instructionconst memoInstruction = getAddMemoInstruction({memo: "Hello, Kora!"});console.log(" ✓ Memo instruction created");const instructions = [...transferTokens.instructions,...transferSol.instructions,memoInstruction];console.log(` → Total: ${instructions.length} instructions`);return { instructions, paymentToken };}
هناك الكثير مما يحدث هنا، لذا دعنا نستعرضه خطوة بخطوة:
- نستخدم
getConfigللحصول على رمز الدفع من إعدادات Kora. نظرًا لأننا قمنا بإعداد الخادم الخاص بنا، فنحن نعلم أن هناك رمزًا واحدًا فقط في قائمة الرموز المسموح بها، لذلك يمكننا الوصول إليه مباشرة في الموضع الأول (config.validation_config.allowed_spl_paid_tokens[0]). - ننشئ تعليمة نقل الرموز باستخدام طريقة
transferTransactionمن Kora Client. هذه طريقة مساعدة تسهل إنشاء تعليمة نقل الرموز. - ننشئ تعليمة نقل SOL باستخدام طريقة
transferTransactionمن Kora Client. نقوم بتضمين هذا هنا لتوضيح كيفية بناء عمليات نقل SOL باستخدام Kora Client -- لاحظ أننا نستخدم Native SOL mint11111111111111111111111111111111للإشارة إلى أننا نريد نقل SOL بدلاً من نقل رمز SPL. - نضيف تعليمة مذكرة باستخدام دالة
getAddMemoInstructionمن مكتبة @solana/programs. - نجمع جميع التعليمات في مصفوفة واحدة. سنستخدم هذه المصفوفة لبناء معاملة التقدير الخاصة بنا في الخطوة التالية.
الخطوة 4: الحصول على تعليمة الدفع من Kora
إنشاء معاملة ستولد تعليمة دفع إلى Kora مقابل الرسوم المطلوبة لتنفيذ المعاملة.
async function getPaymentInstruction(client: KoraClient,instructions: Instruction[],testSenderKeypair: KeyPairSigner,paymentToken: string): Promise<{ paymentInstruction: Instruction }> {console.log("\n[4/6] Estimating Kora fee and assembling payment instruction");const { signer_address } = await client.getPayerSigner();const noopSigner = createNoopSigner(address(signer_address));const latestBlockhash = await client.getBlockhash();console.log(" → Fee payer:", signer_address.slice(0, 8) + "...");console.log(" → Blockhash:", latestBlockhash.blockhash.slice(0, 8) + "...");// Create estimate transaction to get payment instructionconst estimateTransaction = pipe(createTransactionMessage({ version: 0 }),(tx) => setTransactionMessageFeePayerSigner(noopSigner, tx),(tx) =>setTransactionMessageLifetimeUsingBlockhash({blockhash: latestBlockhash.blockhash as Blockhash,lastValidBlockHeight: 0n},tx),(tx) => appendTransactionMessageInstructions(instructions, tx),(tx) =>updateOrAppendSetComputeUnitPriceInstruction(CONFIG.computeUnitPrice, tx),(tx) =>updateOrAppendSetComputeUnitLimitInstruction(CONFIG.computeUnitLimit, tx));const signedEstimateTransaction =await partiallySignTransactionMessageWithSigners(estimateTransaction);const base64EncodedWireTransaction = getBase64EncodedWireTransaction(signedEstimateTransaction);console.log(" ✓ Estimate transaction built");// Get payment instruction from Koraconst paymentInstruction = await client.getPaymentInstruction({transaction: base64EncodedWireTransaction,fee_token: paymentToken,source_wallet: testSenderKeypair.address});console.log(" ✓ Payment instruction received from Kora");return { paymentInstruction: paymentInstruction.payment_instruction };}
يحتوي Kora SDK على طريقة مساعدة getPaymentInstruction التي ستحسب الرسوم
المطلوبة بالضبط للمعاملة وتنشئ تعليمة تحويل الدفع. إليك كيفية استخدامنا لها:
- أولاً، نقوم بإنشاء
estimateTransactionيتضمن التعليمات المطلوبة -- سيتم محاكاة هذه المعاملة على خادم Kora لتقدير الرسوم المطلوبة للمعاملة. - ثم نقوم بالتوقيع الجزئي على المعاملة للحصول على سلسلة نصية مشفرة بصيغة base64.
- نقوم بتمرير معاملتنا المشفرة بصيغة base64 إلى طريقة
getPaymentInstructionمع رمز الدفع ومصدر الدفع. سيُرجع هذا كائنInstructionيمكننا إضافته إلى معاملتنا.
المفاهيم الأساسية هنا:
- Blockhash صالح - نستخدم طريقة
getBlockhashللحصول على blockhash صالح لمعاملتنا. هذا مطلوب لتقدير المعاملة حيث سيتم محاكاة المعاملة على الخادم. - Noop Signer - موقّع احتياطي يُستخدم عند بناء المعاملات قبل أن يوقع Kora. سيسمح لنا هذا بتحديد دافع الرسوم في معاملتنا قبل الحصول على توقيع Kora. لمزيد من المعلومات حول Noop Signers، راجع توثيق Solana Kit.
- التوقيع الجزئي - للحصول على معاملتنا كسلسلة نصية مشفرة بصيغة base64 (نحتاج هذا لإرسال المعاملة عبر Kora RPC)، نحتاج إلى التوقيع الجزئي على المعاملة. لمزيد من المعلومات حول الموقّعين الجزئيين، راجع توثيق Solana Kit.
الخطوة 5: إنشاء المعاملة النهائية والتوقيع عليها
الآن بعد أن حصلنا على تعليمات الدفع، يمكننا إنشاء معاملة نهائية تتضمن تعليماتنا الأصلية وتعليمات الدفع.
async function getFinalTransaction(client: KoraClient,paymentInstruction: Instruction,testSenderKeypair: KeyPairSigner,instructions: Instruction[],signer_address: string): Promise<Base64EncodedWireTransaction> {console.log("\n[5/6] Creating and signing final transaction (with payment)");const noopSigner = createNoopSigner(address(signer_address));// Build final transaction with payment instructionconst newBlockhash = await client.getBlockhash();const fullTransaction = pipe(createTransactionMessage({ version: 0 }),(tx) => setTransactionMessageFeePayerSigner(noopSigner, tx),(tx) =>setTransactionMessageLifetimeUsingBlockhash({blockhash: newBlockhash.blockhash as Blockhash,lastValidBlockHeight: 0n},tx),(tx) =>appendTransactionMessageInstructions([...instructions, paymentInstruction],tx),(tx) =>updateOrAppendSetComputeUnitPriceInstruction(CONFIG.computeUnitPrice, tx),(tx) =>updateOrAppendSetComputeUnitLimitInstruction(CONFIG.computeUnitLimit, tx));console.log(" ✓ Final transaction built with payment");// Sign with user keypairconst signedFullTransaction =await partiallySignTransactionMessageWithSigners(fullTransaction);const userSignedTransaction = await partiallySignTransaction([testSenderKeypair.keyPair],signedFullTransaction);const base64EncodedWireFullTransaction = getBase64EncodedWireTransaction(userSignedTransaction);console.log(" ✓ Transaction signed by user");return base64EncodedWireFullTransaction;}
نستخدم نفس دالة pipe لتجميع معاملتنا. تتضمن معاملتنا النهائية:
- تعليماتنا الأصلية
- تعليمات الدفع
- blockhash جديد
- نفس موقّع noop المستخدم سابقاً لبناء معاملة التقدير
ثم نستدعي نفس دالة partiallySignTransactionMessageWithSigners للحصول على سلسلة
نصية مشفرة بصيغة base64 للمعاملة. هذه المرة، مع ذلك، نقوم أيضاً بتشغيل
partiallySignTransaction لتوقيع المعاملة باستخدام testSenderKeypair الخاص
بنا. على الرغم من أن عقدة Kora الخاصة بنا تدفع رسوم الشبكة، لا يزال testSender
الخاص بنا بحاجة إلى التوقيع للموافقة على دفع الرموز وتعليمات النقل الأخرى التي
أنشأناها. بالنسبة لعقد Kora التي لا تتطلب دفعاً، قد لا تتطلب تعليمات معينة خطوة
التوقيع هذه. أخيراً، نقوم بإرجاع السلسلة النصية المشفرة بصيغة base64 للمعاملة.
الخطوة 6: إرسال المعاملة
أخيراً، نحتاج إلى جعل عقدة Kora توقع المعاملة حتى نتمكن من إرسال معاملة موقعة
بالكامل إلى الشبكة. نقوم بذلك عن طريق استدعاء طريقة signTransaction على عميل
Kora.
async function submitTransaction(client: KoraClient,rpc: Rpc<SolanaRpcApi>,confirmTransaction: ReturnType<typeof createRecentSignatureConfirmationPromiseFactory>,signedTransaction: Base64EncodedWireTransaction,signer_address: string) {console.log("\n[6/6] Signing transaction with Kora and sending to Solana cluster");// Get Kora's signatureconst { signed_transaction } = await client.signTransaction({transaction: signedTransaction,signer_key: signer_address});console.log(" ✓ Transaction co-signed by Kora");// Submit to Solana networkconst signature = await rpc.sendTransaction(signed_transaction as Base64EncodedWireTransaction, {encoding: "base64"}).send();console.log(" ✓ Transaction submitted to network");console.log(" ⏳ Awaiting confirmation...");await confirmTransaction({commitment: "confirmed",signature,abortSignal: new AbortController().signal});console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");console.log("SUCCESS: Transaction confirmed on Solana");console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");console.log("\nTransaction signature:");console.log(signature);return signature;}
هنا نقوم بثلاثة أشياء:
- نستدعي طريقة
signTransactionعلى عميل Kora لجعل عقدة Kora توقع المعاملة. ستقوم العقدة بفحص المعاملة للتأكد من كفاية الدفع ثم توقع المعاملة. ملاحظة: قد تمكّن بعض عقد Kora طريقةsignTransactionالتي لا تتطلب دفعاً. يمكنك التحقق من إعدادات عقدتك لمعرفة ما إذا كان هذا مفعلاً عن طريق تشغيلgetConfig(). - نرسل المعاملة الموقعة بالكامل إلى شبكة سولانا باستخدام عميل Solana RPC.
- ننتظر تأكيد المعاملة على الشبكة.
دالة التنسيق الرئيسية
تربط الدالة الرئيسية كل شيء معاً وتستدعي كل دالة من دوالنا بالتسلسل:
async function main() {console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");console.log("KORA GASLESS TRANSACTION DEMO");console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");try {// Step 1: Initialize clientsconst { client, rpc, confirmTransaction } = await initializeClients();// Step 2: Setup keysconst { testSenderKeypair, destinationKeypair, signer_address } =await setupKeys(client);// Step 3: Create demo instructionsconst { instructions, paymentToken } = await createInstructions(client,testSenderKeypair,destinationKeypair);// Step 4: Get payment instruction from Koraconst { paymentInstruction } = await getPaymentInstruction(client,instructions,testSenderKeypair,paymentToken);// Step 5: Create and partially sign final transactionconst finalSignedTransaction = await getFinalTransaction(client,paymentInstruction,testSenderKeypair,instructions,signer_address);// Step 6: Get Kora's signature and submit to Solana clusterawait submitTransaction(client,rpc,confirmTransaction,finalSignedTransaction,signer_address);} catch (error) {console.error("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");console.error("ERROR: Demo failed");console.error("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");console.error("\nDetails:", error);process.exit(1);}}
تشغيل العرض التوضيحي الكامل
لتشغيل العرض التوضيحي الكامل للمعاملات بدون رسوم غاز:
1. التأكد من المتطلبات الأساسية
قم بإعداد ثلاث نوافذ طرفية:
- ابدأ مدقق الاختبار المحلي الخاص بك:
solana-test-validator -r
- ابدأ خادم Kora RPC الخاص بك (من دليل examples/getting-started/demo/server):
kora rpc start --signers-config signers.toml
- قم بتهيئة بيئتك (من دليل examples/getting-started/demo/client):
pnpm init-env
2. تشغيل العرض التوضيحي
# From the client directorypnpm full-demo
3. الناتج المتوقع
يجب أن ترى التنفيذ خطوة بخطوة مع معاملة ناجحة في النهاية. ستقوم المعاملة بـ:
- نقل الرموز من المرسل إلى الوجهة
- نقل SOL من المرسل إلى الوجهة
- تضمين رسالة تذكيرية "مرحباً، Kora!"
- دفع الرسوم لمشغل عقدة Kora برمز SPL المُكوّن لديك
- دفع رسوم غاز المعاملة بواسطة مشغل عقدة Kora
خلاصة: فهم سير العمل
لنراجع ما يحدث في هذا العرض التوضيحي:
- نية المستخدم - قام المستخدم بتجميع معاملة تضمنت مجموعة متنوعة من التعليمات التي أراد تنفيذها.
- تقدير الرسوم - قامت Kora بحساب تكلفة المعاملة بالرمز المفضل للمستخدم وأنشأت تعليمة دفع.
- تجميع المعاملة - قام المستخدم بتجميع معاملة نهائية تضمنت تعليمات المستخدم المقصودة وتعليمة دفع Kora.
- توقيع المعاملة - قام المستخدم بتوقيع المعاملة جزئياً بزوج مفاتيحه وأرسلها إلى عقدة Kora للتوقيع بعد التحقق من كفاية الدفع.
- التنفيذ الذري - يرسل المستخدم المعاملة إلى سولانا ويحدث كل شيء في معاملة
واحدة:
- تُنفذ التحويلات المقصودة للمستخدم
- يتم تحويل دفعة الرسوم إلى Kora
- تدفع Kora رسوم شبكة سولانا وتوقع المعاملة
وهكذا، لا يحتاج المستخدمون إلى الاحتفاظ بـ SOL لدفع رسوم الغاز -- يمكنهم الدفع مقابل كل شيء بالرموز التي يمتلكونها بالفعل!
استكشاف الأخطاء وإصلاحها
المشاكل الشائعة
فشل التحقق من صحة المعاملة
- تحقق من إدراج جميع البرامج في القائمة البيضاء في
kora.toml - تأكد من أن عملات الرموز موجودة في
allowed_spl_paid_tokens - تأكد من أن المعاملة لا تتجاوز
max_allowed_lamports
فشل إنشاء تعليمات الدفع
- تأكد من أن معاملة التقدير تحتوي على blockhash حديث للمحاكاة
- تحقق من أن عنوان الدفع الخاص بـ Kora قد قام بتهيئة ATAs
- تأكد من تكوين رمز الدفع بشكل صحيح
فشل التحقق من التوقيع
- تأكد من تضمين جميع الموقعين المطلوبين (Kora وأي موقعين مطلوبين لمدفوعات الرموز أو التعليمات الأخرى المضمنة في معاملتك)
- تحقق من عدم تعديل المعاملة بعد التوقيع
- تأكد من تحميل أزواج المفاتيح بشكل صحيح
الخلاصة
تهانينا! لقد نجحت في تنفيذ تدفق معاملات كامل بدون رسوم غاز باستخدام Kora.
تجعل Kora من الممكن تزويد المستخدمين بتجربة Web3 سلسة حيث لن يحتاجوا أبدًا للقلق بشأن رسوم الغاز أو الاحتفاظ بـ SOL. سواء كنت تقوم ببناء منصة NeoBank أو منصة ألعاب أو منصة ستاكينج سائلة، فإن معاملات Kora بدون رسوم غاز تزيل عائقًا رئيسيًا أمام تبني المستخدمين.
نصيحة: للحصول على تكامل أبسط، راجع دليل Kit Client. يتعامل واجهة برمجة التطبيقات
createKitKoraClient()تلقائيًا مع إدارة blockhash وتقدير الرسوم وإدراج تعليمات الدفع وإرسال المعاملات — مما يقلل الخطوات اليدوية الموضحة في هذا الدليل إلى بضعة أسطر من التعليمات البرمجية.
موارد إضافية
- هل تحتاج إلى مساعدة؟ اطرح أسئلة على
Solana Stack Exchange مع وسم
Kora - دليل تكوين Kora - خيارات التكوين التفصيلية
- دليل الموقعين - إدارة أنواع الموقعين المختلفة
- مرجع واجهة برمجة التطبيقات - وثائق طرق RPC الكاملة
- مستودع GitHub - التعليمات البرمجية المصدرية والأمثلة
- Kora SDK - SDK للتفاعل مع نقاط نهاية Kora RPC
Is this page helpful?