وثائق سولاناLiteSVMRustصناديق إضافيةlitesvm-loader

البداية السريعة

التثبيت

تأكد من توفر جميع التبعيات المطلوبة:

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

إذا كان اختبارك يستدعي البرنامج المنشور مباشرةً، أضف أيضاً حزم تعليمات ومعاملات سولانا المستخدمة في اختبارك:

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

ما هو litesvm-loader؟

توفر حزمة litesvm-loader مساعدين لنشر البرامج عبر محمّل BPF القابل للترقية داخل LiteSVM. استخدمها عندما يحتاج اختبارك إلى program account مملوكة للمحمّل، أو programdata account، أو سلوك سلطة الترقية، بدلاً من إدراج البرنامج مباشرةً باستخدام svm.add_program(...).

النشر القابل للترقية

  • ينشئ حساب المخزن المؤقت للمحمّل
  • يكتب بيانات البرنامج على دفعات
  • ينشر program account النهائي باستخدام محمّل BPF القابل للترقية
  • يستخدم keypair البرنامج المقدَّم كمعرّف للبرنامج

إدارة سلطة الترقية - تغيير سلطة الترقية لبرنامج منشور مسبقاً - تدعم تعيين سلطة جديدة - تدعم تمرير 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 كعنوان البرنامج. إذا كان برنامجك يُعلن عن معرّف ثابت، فقم بتحميل keypair النشر المُولَّد bدلاً من إنشاء 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_kpkeypair الذي يصبح مفتاحه العام معرّف البرنامج
program_bytesبايتات برنامج SBF المُجمَّع، عادةً من target/deploy/*.so

ينشئ deploy_upgradeable_program مخزن مؤقت للمحمّل، ويكتب بايتات البرنامج على شكل أجزاء بحجم 512 بايت، وينشر البرنامج مع إمكانية الترقية مستقبلاً.

set_upgrade_authority

الوسيطةالوصف
svmنسخة LiteSVM قابلة للتعديل تحتوي على البرنامج المنشور
from_keypairدافع الرسوم وصلاحية التوقيع للمعاملة
program_addressمعرّف البرنامج الذي يجب تغيير صلاحيته
current_authority_keypairkeypair صلاحية الترقية الحالية
new_authority_addressعنوان الصلاحية الجديدة، أو None لجعل البرنامج غير قابل للتعديل

في التنفيذ الحالي للمساعد، يتم توقيع المعاملة المُنشأة بواسطة from_keypair. مرِّر السلطة الحالية بوصفها from_keypair، أو اجعل الدافع والسلطة الحالية متطابقَين، عند تغيير سلطة الترقية.

سير العمل الشائعة

النشر باستخدام معرّف البرنامج المُعلَن

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 أو فشل التعليمات بسبب معرّف خاطئاستخدم النشر معرّف Keypair عشوائيًا بينما يتوقع البرنامج معرّفًا مُعلَنًااقرأ target/deploy/<program>-keypair.json ومرِّر ذلك keypair إلى deploy_upgradeable_program
InsufficientFundsلا يملك الدافع ما يكفي من lamport لـ program account الخاص بالمحمِّل والبرنامجقم بـ Airdrop مزيدًا من lamport قبل النشر
MissingRequiredSignature عند تغيير السلطةلم تقم السلطة الحالية بتوقيع المعاملةمرِّر السلطة الحالية بوصفها from_keypair، أو اجعل الدافع والسلطة الحالية نفس keypair
نشر البرنامج أبطأ من المتوقعيكتب نشر المحمِّل البايتات عبر تعليمات المحمِّل الفعليةاستخدم svm.add_program(...) عندما لا تحتاج إلى حالة المحمِّل أو سلوك سلطة الترقية

Is this page helpful?