Установка
Убедитесь, что у вас есть все необходимые зависимости:
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 programvec![], // 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_kp | keypair, чей pubkey становится идентификатором программы |
program_bytes | Скомпилированные байты SBF-программы, обычно из target/deploy/*.so |
deploy_upgradeable_program создаёт буфер загрузчика, записывает байты
программы чанками по 512 байт и разворачивает программу с возможностью будущих
обновлений.
set_upgrade_authority
| Аргумент | Описание |
|---|---|
svm | Изменяемый экземпляр LiteSVM, содержащий развёрнутую программу |
from_keypair | Плательщик комиссии и подписывающий орган транзакции |
program_address | Идентификатор программы, права которой должны измениться |
current_authority_keypair | keypair текущего органа обновления |
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?