SolanaドキュメントLiteSVMRust追加クレートlitesvm-loader

クイックスタート

インストール

必要な依存関係がすべて揃っていることを確認してください:

cargo add --dev litesvm litesvm-loader solana-keypair solana-signer

テストがデプロイ済みプログラムを直接呼び出す場合は、テストで使用する Solana の instructions およびトランザクション用クレートも追加してください:

cargo add --dev solana-instruction solana-message solana-transaction

litesvm-loader とは?

litesvm-loader クレートは、LiteSVM 内で BPF アップグレード可能ローダーを通じてプログラムをデプロイするためのヘルパーを提供します。テストでローダーが所有する program accounts、programdata accounts、またはアップグレード権限の動作が必要な場合に、svm.add_program(...) でプログラムを直接挿入する代わりに使用してください。

アップグレード可能なデプロイ

  • ローダーバッファアカウントを作成する
  • プログラムのバイト列をチャンク単位で書き込む
  • BPF アップグレード可能ローダーで最終的な program account をデプロイする
  • 指定された program keypair をプログラム ID として使用する

アップグレード権限の管理 - デプロイ済みプログラムのアップグレード権限を変更する - 新しい権限の割り当てをサポート - プログラムをイミュータブルにするための None の渡し方をサポート

実際のローダー状態

  • プログラムがオンチェーンで参照するのと同じローダーアカウントモデルを実行する
  • テストで program account および programdata 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 で読み込んだ任意のプログラムと同じ方法でプログラムを呼び出します。プログラムに対する instructions を作成し、トランザクションに署名して、同じ 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 として渡すか、支払者と現在の権限を同じにしてください。

一般的なワークフロー

宣言されたプログラム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に対して失敗するデプロイ時にランダムな Keypair が使用されたが、プログラムは宣言されたIDを期待しているtarget/deploy/<program>-keypair.json を読み込み、そのkeypairを deploy_upgradeable_program に渡す
InsufficientFunds支払者がローダーバッファおよびprogram accountに必要なlamportを十分に持っていないデプロイ前にさらにlamportをエアドロップする
権限変更時の MissingRequiredSignature現在の権限がトランザクションに署名していない現在の権限を from_keypair として渡すか、支払者と現在の権限を同じkeypairにする
プログラムのデプロイが予想より遅いローダーのデプロイは実際のローダーinstructionsを通じてバイトを書き込むローダーの状態またはアップグレード権限の動作が不要な場合は svm.add_program(...) を使用する

Is this page helpful?

© 2026 Solana Foundation. 無断転載を禁じます。