Документация SolanaLiteSVMGoСправочник API

Управление аккаунтами

Методы для пополнения, чтения и записи аккаунтов.

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 SOL
if 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()uint64epoch для 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 = 10
for 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?

Содержание

Редактировать страницу