Cài Đặt
Hãy đảm bảo bạn đã cài đặt tất cả các phụ thuộc cần thiết:
cargo add --dev litesvm litesvm-loader solana-keypair solana-signer
Nếu bài kiểm tra của bạn gọi trực tiếp chương trình đã triển khai, hãy thêm các crate lệnh và giao dịch Solana được sử dụng trong bài kiểm tra của bạn:
cargo add --dev solana-instruction solana-message solana-transaction
litesvm-loader là gì?
Crate litesvm-loader cung cấp các hàm trợ giúp để triển khai chương trình
thông qua BPF upgradeable loader bên trong LiteSVM. Sử dụng nó khi bài kiểm tra
của bạn cần các program account thuộc sở hữu của loader, programdata account,
hoặc hành vi của upgrade authority thay vì chèn trực tiếp một chương trình bằng
svm.add_program(...).
Triển Khai Có Thể Nâng Cấp
- Tạo loader buffer account
- Ghi các byte chương trình theo từng phần
- Triển khai program account cuối cùng với BPF upgradeable loader
- Sử dụng keypair chương trình được cung cấp làm ID chương trình
Quản Lý Upgrade Authority - Thay đổi upgrade authority cho một chương
trình đã được triển khai - Hỗ trợ gán một authority mới - Hỗ trợ truyền None
để làm cho chương trình không thể thay đổi
Trạng Thái Loader Thực Tế - Thực thi cùng mô hình loader account mà chương trình của bạn thấy trên chuỗi - Cho phép các bài kiểm tra kiểm tra program account và programdata account - Giúp phát hiện các lỗi bị ẩn khi chèn chương trình trực tiếp
Đối với hầu hết các bài kiểm thử, svm.add_program(program_id, program_bytes)
vẫn là cách nhanh nhất và đơn giản nhất để tải một chương trình. Hãy sử dụng
litesvm-loader khi bố cục tài khoản loader hoặc quyền nâng cấp là một phần
trong những gì bạn cần kiểm thử.
Ví dụ nhanh
Dưới đây là một ví dụ hoàn chỉnh triển khai một chương trình thông qua upgradeable loader và sau đó xoay vòng quyền của nó:
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();}
Chọn keypair cho chương trình
deploy_upgradeable_program sử dụng đối số program_kp làm địa chỉ chương
trình. Nếu chương trình của bạn khai báo một ID cố định, hãy tải keypair triển
khai đã tạo thay vì tạo một keypair ngẫu nhiên:
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();
Gọi chương trình đã triển khai
Sau khi triển khai, hãy gọi chương trình theo cách tương tự như bạn gọi bất kỳ
chương trình được tải qua LiteSVM. Xây dựng một instruction cho chương trình của
bạn, ký giao dịch và gửi qua cùng một instance 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();
Các thành phần chính
deploy_upgradeable_program
| Đối số | Mô tả |
|---|---|
svm | Instance LiteSVM có thể thay đổi nhận chương trình đã triển khai |
payer_kp | Người trả phí và quyền nâng cấp ban đầu |
program_kp | keypair có khóa công khai trở thành ID chương trình |
program_bytes | Các byte chương trình SBF đã biên dịch, thường lấy từ target/deploy/*.so |
deploy_upgradeable_program tạo một loader buffer, ghi các byte chương trình
theo từng đoạn 512 byte và triển khai chương trình với khả năng nâng cấp trong
tương lai.
set_upgrade_authority
| Đối số | Mô tả |
|---|---|
svm | Instance LiteSVM có thể thay đổi chứa chương trình đã triển khai |
from_keypair | Người trả phí và quyền ký cho giao dịch |
program_address | ID chương trình cần thay đổi quyền |
current_authority_keypair | keypair quyền nâng cấp hiện tại |
new_authority_address | Địa chỉ quyền mới, hoặc None để làm cho chương trình không thể thay đổi |
Trong triển khai helper hiện tại, giao dịch được tạo ra được ký bởi
from_keypair. Truyền authority hiện tại dưới dạng from_keypair, hoặc giữ
payer và authority hiện tại giống nhau, khi thay đổi upgrade authority.
Quy Trình Thường Gặp
Triển khai với program ID đã khai báo
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();
Làm cho program bất biến
set_upgrade_authority(&mut svm,&payer,&program.pubkey(),&payer,None,).unwrap();
Khắc Phục Sự Cố
Các Lỗi Thường Gặp
| Lỗi | Nguyên nhân | Giải pháp |
|---|---|---|
ProgramAccountNotFound hoặc lỗi instruction với ID sai | Quá trình triển khai đã sử dụng Keypair ngẫu nhiên trong khi program yêu cầu một ID đã khai báo | Đọc target/deploy/<program>-keypair.json và truyền keypair đó vào deploy_upgradeable_program |
InsufficientFunds | Payer không có đủ lamport cho loader buffer và program account | Airdrop thêm lamport trước khi triển khai |
MissingRequiredSignature khi thay đổi authority | Authority hiện tại chưa ký giao dịch | Truyền authority hiện tại dưới dạng from_keypair, hoặc giữ payer và authority hiện tại là cùng một keypair |
| Triển khai program chậm hơn dự kiến | Quá trình triển khai loader ghi byte thông qua các loader instruction thực tế | Sử dụng svm.add_program(...) khi bạn không cần trạng thái loader hoặc hành vi upgrade authority |
Is this page helpful?