استدعاء البرامج المتقاطعة
في هذا القسم، يتم تحديث برنامج CRUD من قسم PDA السابق من خلال إضافة استدعاءات البرامج المتقاطعة (CPIs)، وهي ميزة تمكّن برامج سولانا من استدعاء بعضها البعض.
يوضح هذا البرنامج التعليمي أيضًا كيف يمكن للبرامج "التوقيع" لعناوين البرامج المشتقة (PDAs) عند إجراء استدعاءات البرامج المتقاطعة.
تحتاج تعليمات update
وdelete
إلى تعديل للتعامل مع تحويلات SOL بين الحسابات
من خلال استدعاء System Program.
يتضمن الغرض من هذا القسم شرح عملية تنفيذ CPIs في برنامج سولانا باستخدام إطار عمل Anchor، بالاعتماد على مفاهيم PDA التي تم استكشافها في القسم السابق. لمزيد من التفاصيل، راجع صفحة استدعاء البرامج المتقاطعة.
للمرجع، يتضمن هذا الرابط الكود النهائي بعد إكمال قسمي PDA وCPI.
الكود الأولي لهذا القسم يتضمن فقط قسم PDA مكتملاً.
تحديث تعليمة التحديث
أولاً، يحتاج البرنامج إلى آلية "الدفع للتحديث" البسيطة من خلال تغيير بنية
Update
ووظيفة update
.
ابدأ بتحديث ملف lib.rs
لإدخال العناصر من وحدة system_program
.
use anchor_lang::system_program::{transfer, Transfer};
بعد ذلك، قم بتحديث بنية Update
لتشمل حسابًا جديدًا يسمى vault_account
.
هذا الحساب، الذي يتحكم فيه البرنامج، يتلقى SOL من المستخدم عندما يقومون بتحديث
حساب رسالتهم.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
بعد ذلك، أضف منطق CPI في تعليمة update
لتحويل 0.001 SOL من حساب المستخدم إلى
حساب الخزنة.
let transfer_accounts = Transfer {from: ctx.accounts.user.to_account_info(),to: ctx.accounts.vault_account.to_account_info(),};let cpi_context = CpiContext::new(ctx.accounts.system_program.to_account_info(),transfer_accounts,);transfer(cpi_context, 1_000_000)?;
أعد بناء البرنامج.
$build
تحديث تعليمة الحذف
الآن أضف آلية "استرداد عند الحذف" عن طريق تغيير بنية Delete
و دالة
delete
.
أولاً، قم بتحديث بنية Delete
لتشمل vault_account
. هذا يسمح بتحويل أي SOL
في الخزنة مرة أخرى إلى المستخدم عندما يقومون بإغلاق حساب الرسالة الخاص بهم.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
أضف أيضًا system_program
لأن الـ CPI للتحويل يتطلب استدعاء System Program.
pub system_program: Program<'info, System>,
بعد ذلك، أضف منطق CPI في تعليمة delete
لتحويل SOL من حساب الخزنة مرة أخرى إلى
حساب المستخدم.
let user_key = ctx.accounts.user.key();let signer_seeds: &[&[&[u8]]] =&[&[b"vault", user_key.as_ref(), &[ctx.bumps.vault_account]]];let transfer_accounts = Transfer {from: ctx.accounts.vault_account.to_account_info(),to: ctx.accounts.user.to_account_info(),};let cpi_context = CpiContext::new(ctx.accounts.system_program.to_account_info(),transfer_accounts,).with_signer(signer_seeds);transfer(cpi_context, ctx.accounts.vault_account.lamports())?;
لاحظ أن _ctx: Context<Delete>
تتغير إلى ctx: Context<Delete>
لاستخدام السياق في جسم الدالة.
أعد بناء البرنامج.
$build
إعادة نشر البرنامج
بعد إجراء هذه التغييرات، أعد نشر البرنامج المحدث. هذا يضمن أن البرنامج المعدل يصبح متاحًا للاختبار. في سولانا، يتطلب تحديث البرنامج ببساطة نشر البرنامج بنفس معرف البرنامج.
تأكد من أن محفظة Playground الخاصة بك تحتوي على devnet SOL. احصل على devnet SOL من Solana Faucet.
$deploy
تحديث ملف الاختبار
بعد ذلك، قم بتحديث ملف anchor.test.ts
ليشمل حساب الخزنة الجديد في التعليمات.
يتطلب هذا اشتقاق PDA للخزنة وتضمينه في استدعاءات تعليمات التحديث والحذف.
اشتقاق PDA للخزنة
أولاً، أضف اشتقاق PDA للخزنة:
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync([Buffer.from("vault"), wallet.publicKey.toBuffer()],program.programId);
تغيير اختبار التحديث
ثم، قم بتحديث تعليمات التحديث لتشمل vaultAccount
const transactionSignature = await program.methods.update(message).accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
تغيير اختبار الحذف
ثم، قم بتحديث تعليمات الحذف لتشمل vaultAccount
const transactionSignature = await program.methods.delete().accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
إعادة تشغيل الاختبار
بعد إجراء هذه التغييرات، قم بتشغيل الاختبارات للتأكد من أن كل شيء يعمل كما هو متوقع:
$test
يمكنك بعد ذلك فحص روابط SolanaFM لعرض تفاصيل المعاملة، حيث ستجد Cross Program Invocation الخاصة بتعليمات التحويل ضمن تعليمات التحديث والحذف.
استدعاء عبر البرامج للتحديث
استدعاء عبر البرامج للحذف
إذا واجهت أي أخطاء، يمكنك الرجوع إلى الكود النهائي.
الخطوات التالية
تهانينا على إكمال دليل البدء السريع لسولانا. لقد اكتسبت خبرة عملية في مفاهيم سولانا الرئيسية بما في ذلك:
- جلب وقراءة البيانات من الحسابات
- بناء وإرسال المعاملات
- نشر وتحديث برامج سولانا
- العمل مع Program Derived Addresses (PDAs)
- إجراء Cross-Program Invocations (CPIs)
لتعميق فهمك لهذه المفاهيم، راجع وثائق المفاهيم الأساسية التي توفر شروحات مفصلة للموضوعات التي تم تناولها في هذا الدليل.
استكشاف المزيد من الأمثلة
إذا كنت تفضل التعلم من خلال الأمثلة، فراجع مستودع أمثلة البرامج للاطلاع على مجموعة متنوعة من البرامج التوضيحية.
توفر منصة سولانا بلايجراوند ميزة مريحة تتيح لك استيراد أو عرض المشاريع باستخدام روابط GitHub الخاصة بها. على سبيل المثال، افتح رابط سولانا بلايجراوند هذا لعرض مشروع Anchor من مستودع Github هذا.
انقر على زر Import
وأدخل اسم المشروع لإضافته إلى قائمة مشاريعك في سولانا
بلايجراوند. بمجرد استيراد المشروع، يتم حفظ جميع التغييرات وحفظها تلقائيًا.
Is this page helpful?