تستغرق مجموعات اختبار سولانا التي تُشغّل solana-test-validator ثوانٍ لكل اختبار — فأنت تنتظر بدء تشغيل العملية، واتصالات RPC، ورحلات الشبكة ذهاباً وإياباً. يُشغّل LiteSVM الاختبارات ذاتها في أجزاء من الثانية. لا عملية خارجية، ولا شبكة، كل شيء في الذاكرة داخل مشغّل الاختبار الخاص بك.
اختُبر مع: @solana/kit@6.8.0، @solana/kit-plugin-litesvm@0.10.0،
@solana/kit-plugin-signer@0.10.0، @solana-program/system@0.12.0،
@solana-program/token@0.13.0. هذه الحزم الإضافية جديدة وفي تطور مستمر
— إذا واجهت عدم تطابق، تحقق من
testing/package.json
للاطلاع على الإصدارات الدقيقة التي تعمل عليها الوثائق ومجموعة الاختبارات.
تقوم ببناء عميل Kit من @solana/kit عن طريق تثبيت الإضافات باستخدام
.use(): إضافة الموقّع
(@solana/kit-plugin-signer)،
وإضافة LiteSVM
(@solana/kit-plugin-litesvm)،
وأي إضافات برامج تحتاجها. تتيح النتيجة client.sendTransaction()،
وclient.rpc، والوصول المباشر إلى حالة الحساب والساعة والمتغيرات النظامية — كل ذلك
dون مغادرة عمليتك.
البداية السريعة
تثبيت التبعيات
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/system
إنشاء عميلك
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { litesvm } from "@solana/kit-plugin-litesvm";import { signer } from "@solana/kit-plugin-signer";// Payer first, then the LiteSVM transport.const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm());// Fund the payerclient.svm.airdrop(client.payer.address, lamports(5_000_000_000n));// Check the balanceconst balance = client.svm.getBalance(client.payer.address);console.log("Balance:", balance, "lamports");
createClient() يُعيد هيكلاً فارغاً — كل .use(plugin) يُضيف
قدرات جديدة عليه. يجب أن تأتي إضافة signer() قبل litesvm()
لأن إضافة النقل تحتاج إلى دافع لتوصيله بها. signer(mySigner) هو
اختصار لتثبيت نفس keypair بوصفه كلاً من payer وidentity — استخدم
payer() أو identity() من الحزمة ذاتها إذا أردت فصل هذين
الدورين. هذا الترتيب ينطبق أيضاً على solanaRpc() عند العمل على شبكة حقيقية.
تفضّل إعداداً بسطر واحد للتجارب السريعة؟ تتضمن حزمة litesvm() إمكانية
الإيداع التلقائي، لذا يمكنك التسلسل مع
.use(generatedPayerWithSol(lamports(10_000_000_000n))) من
@solana/kit-plugin-signer لتوليد دافع وتمويله تلقائياً.
فهم العميل
بعد تطبيق .use(signer(...)).use(litesvm())، يُتيح العميل:
| الخاصية | الوصف |
|---|---|
client.payer | TransactionSigner الذي قمت بتثبيته عبر إضافة signer() (يُعيَّن أيضاً كـ client.identity) |
client.identity | موقّع المحفظة الذي يمتلك الحسابات والرموز والصلاحيات |
client.svm | مثيل LiteSVM مباشر لإدارة الحسابات والمعاملات والإعدادات |
client.rpc | واجهة RPC متوافقة مع Kit (مجموعة فرعية: getAccountInfo، getBalance، getEpochSchedule، getLatestBlockhash، getMinimumBalanceForRentExemption، getMultipleAccounts، getSlot، requestAirdrop) |
client.sendTransaction(s) | تخطيط التعليمات وتوقيعها وإرسالها كمعاملة |
client.airdrop | طلب SOL من حنفية LiteSVM |
client.getMinimumBalance | حساب الحد الأدنى من lamport للإعفاء من rent |
استخدام client.svm
وصول مباشر إلى LiteSVM من أجل:
- إدارة الحسابات (
setAccount،getAccount،airdrop) - تنفيذ المعاملات (
sendTransaction،simulateTransaction) - الإعدادات (
withSigverify،withBlockhashCheck، وغيرها) - التحكم بالوقت (
warpToSlot،getClock)
import { address, lamports } from "@solana/kit";// Fund an accountclient.svm.airdrop(address, lamports(1_000_000_000n));// Set account state directlyclient.svm.setAccount({address: myAddress,data: new Uint8Array([1, 2, 3]),executable: false,lamports: lamports(1_000_000n),programAddress: address("11111111111111111111111111111111"),space: 3n});// Get the latest blockhashconst blockhash = client.svm.latestBlockhash();
استخدام client.rpc
واجهة RPC متوافقة مع Kit للعمليات القياسية:
// Get account info (returns base64-encoded data)const { value: account } = await client.rpc.getAccountInfo(address).send();// Get multiple accounts in one callconst { value: accounts } = await client.rpc.getMultipleAccounts([addr1, addr2, addr3]).send();// Get latest blockhashconst { value: blockhash } = await client.rpc.getLatestBlockhash().send();
تدعم طبقة RPC ترميز base64 فقط. سيؤدي طلب ترميزات أخرى إلى رمي خطأ.
الإعدادات
قم بإعداد LiteSVM باستخدام أساليب البناء على client.svm:
const client = createClient().use(signer(mySigner)).use(litesvm());// Configure for testingclient.svm.withSigverify(false) // Skip signature verification.withBlockhashCheck(false) // Skip blockhash validation.withSysvars() // Enable Clock, Rent, etc..withBuiltins() // Enable ed25519, secp256k1.withTransactionHistory(100n); // Store transaction history
إرسال المعاملات
أضف إضافات البرامج بعد طبقة النقل — فهي تُعلّق منشئات التعليمات
على العميل حتى لا تضطر أبداً للتعامل مع TransactionMessage الخام:
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { litesvm } from "@solana/kit-plugin-litesvm";import { signer } from "@solana/kit-plugin-signer";import { systemProgram } from "@solana-program/system";const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm()).use(systemProgram());client.svm.airdrop(client.payer.address, lamports(10_000_000_000n));const recipient = await generateKeyPairSigner();// Build and send in one callawait client.system.instructions.transferSol({source: client.payer,destination: recipient.address,amount: lamports(1_000_000_000n)}).sendTransaction();
تدفق SVM ← RPC
يمكنك تعيين الحالة عبر SVM وقراءتها عبر RPC:
import { address, lamports } from "@solana/kit";// Set account directly via SVMclient.svm.setAccount({address: myAddress,data: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),executable: false,lamports: lamports(1_000_000n),programAddress: address("11111111111111111111111111111111"),space: 4n});// Read via RPC (returns base64-encoded data)const { value } = await client.rpc.getAccountInfo(myAddress).send();console.log("Data:", value?.data); // ['3q2+7w==', 'base64']
ما التالي
يغطي هذا الدليل جوهر العميل — إنشاء الحسابات وإرسال التعليمات
وقراءة الحالة. إذا كانت اختباراتك تتضمن رموز SPL (المطابع، ATAs، التحويلات)، فإن
دليل اختبار الرموز يوضح كيف يُقلّص إضافة tokenProgram()
~40 سطراً من الإعداد إلى 3 استدعاءات فقط. للاطلاع على مرجع API الكامل، راجع وثائق API.
Is this page helpful?