Pierwsze kroki

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 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() 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.payerTransactionSigner zainstalowany za pomocą wtyczki signer() (ustawiany również jako client.identity)
client.identityPodpisujący portfel będący właścicielem kont, tokenów i uprawnień
client.svmBezpośrednia instancja LiteSVM do zarządzania kontami, transakcjami i konfiguracją
client.rpcInterfejs 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.getMinimumBalanceObliczanie 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, withBlockhashCheck itp.)
  • Manipulacja czasem (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();

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 call
const { value: accounts } = await client.rpc
.getMultipleAccounts([addr1, addr2, addr3])
.send();
// Get latest blockhash
const { 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 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

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 call
await 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 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']

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?

Spis treści

Edytuj stronę