Zestawy testów Solany uruchamiające solana-test-validator zajmują sekundy na test —
czekasz na uruchomienie procesu, połączenia RPC i rundy sieciowe.
LiteSVM uruchamia te same testy w milisekundach. Żadnego zewnętrznego procesu, żadnej sieci,
wszystko w pamięci wewnątrz twojego testowego środowiska uruchomieniowego.
Przetestowano z: @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. Te pakiety wtyczek są nowe i szybko się rozwijają
— jeśli napotkasz niezgodność wersji, sprawdź
testing/package.json
pod kątem dokładnych wersji, z którymi działają dokumentacja i zestaw testów.
Klienta Kit z @solana/kit składasz, instalując wtyczki za pomocą
.use(): wtyczkę podpisującą
(@solana/kit-plugin-signer),
wtyczkę LiteSVM
(@solana/kit-plugin-litesvm),
oraz dowolne potrzebne wtyczki programów. Wynik udostępnia client.sendTransaction(),
client.rpc i bezpośredni dostęp do stanu kont, zegara i sysvarów — wszystko
bez opuszczania procesu.
Szybki start
Instalacja zależności
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/system
Tworzenie klienta
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() zwraca pustą powłokę — każde .use(plugin) dokłada
kolejne możliwości. Wtyczka signer() musi być umieszczona przed litesvm(),
ponieważ wtyczka transportu potrzebuje płatnika do powiązania. signer(mySigner) to
skrót instalujący ten sam keypair zarówno jako payer, jak i identity — użyj
payer() lub identity() z tego samego pakietu, jeśli chcesz rozdzielić te
role. Ta kolejność obowiązuje tak samo dla solanaRpc() przy pracy z prawdziwą
siecią.
Wolisz jednolinijkowe konfigurowanie do szybkich eksperymentów? Pakiet litesvm() zawiera
airdrop, więc możesz dołączyć
.use(generatedPayerWithSol(lamports(10_000_000_000n))) z
@solana/kit-plugin-signer, aby automatycznie wygenerować i zasilić płatnika.
Opis klienta
Po .use(signer(...)).use(litesvm()) klient udostępnia:
| Właściwość | Opis |
|---|---|
client.payer | TransactionSigner zainstalowany za pomocą wtyczki signer() (ustawiany również jako client.identity) |
client.identity | Podpisujący portfel będący właścicielem kont, tokenów i uprawnień |
client.svm | Bezpośrednia instancja LiteSVM do zarządzania kontami, transakcjami i konfiguracją |
client.rpc | Interfejs RPC zgodny z Kit (podzbiór: getAccountInfo, getBalance, getEpochSchedule, getLatestBlockhash, getMinimumBalanceForRentExemption, getMultipleAccounts, getSlot, requestAirdrop) |
client.sendTransaction(s) | Planowanie, podpisywanie i wysyłanie instrukcji jako transakcja |
client.airdrop | Żądanie SOL z kranu LiteSVM |
client.getMinimumBalance | Obliczanie minimalnej liczby lamport dla zwolnienia z rent |
Korzystanie z client.svm
Bezpośredni dostęp do LiteSVM umożliwia:
- Zarządzanie kontami (
setAccount,getAccount,airdrop) - Wykonywanie transakcji (
sendTransaction,simulateTransaction) - Konfiguracja (
withSigverify,withBlockhashCheckitp.) - Manipulacja czasem (
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();
Korzystanie z client.rpc
Interfejs RPC zgodny z Kit do standardowych operacji:
// 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();
Warstwa RPC obsługuje wyłącznie kodowanie base64. Żądanie innych kodowań spowoduje zgłoszenie błędu.
Konfiguracja
Konfiguruj LiteSVM za pomocą metod konstruktora na 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
Wysyłanie transakcji
Dodawaj wtyczki programów po wtyczce transportu — podczepiają one konstruktory instrukcji
do klienta, dzięki czemu nigdy nie musisz ręcznie tworzyć 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();
Przepływ SVM → RPC
Stan możesz ustawiać przez SVM i odczytywać przez 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']
Co dalej
Ten przewodnik obejmuje podstawy klienta — tworzenie kont, wysyłanie instrukcji
i odczytywanie stanu. Jeśli twoje testy dotyczą tokenów SPL (minty, ATA, transfery),
poradnik testowania tokenów pokazuje, jak wtyczka
tokenProgram() redukuje ~40 linii konfiguracji do 3 wywołań. Pełne
odniesienie do API znajdziesz w dokumentacji API.
Is this page helpful?