Tài liệu SolanaLiteSVMTypeScriptVí dụ

Thiết Lập Tài Khoản

Minh họa cách thiết lập trạng thái tài khoản kiểm thử trực tiếp mà không cần giao dịch.

Thiết Lập Tài Khoản Cơ Bản

import {
createClient,
address,
generateKeyPairSigner,
lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
// Calculate minimum balance for rent exemption
const dataSize = 100n;
const minBalance = client.svm.minimumBalanceForRentExemption(dataSize);
console.log(`Minimum balance for ${dataSize} bytes:`, minBalance, "lamports");
// Set account state directly (no transaction needed)
const programId = address("11111111111111111111111111111111");
const accountData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
const testAddress = address("REPLACE_WITH_TEST_ADDRESS"); // or use generateKeyPairSigner()
client.svm.setAccount({
address: testAddress,
data: accountData,
executable: false,
lamports: lamports(minBalance),
programAddress: programId,
space: BigInt(accountData.length)
});
console.log("Account state set successfully");
// Retrieve the account data
const retrieved = client.svm.getAccount(testAddress);
if (retrieved.exists) {
console.log("Retrieved account:");
console.log(" Address:", retrieved.address);
console.log(" Lamports:", retrieved.lamports);
console.log(" Owner:", retrieved.programAddress);
console.log(" Executable:", retrieved.executable);
console.log(" Data:", Array.from(retrieved.data));
}
// Get balance separately
const balance = client.svm.getBalance(testAddress);
console.log("Balance:", balance, "lamports");

Thiết Lập Nhiều Tài Khoản

import {
createClient,
address,
generateKeyPairSigner,
lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
const programId = address("11111111111111111111111111111111");
// Set up multiple accounts with different data
const account1 = address("Account111111111111111111111111111"); // replace or generateKeyPairSigner()
const account2 = address("Account211111111111111111111111111"); // replace or generateKeyPairSigner()
const account3 = address("Account311111111111111111111111111"); // replace or generateKeyPairSigner()
const account4 = address("Account411111111111111111111111111"); // replace or generateKeyPairSigner()
const account5 = address("Account511111111111111111111111111"); // replace or generateKeyPairSigner()
const accounts = [account1, account2, account3, account4, account5];
for (const [index, accountAddress] of accounts.entries()) {
const customData = new Uint8Array([index, index + 1, index + 2]);
client.svm.setAccount({
address: accountAddress,
data: customData,
executable: false,
lamports: lamports(1_000_000n),
programAddress: programId,
space: BigInt(customData.length)
});
console.log(`Account ${index}: ${accountAddress}`);
}
// Verify accounts via RPC
console.log("\nVerifying via RPC:");
const { value: rpcAccounts } = await client.rpc
.getMultipleAccounts(accounts)
.send();
rpcAccounts.forEach((acc, i) => {
if (acc) {
console.log(
` Account ${i}: ${acc.lamports} lamports, data: ${acc.data[0]}`
);
}
});

Thiết Lập Program Data Account

Thiết lập một program account lưu trữ dữ liệu:

import {
createClient,
address,
generateKeyPairSigner,
lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";
const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).use(litesvm());
// Your program ID
const programId = address("YourProgramId111111111111111111111111111"); // replace or generateKeyPairSigner()
const dataAccountAddress = address("DataAccount111111111111111111111111111"); // replace or generateKeyPairSigner()
// Serialize your account data structure
// This example uses a simple layout: [u8 discriminator, u64 counter, pubkey owner]
const data = new Uint8Array(1 + 8 + 32);
const view = new DataView(data.buffer);
// Set discriminator
data[0] = 0x01;
// Set counter (u64 little-endian)
view.setBigUint64(1, 100n, true);
// Set owner pubkey (32 bytes)
// In practice, you'd decode a real address here
// Calculate rent-exempt minimum
const minBalance = client.svm.minimumBalanceForRentExemption(
BigInt(data.length)
);
// Set the account
client.svm.setAccount({
address: dataAccountAddress,
data,
executable: false,
lamports: lamports(minBalance),
programAddress: programId,
space: BigInt(data.length)
});
console.log("Program data account set up:", dataAccountAddress);

Sử dụng setAccount nhanh hơn so với việc thực thi giao dịch để thiết lập tài khoản hàng loạt.

Các Điểm Chính

  1. Trạng Thái Trực Tiếp: setAccount thiết lập trạng thái tài khoản mà không cần giao dịch
  2. Miễn Phí Thuê: Sử dụng minimumBalanceForRentExemption để tính toán số lamport cần thiết
  3. Cấu Trúc Tài Khoản: Cung cấp tất cả các trường bắt buộc: address, data, executable, lamports, programAddress, space
  4. Xác Minh: Sử dụng getAccount hoặc client.rpc.getAccountInfo để xác minh

Is this page helpful?

Mục lục

Chỉnh sửa trang