Επιδεικνύει την άμεση εκκίνηση κατάστασης λογαριασμού με το SetAccount, χωρίς εκτέλεση
συναλλαγών. Αυτό είναι σημαντικά ταχύτερο από το airdropping + χρηματοδότηση μέσω
του runtime όταν χρειάζεστε πολλούς λογαριασμούς έτοιμους για ένα τεστ.
Βασική Ρύθμιση Λογαριασμού
package mytestimport ("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.SystemProgramIDtestAddr := 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 // discriminatorbinary.LittleEndian.PutUint64(data[1:9], 100) // counter// copy(data[9:], ownerPubkey[:]) // ownerrent, 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 είναι ταχύτερο από την εκτέλεση συναλλαγών για μαζική ρύθμιση λογαριασμών, και
διατηρεί τον κώδικα των τεστ σας εστιασμένο στη συμπεριφορά που δοκιμάζεται αντί για
τις υποδομές κατασκευής κατάστασης.
Βασικά Σημεία
- Άμεση κατάσταση - το
SetAccountγράφει την κατάσταση λογαριασμού χωρίς να περνά από το runtime. - Εξαίρεση ενοικίου - χρησιμοποιήστε το
MinimumBalanceForRentExemptionγια τον υπολογισμό lamport πριν κατασκευάσετε τον λογαριασμό. - Ιδιοκτησία - το
NewAccountεπιστρέφει ένα handle που εξακολουθείτε να κατέχετε. Το SVM διατηρεί το δικό του αντίγραφο μετά τοSetAccount· κλείστε το δικό σας όταν τελειώσετε. - Επαλήθευση - χρησιμοποιήστε το
GetAccountγια ανάγνωση σε ένα handle, ή τοBalanceγια έλεγχο μόνο lamport.
Is this page helpful?