트랜잭션 없이 테스트 계정 상태를 직접 설정하는 방법을 보여줍니다.
기본 계정 설정
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 exemptionconst 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 dataconst 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 separatelyconst balance = client.svm.getBalance(testAddress);console.log("Balance:", balance, "lamports");
여러 계정 설정
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 dataconst 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 RPCconsole.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]}`);}});
Program Data Account 설정
program-owned data account를 설정합니다:
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 IDconst 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 discriminatordata[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 minimumconst minBalance = client.svm.minimumBalanceForRentExemption(BigInt(data.length));// Set the accountclient.svm.setAccount({address: dataAccountAddress,data,executable: false,lamports: lamports(minBalance),programAddress: programId,space: BigInt(data.length)});console.log("Program data account set up:", dataAccountAddress);
setAccount를 사용하면 대량 계정 설정 시 트랜잭션을 실행하는 것보다 빠릅니다.
핵심 사항
- 직접 상태 설정:
setAccount는 트랜잭션 없이 계정 상태를 설정합니다 - 렌트 면제: 필요한 lamport 계산을 위해
minimumBalanceForRentExemption를 사용하세요 - 계정 구조: 모든 필수 필드를 제공하세요: address, data, executable, lamports, programAddress, space
- 검증: 검증을 위해
getAccount또는client.rpc.getAccountInfo를 사용하세요
Is this page helpful?