Документация SolanaLiteSVMRustДополнительные контейнерыlitesvm-loader

Быстрый старт

Установка

Убедитесь, что у вас есть все необходимые зависимости:

cargo add --dev litesvm litesvm-loader solana-keypair solana-signer

Если ваш тест напрямую вызывает развёрнутую программу, также добавьте крейты инструкций и транзакций Solana, используемые в вашем тесте:

cargo add --dev solana-instruction solana-message solana-transaction

Что такое litesvm-loader?

Крейт litesvm-loader предоставляет вспомогательные инструменты для развёртывания программ через BPF upgradeable loader внутри LiteSVM. Используйте его, когда в тесте требуется модель аккаунтов program account и program data account, управляемых загрузчиком, или поведение upgrade authority — вместо прямой вставки программы с помощью svm.add_program(...).

Обновляемое развёртывание

  • Создаёт буферный аккаунт загрузчика
  • Записывает байты программы по частям
  • Развёртывает итоговый program account с помощью BPF upgradeable loader
  • Использует предоставленный keypair программы в качестве идентификатора программы

Управление upgrade authority — Изменяет upgrade authority уже развёрнутой программы — Поддерживает назначение новой authority — Поддерживает передачу None для обеспечения неизменяемости программы

Реальное состояние загрузчика - Воспроизводит ту же модель аккаунтов загрузчика, которую ваша программа видит в блокчейне - Позволяет тестам проверять program account и program data account - Помогает выявлять ошибки, скрытые при прямой вставке программы

Для большинства тестов svm.add_program(program_id, program_bytes) по-прежнему остаётся самым быстрым и простым способом загрузки программы. Используйте litesvm-loader, когда структура аккаунта загрузчика или права на обновление являются частью того, что вам нужно протестировать.

Быстрый пример

Вот полный пример, который разворачивает программу через обновляемый загрузчик и затем меняет её права доступа:

use litesvm::LiteSVM;
use litesvm_loader::{deploy_upgradeable_program, set_upgrade_authority};
use solana_keypair::Keypair;
use solana_signer::Signer;
#[test]
fn test_upgradeable_deployment() {
let mut svm = LiteSVM::new();
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();
// Use the keypair that should own the program ID.
// For Anchor programs, this is usually target/deploy/<program>-keypair.json.
let program = Keypair::new();
let program_bytes = include_bytes!("../target/deploy/my_program.so");
deploy_upgradeable_program(&mut svm, &payer, &program, program_bytes).unwrap();
let program_account = svm.get_account(&program.pubkey()).unwrap();
assert!(program_account.executable);
let new_authority = Keypair::new();
set_upgrade_authority(
&mut svm,
&payer,
&program.pubkey(),
&payer,
Some(&new_authority.pubkey()),
)
.unwrap();
}

Выбор keypair программы

deploy_upgradeable_program использует аргумент program_kp в качестве адреса программы. Если ваша программа объявляет фиксированный идентификатор, загрузите сгенерированный keypair для развёртывания вместо создания случайного keypair:

use solana_keypair::read_keypair_file;
let program = read_keypair_file("target/deploy/my_program-keypair.json").unwrap();
deploy_upgradeable_program(&mut svm, &payer, &program, program_bytes).unwrap();

Вызов развёрнутой программы

После развёртывания вызывайте программу так же, как и любую программу, загруженную через LiteSVM. Создайте инструкцию для вашей программы, подпишите транзакцию и отправьте её через тот же экземпляр LiteSVM:

use solana_instruction::Instruction;
use solana_message::Message;
use solana_transaction::Transaction;
let instruction = Instruction::new_with_bytes(
program.pubkey(),
&[], // instruction data for your program
vec![], // account metas for your program
);
let message = Message::new(&[instruction], Some(&payer.pubkey()));
let tx = Transaction::new(&[&payer], message, svm.latest_blockhash());
svm.send_transaction(tx).unwrap();

Ключевые компоненты

deploy_upgradeable_program

АргументОписание
svmИзменяемый экземпляр LiteSVM, который получает развёрнутую программу
payer_kpПлательщик комиссии и начальный орган обновления
program_kpkeypair, чей pubkey становится идентификатором программы
program_bytesСкомпилированные байты SBF-программы, обычно из target/deploy/*.so

deploy_upgradeable_program создаёт буфер загрузчика, записывает байты программы чанками по 512 байт и разворачивает программу с возможностью будущих обновлений.

set_upgrade_authority

АргументОписание
svmИзменяемый экземпляр LiteSVM, содержащий развёрнутую программу
from_keypairПлательщик комиссии и подписывающий орган транзакции
program_addressИдентификатор программы, права которой должны измениться
current_authority_keypairkeypair текущего органа обновления
new_authority_addressАдрес нового органа обновления или None, чтобы сделать программу неизменяемой

В текущей реализации хелпера сгенерированная транзакция подписывается from_keypair. Передайте текущий авторитет как from_keypair или сохраните плательщика и текущий авторитет одинаковыми при смене авторитета обновления.

Общие рабочие процессы

Развёртывание с объявленным идентификатором программы

use solana_keypair::read_keypair_file;
let program = read_keypair_file("target/deploy/my_program-keypair.json").unwrap();
let program_bytes = include_bytes!("../target/deploy/my_program.so");
deploy_upgradeable_program(&mut svm, &payer, &program, program_bytes).unwrap();

Сделать программу неизменяемой

set_upgrade_authority(
&mut svm,
&payer,
&program.pubkey(),
&payer,
None,
)
.unwrap();

Устранение неполадок

Распространённые ошибки

ОшибкаПричинаРешение
ProgramAccountNotFound или сбои инструкций при использовании неверного IDПри развёртывании был использован случайный Keypair, тогда как программа ожидает объявленный IDПрочитайте target/deploy/<program>-keypair.json и передайте этот keypair в deploy_upgradeable_program
InsufficientFundsУ плательщика недостаточно lamport для буфера загрузчика и program accountВыполните airdrop дополнительных lamport перед развёртыванием
MissingRequiredSignature при смене авторитетаТекущий авторитет не подписал транзакциюПередайте текущий авторитет как from_keypair или сохраните плательщика и текущий авторитет как один keypair
Развёртывание программы выполняется медленнее, чем ожидалосьРазвёртывание через загрузчик записывает байты с помощью реальных инструкций загрузчикаИспользуйте svm.add_program(...), если вам не нужно состояние загрузчика или поведение авторитета обновления

Is this page helpful?