Начало работы

Тестовые наборы 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() включает airdrop, поэтому можно добавить в цепочку .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?