Набори тестів Solana, що запускають 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 і прямий доступ до стану акаунтів, годинника та sysvar — усе
без виходу з вашого процесу.
Швидкий старт
Встановлення залежностей
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 | Kit-сумісний RPC-інтерфейс (підмножина: 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
Kit-сумісний RPC-інтерфейс для стандартних операцій:
// 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-токенів (монетні двори, ATA, перекази),
посібник з тестування токенів показує, як
плагін tokenProgram() скорочує ~40 рядків налаштування до 3 викликів. Для повної
довідки по API дивіться документацію API.
Is this page helpful?