Початок роботи

Набори тестів 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 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.rpcKit-сумісний 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 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

Kit-сумісний RPC-інтерфейс для стандартних операцій:

// 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-токенів (монетні двори, ATA, перекази), посібник з тестування токенів показує, як плагін tokenProgram() скорочує ~40 рядків налаштування до 3 викликів. Для повної довідки по API дивіться документацію API.

Is this page helpful?