솔라나 문서LiteSVMRust추가 크레이트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 크레이트는 LiteSVM 내에서 BPF 업그레이드 가능 로더를 통해 프로그램을 배포하기 위한 헬퍼를 제공합니다. 로더 소유의 program account, program data account 또는 업그레이드 권한 동작이 필요한 테스트에서 svm.add_program(...)로 프로그램을 직접 삽입하는 대신 사용하세요.

업그레이드 가능한 배포

  • 로더 버퍼 계정 생성
  • 프로그램 바이트를 청크 단위로 작성
  • BPF 업그레이드 가능 로더를 통해 최종 program account 배포
  • 프로그램 ID로 제공된 program 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 인수를 프로그램 주소로 사용합니다. 프로그램에 고정 ID가 선언되어 있는 경우, 무작위 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_kp공개 키가 프로그램 ID가 되는 keypair
program_bytes컴파일된 SBF 프로그램 바이트, 보통 target/deploy/*.so에서 가져옴

deploy_upgradeable_program은(는) 로더 버퍼를 생성하고, 프로그램 바이트를 512바이트 청크로 기록한 후, 향후 업그레이드를 위한 공간을 확보하여 프로그램을 배포합니다.

set_upgrade_authority

인수설명
svm배포된 프로그램을 포함하는 가변 LiteSVM 인스턴스
from_keypair트랜잭션의 수수료 지불자 및 서명 권한
program_address권한을 변경할 프로그램 ID
current_authority_keypair현재 업그레이드 권한 keypair
new_authority_address새 권한 주소, 또는 프로그램을 불변으로 만들려면 None

현재 헬퍼 구현에서 생성된 트랜잭션은 from_keypair에 의해 서명됩니다. 업그레이드 권한을 변경할 때는 현재 권한을 from_keypair로 전달하거나, payer와 현재 권한을 동일하게 유지하세요.

일반적인 워크플로

선언된 프로그램 ID로 배포하기

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에 대한 명령 실패배포 시 프로그램이 선언된 ID를 기대하는 동안 임의의 Keypair가 사용됨target/deploy/<program>-keypair.json를 읽고 해당 keypair를 deploy_upgradeable_program에 전달하세요
InsufficientFundspayer가 로더 버퍼 및 program account에 필요한 lamport가 부족함배포 전에 lamport를 추가로 에어드롭하세요
권한 변경 시 MissingRequiredSignature현재 권한이 트랜잭션에 서명하지 않음현재 권한을 from_keypair로 전달하거나, payer와 현재 권한을 동일한 keypair로 유지하세요
프로그램 배포가 예상보다 느림로더 배포가 실제 로더 명령을 통해 바이트를 기록함로더 상태나 업그레이드 권한 동작이 필요하지 않을 때 svm.add_program(...)를 사용하세요

Is this page helpful?