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