Встановлення
Переконайтесь, що у вас є всі необхідні залежності:
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 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, відкритий ключ якого стає ідентифікатором програми |
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 або збої інструкцій через неправильний ідентифікатор | Під час розгортання використовувався випадковий 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?