Instalacja
Upewnij się, że masz wszystkie wymagane zależności:
cargo add --dev litesvm litesvm-loader solana-keypair solana-signer
Jeśli Twój test wywołuje bezpośrednio wdrożony program, dodaj również skrzynki instrukcji i transakcji Solana używane przez Twój test:
cargo add --dev solana-instruction solana-message solana-transaction
Czym jest litesvm-loader?
Skrzynka litesvm-loader udostępnia pomocniki do wdrażania programów za
pośrednictwem loadera BPF z możliwością aktualizacji w ramach LiteSVM. Użyj jej,
gdy Twój test wymaga program accounts należących do loadera, program data
accounts lub obsługi uprawnień do aktualizacji, zamiast bezpośredniego
wstawiania programu za pomocą svm.add_program(...).
Wdrożenie z możliwością aktualizacji
- Tworzy konto bufora loadera
- Zapisuje bajty programu we fragmentach
- Wdraża końcowy program account za pomocą loadera BPF z możliwością aktualizacji
- Używa dostarczonego keypair programu jako identyfikatora programu
Zarządzanie uprawnieniami do aktualizacji - Zmienia uprawnienia do
aktualizacji dla już wdrożonego programu - Obsługuje przypisywanie nowego
uprawnienia - Obsługuje przekazywanie None w celu uczynienia programu
niezmiennym
Rzeczywisty stan loadera - Wykonuje ten sam model kont loadera, który Twój program widzi w sieci - Umożliwia testom inspekcję program accounts i program data accounts - Pomaga wykrywać błędy ukryte przez bezpośrednie wstawianie programów
W większości testów svm.add_program(program_id, program_bytes) nadal jest
najszybszym i najprostszym sposobem na załadowanie programu. Użyj
litesvm-loader, gdy układ konta loadera lub uprawnienia do aktualizacji są
częścią tego, co chcesz przetestować.
Szybki przykład
Oto kompletny przykład, który wdraża program przez uaktualnialny loader i następnie rotuje jego uprawnienia:
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();}
Wybór keypair programu
deploy_upgradeable_program używa argumentu program_kp jako adresu programu.
Jeśli Twój program deklaruje stałe ID, załaduj wygenerowany keypair wdrożeniowy
zamiast tworzyć losowy 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();
Wywoływanie wdrożonego programu
Po wdrożeniu wywołaj program w taki sam sposób, w jaki wywołujesz dowolny
program załadowany przez LiteSVM. Zbuduj instrukcję dla swojego programu,
podpisz transakcję i wyślij ją przez tę samą instancję 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();
Kluczowe komponenty
deploy_upgradeable_program
| Argument | Opis |
|---|---|
svm | Mutowalna instancja LiteSVM, która otrzymuje wdrożony program |
payer_kp | Płatnik opłat i początkowy organ uprawniony do aktualizacji |
program_kp | keypair, którego klucz publiczny staje się ID programu |
program_bytes | Skompilowane bajty programu SBF, zwykle z target/deploy/*.so |
deploy_upgradeable_program tworzy bufor loadera, zapisuje bajty programu w
porcjach po 512 bajtów i wdraża program z możliwością przyszłych aktualizacji.
set_upgrade_authority
| Argument | Opis |
|---|---|
svm | Mutowalna instancja LiteSVM zawierająca wdrożony program |
from_keypair | Płatnik opłat i organ podpisujący transakcję |
program_address | ID programu, którego uprawnienia mają zostać zmienione |
current_authority_keypair | keypair bieżącego organu uprawnionego do aktualizacji |
new_authority_address | Adres nowego organu uprawnionego lub None, aby program stał się niezmienialny |
W bieżącej implementacji helpera, wygenerowana transakcja jest podpisywana
przez from_keypair. Przekaż bieżący autorytet jako from_keypair lub
zachowaj płatnika i bieżący autorytet jako ten sam keypair podczas zmiany
authority.
Typowe przepływy pracy
Wdrożenie z zadeklarowanym ID programu
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();
Uczyń program niezmiennym
set_upgrade_authority(&mut svm,&payer,&program.pubkey(),&payer,None,).unwrap();
Rozwiązywanie problemów
Typowe błędy
| Błąd | Przyczyna | Rozwiązanie |
|---|---|---|
ProgramAccountNotFound lub błędy instrukcji dla niewłaściwego ID | Podczas wdrożenia użyto losowego Keypair, podczas gdy program oczekuje zadeklarowanego ID | Odczytaj target/deploy/<program>-keypair.json i przekaż ten keypair do deploy_upgradeable_program |
InsufficientFunds | Płatnik nie ma wystarczającej liczby lamport dla program account loadera i programu | Wykonaj airdrop lamport przed wdrożeniem |
MissingRequiredSignature podczas zmiany authority | Bieżący autorytet nie podpisał transakcji | Przekaż bieżący autorytet jako from_keypair lub zachowaj płatnika i bieżący autorytet jako ten sam keypair |
| Wdrożenie programu jest wolniejsze niż oczekiwano | Wdrożenie przez loader zapisuje bajty za pomocą rzeczywistych instrukcji loadera | Użyj svm.add_program(...), gdy nie potrzebujesz stanu loadera ani zachowania authority aktualizacji |
Is this page helpful?