Τεκμηρίωση SolanaLiteSVMGoΠαραδείγματα

Ρύθμιση Λογαριασμού

Επιδεικνύει την άμεση εκκίνηση κατάστασης λογαριασμού με το SetAccount, χωρίς εκτέλεση συναλλαγών. Αυτό είναι σημαντικά ταχύτερο από το airdropping + χρηματοδότηση μέσω του runtime όταν χρειάζεστε πολλούς λογαριασμούς έτοιμους για ένα τεστ.

Βασική Ρύθμιση Λογαριασμού

package mytest
import (
"testing"
litesvm "github.com/LiteSVM/litesvm-go"
solana "github.com/gagliardetto/solana-go"
)
func TestBasicAccountSetup(t *testing.T) {
svm, err := litesvm.New()
if err != nil {
t.Fatal(err)
}
defer svm.Close()
// Calculate minimum balance for rent exemption.
accountData := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
minBalance, err := svm.MinimumBalanceForRentExemption(len(accountData))
if err != nil {
t.Fatal(err)
}
t.Logf("minimum balance for %d bytes: %d lamports", len(accountData), minBalance)
// Owner program (system program in this trivial example).
owner := solana.SystemProgramID
testAddr := solana.NewWallet().PublicKey()
// Build the account handle, then store it.
acct, err := litesvm.NewAccount(minBalance, accountData, owner, false, 0)
if err != nil {
t.Fatal(err)
}
defer acct.Close()
if err := svm.SetAccount(testAddr, acct); err != nil {
t.Fatal(err)
}
t.Log("account state set successfully")
// Retrieve the account back.
retrieved := svm.GetAccount(testAddr)
if retrieved == nil {
t.Fatal("expected account to exist")
}
defer retrieved.Close()
t.Logf(" address: %s", testAddr)
t.Logf(" lamports: %d", retrieved.Lamports())
t.Logf(" owner: %s", retrieved.Owner())
t.Logf(" executable: %v", retrieved.Executable())
t.Logf(" data: %v", retrieved.Data())
// Or just read the balance.
bal, _, err := svm.Balance(testAddr)
if err != nil {
t.Fatal(err)
}
t.Logf("balance: %d lamports", bal)
}

Ρύθμιση Πολλαπλών Λογαριασμών

func TestMultipleAccounts(t *testing.T) {
svm, err := litesvm.New()
if err != nil {
t.Fatal(err)
}
defer svm.Close()
owner := solana.SystemProgramID
// Set up 5 accounts with different data payloads.
addrs := make([]solana.PublicKey, 5)
for i := range addrs {
addrs[i] = solana.NewWallet().PublicKey()
data := []byte{byte(i), byte(i + 1), byte(i + 2)}
rent, err := svm.MinimumBalanceForRentExemption(len(data))
if err != nil {
t.Fatal(err)
}
acct, err := litesvm.NewAccount(rent, data, owner, false, 0)
if err != nil {
t.Fatal(err)
}
if err := svm.SetAccount(addrs[i], acct); err != nil {
acct.Close()
t.Fatal(err)
}
acct.Close()
t.Logf("account %d: %s", i, addrs[i])
}
// Verify each account.
for i, addr := range addrs {
a := svm.GetAccount(addr)
if a == nil {
t.Fatalf("account %d missing", i)
}
t.Logf(" account %d: %d lamports, data[0]=%d", i, a.Lamports(), a.Data()[0])
a.Close()
}
}

Ρύθμιση program data account

Ρυθμίστε ένα program-owned data account σειριοποιώντας τη διάταξη struct σας στα data του λογαριασμού. Αυτό το απόσπασμα εισάγει επιπλέον το encoding/binary:

import "encoding/binary"
func TestProgramDataAccount(t *testing.T) {
svm, err := litesvm.New()
if err != nil {
t.Fatal(err)
}
defer svm.Close()
programID := solana.NewWallet().PublicKey()
dataAddr := solana.NewWallet().PublicKey()
// Example layout: [u8 discriminator, u64 counter, 32-byte owner pubkey]
data := make([]byte, 1+8+32)
data[0] = 0x01 // discriminator
binary.LittleEndian.PutUint64(data[1:9], 100) // counter
// copy(data[9:], ownerPubkey[:]) // owner
rent, err := svm.MinimumBalanceForRentExemption(len(data))
if err != nil {
t.Fatal(err)
}
acct, err := litesvm.NewAccount(rent, data, programID, false, 0)
if err != nil {
t.Fatal(err)
}
defer acct.Close()
if err := svm.SetAccount(dataAddr, acct); err != nil {
t.Fatal(err)
}
t.Logf("program data account set up: %s", dataAddr)
}

SetAccount είναι ταχύτερο από την εκτέλεση συναλλαγών για μαζική ρύθμιση λογαριασμών, και διατηρεί τον κώδικα των τεστ σας εστιασμένο στη συμπεριφορά που δοκιμάζεται αντί για τις υποδομές κατασκευής κατάστασης.

Βασικά Σημεία

  1. Άμεση κατάσταση - το SetAccount γράφει την κατάσταση λογαριασμού χωρίς να περνά από το runtime.
  2. Εξαίρεση ενοικίου - χρησιμοποιήστε το MinimumBalanceForRentExemption για τον υπολογισμό lamport πριν κατασκευάσετε τον λογαριασμό.
  3. Ιδιοκτησία - το NewAccount επιστρέφει ένα handle που εξακολουθείτε να κατέχετε. Το SVM διατηρεί το δικό του αντίγραφο μετά το SetAccount· κλείστε το δικό σας όταν τελειώσετε.
  4. Επαλήθευση - χρησιμοποιήστε το GetAccount για ανάγνωση σε ένα handle, ή το Balance για έλεγχο μόνο lamport.

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.