快速入门

启动 solana-test-validator 的 Solana 测试套件每个测试需要数秒——你在等待进程启动、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 以获取文档和测试套件所使用的确切版本。

通过 @solana/kit 使用 .use() 安装插件来组装 Kit 客户端:签名插件 (@solana/kit-plugin-signer)、 LiteSVM 插件 (@solana/kit-plugin-litesvm), 以及你所需的任何程序插件。最终结果暴露了 client.sendTransaction()client.rpc,以及对账户状态、时钟和系统变量的直接访问——全程无需离开你的进程。

快速开始

安装依赖

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 同时安装为 payeridentity 的简写——如果你想分离这两个角色,可使用同一包中的 payer()identity()。当你连接到真实网络时,solanaRpc() 的安装顺序同样如此。

想要一行代码快速搭建环境?litesvm() 包内置了空投功能,你可以链式调用来自 @solana/kit-plugin-signer.use(generatedPayerWithSol(lamports(10_000_000_000n))) 来自动生成并为付款方充值。

理解客户端

在执行 .use(signer(...)).use(litesvm()) 之后,客户端暴露以下内容:

属性描述
client.payer通过 signer() 插件安装的 TransactionSigner(同时设置为 client.identity
client.identity拥有账户、代币和权限的钱包签名者
client.svm用于账户管理、交易和配置的 LiteSVM 直接实例
client.rpcKit 兼容的 RPC 接口(支持子集:getAccountInfogetBalancegetEpochSchedulegetLatestBlockhashgetMinimumBalanceForRentExemptiongetMultipleAccountsgetSlotrequestAirdrop
client.sendTransaction(s)规划、签名并以交易形式发送指令
client.airdrop从 LiteSVM 水龙头请求 SOL
client.getMinimumBalance计算 rent 豁免所需的最低 lamport 数量

使用 client.svm

直接访问 LiteSVM,用于:

  • 账户管理(setAccountgetAccountairdrop
  • 交易执行(sendTransactionsimulateTransaction
  • 配置(withSigverifywithBlockhashCheck 等)
  • 时间操控(warpToSlotgetClock
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 编码。请求其他编码方式将会抛出错误。

配置

通过 client.svm 上的构建器方法配置 LiteSVM:

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?

Table of Contents

Edit Page
©️ 2026 Solana 基金会版权所有