Dokumentacja SolanaLiteSVMRustDodatkowe skrzynielitesvm-loader

Szybki start

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 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();

Kluczowe komponenty

deploy_upgradeable_program

ArgumentOpis
svmMutowalna instancja LiteSVM, która otrzymuje wdrożony program
payer_kpPłatnik opłat i początkowy organ uprawniony do aktualizacji
program_kpkeypair, którego klucz publiczny staje się ID programu
program_bytesSkompilowane 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

ArgumentOpis
svmMutowalna instancja LiteSVM zawierająca wdrożony program
from_keypairPłatnik opłat i organ podpisujący transakcję
program_addressID programu, którego uprawnienia mają zostać zmienione
current_authority_keypairkeypair bieżącego organu uprawnionego do aktualizacji
new_authority_addressAdres 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łądPrzyczynaRozwiązanie
ProgramAccountNotFound lub błędy instrukcji dla niewłaściwego IDPodczas wdrożenia użyto losowego Keypair, podczas gdy program oczekuje zadeklarowanego IDOdczytaj target/deploy/<program>-keypair.json i przekaż ten keypair do deploy_upgradeable_program
InsufficientFundsPłatnik nie ma wystarczającej liczby lamport dla program account loadera i programuWykonaj airdrop lamport przed wdrożeniem
MissingRequiredSignature podczas zmiany authorityBieżący autorytet nie podpisał transakcjiPrzekaż bieżący autorytet jako from_keypair lub zachowaj płatnika i bieżący autorytet jako ten sam keypair
Wdrożenie programu jest wolniejsze niż oczekiwanoWdrożenie przez loader zapisuje bajty za pomocą rzeczywistych instrukcji loaderaUżyj svm.add_program(...), gdy nie potrzebujesz stanu loadera ani zachowania authority aktualizacji

Is this page helpful?