Документація 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 у LiteSVM. Використовуйте його, коли вашому тесту потрібні program account, що належать завантажувачу, program data account або поведінка авторитету оновлення, замість безпосереднього додавання програми за допомогою svm.add_program(...).

Розгортання з підтримкою оновлень

  • Створює буферний акаунт завантажувача
  • Записує байти програми частинами
  • Розгортає фінальний program account за допомогою завантажувача BPF upgradeable
  • Використовує наданий keypair програми як ідентифікатор програми

Керування авторитетом оновлення — Змінює авторитет оновлення для вже розгорнутої програми — Підтримує призначення нового авторитету — Підтримує передачу 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, відкритий ключ якого стає ідентифікатором програми
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 або збої інструкцій через неправильний ідентифікаторПід час розгортання використовувався випадковий Keypair, тоді як програма очікує оголошений ідентифікаторЗчитайте target/deploy/<program>-keypair.json і передайте цей keypair до deploy_upgradeable_program
InsufficientFundsПлатник не має достатньо lamports для буфера завантажувача та program accountsПоповніть lamports за допомогою airdrop перед розгортанням
MissingRequiredSignature при зміні авторитетуПоточний авторитет не підписав транзакціюПередайте поточний авторитет як from_keypair або залиште платника та поточний авторитет одним keypair
Розгортання програми відбувається повільніше, ніж очікувалосяРозгортання завантажувача записує байти через реальні інструкції завантажувачаВикористовуйте svm.add_program(...), якщо вам не потрібен стан завантажувача або поведінка авторитету оновлення

Is this page helpful?