インストール
必要な依存関係がすべて揃っていることを確認してください:
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 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 | 公開鍵がプログラム 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?