البدء السريع

تستغرق مجموعات اختبار سولانا التي تُشغّل 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 payer
client.svm.airdrop(client.payer.address, lamports(5_000_000_000n));
// Check the balance
const 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.payerTransactionSigner الذي قمت بتثبيته عبر إضافة 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 account
client.svm.airdrop(address, lamports(1_000_000_000n));
// Set account state directly
client.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 blockhash
const 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 call
const { value: accounts } = await client.rpc
.getMultipleAccounts([addr1, addr2, addr3])
.send();
// Get latest blockhash
const { value: blockhash } = await client.rpc.getLatestBlockhash().send();

تدعم طبقة RPC ترميز base64 فقط. سيؤدي طلب ترميزات أخرى إلى رمي خطأ.

الإعدادات

قم بإعداد LiteSVM باستخدام أساليب البناء على client.svm:

const client = createClient().use(signer(mySigner)).use(litesvm());
// Configure for testing
client.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 call
await 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 SVM
client.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?

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

تعديل الصفحة