Методы для пополнения, чтения и записи аккаунтов.
Airdrop
func (s *LiteSVM) Airdrop(pubkey solana.PublicKey, lamports uint64) error
Пополнить аккаунт lamport'ами. Реализован как реальный перевод через System Program из внутреннего крана, поэтому получатель должен иметь возможность хранить итоговый баланс.
priv, err := solana.NewRandomPrivateKey()if err != nil {t.Fatal(err)}payer := priv.PublicKey()// Airdrop 5 SOLif err := svm.Airdrop(payer, 5_000_000_000); err != nil {t.Fatal(err)}
Баланс
func (s *LiteSVM) Balance(pubkey solana.PublicKey) (uint64, bool, error)
Возвращает баланс аккаунта в SOL. Второе значение равно false, если аккаунт
не существует — это отличается от ситуации «аккаунт существует с нулевым количеством lamport'ов».
lamports, ok, err := svm.Balance(payer)if err != nil {t.Fatal(err)}if !ok {t.Log("account does not exist")} else {t.Logf("balance: %d lamports (%.3f SOL)", lamports, float64(lamports)/1e9)}
GetAccount
func (s *LiteSVM) GetAccount(pubkey solana.PublicKey) *Account
Возвращает непрозрачный дескриптор аккаунта или nil, если аккаунт не существует.
Всегда вызывайте Close для дескриптора (или положитесь на финализатор).
acct := svm.GetAccount(payer)if acct == nil {t.Fatal("account missing")}defer acct.Close()_ = acct.Lamports() // uint64_ = acct.Owner() // solana.PublicKey_ = acct.Executable() // bool_ = acct.RentEpoch() // uint64_ = acct.Data() // []byte (copy)
Методы аккаунта
| Метод | Возвращает | Описание |
|---|---|---|
Lamports() | uint64 | Баланс в SOL |
Owner() | solana.PublicKey | Программа-владелец |
Executable() | bool | Является ли аккаунт исполняемым |
RentEpoch() | uint64 | epoch для rent |
Data() | []byte | Копия данных аккаунта |
Close() | - | Освободить базовый дескриптор Rust |
NewAccount
func NewAccount(lamports uint64, data []byte, owner solana.PublicKey, executable bool, rentEpoch uint64) (*Account, error)
Создаёт значение типа Account для передачи в SetAccount. Вызывающая сторона
по-прежнему владеет возвращённым дескриптором и должна вызвать Close.
payload := []byte{1, 2, 3, 4}rent, err := svm.MinimumBalanceForRentExemption(len(payload))if err != nil {t.Fatal(err)}acct, err := litesvm.NewAccount(rent, payload, ownerProgramID, false, 0)if err != nil {t.Fatal(err)}defer acct.Close()
SetAccount
func (s *LiteSVM) SetAccount(pubkey solana.PublicKey, acct *Account) error
Сохраняет копию acct по адресу pubkey. SVM хранит собственную копию; вызывающая сторона
по-прежнему владеет acct и должна вызвать Close.
if err := svm.SetAccount(targetAddr, acct); err != nil {t.Fatal(err)}
SetAccount значительно быстрее выполнения транзакций, когда нужно
заполнить (seed) множество аккаунтов для теста. Убедитесь, что значение lamport'ов составляет
не менее минимума, освобождающего от rent, для данного размера данных.
MinimumBalanceForRentExemption
func (s *LiteSVM) MinimumBalanceForRentExemption(dataLen int) (uint64, error)
Вычисляет количество lamport'ов, необходимое для освобождения от rent аккаунта с заданной длиной данных.
for _, size := range []int{0, 100, 1024} {min, err := svm.MinimumBalanceForRentExemption(size)if err != nil {t.Fatal(err)}t.Logf("%4d bytes -> %d lamports", size, min)}
Управление программами
AddProgram
func (s *LiteSVM) AddProgram(programID solana.PublicKey, bytes []byte) error
Загружает SBF-программу из байтов в памяти.
bytes, err := os.ReadFile("./target/deploy/my_program.so")if err != nil {t.Fatal(err)}if err := svm.AddProgram(programID, bytes); err != nil {t.Fatal(err)}
AddProgramFromFile
func (s *LiteSVM) AddProgramFromFile(programID solana.PublicKey, path string) error
Загружает SBF-программу из файла с расширением .so.
if err := svm.AddProgramFromFile(programID, "./target/deploy/my_program.so"); err != nil {t.Fatal(err)}
AddProgramWithLoader
func (s *LiteSVM) AddProgramWithLoader(programID solana.PublicKey, bytes []byte, loaderID solana.PublicKey) error
Загружает SBF-программу с указанным загрузчиком. Полезно при тестировании с нестандартной версией BPF-загрузчика.
Пакетная настройка аккаунтов
Для тестов, требующих множества заполненных (seeded) аккаунтов, используйте цикл с SetAccount:
const N = 10for i := 0; i < N; i++ {pk := solana.NewWallet().PublicKey()data := []byte{byte(i)}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(pk, acct); err != nil {acct.Close()t.Fatal(err)}acct.Close()}
Всегда вызывайте Close для *Account, возвращённого NewAccount, как только SVM сохранит
свою копию через SetAccount — SVM не принимает ownership дескриптора.
Is this page helpful?