استدعاء البرامج المتقاطعة

في هذا القسم، يتم تحديث برنامج CRUD من قسم PDA السابق من خلال إضافة استدعاءات البرامج المتقاطعة (CPIs)، وهي ميزة تمكّن برامج سولانا من استدعاء بعضها البعض.

يوضح هذا البرنامج التعليمي أيضًا كيف يمكن للبرامج "التوقيع" لعناوين البرامج المشتقة (PDAs) عند إجراء استدعاءات البرامج المتقاطعة.

تحتاج تعليمات update وdelete إلى تعديل للتعامل مع تحويلات SOL بين الحسابات من خلال استدعاء System Program.

يتضمن الغرض من هذا القسم شرح عملية تنفيذ CPIs في برنامج سولانا باستخدام إطار عمل Anchor، بالاعتماد على مفاهيم PDA التي تم استكشافها في القسم السابق. لمزيد من التفاصيل، راجع صفحة استدعاء البرامج المتقاطعة.

للمرجع، يتضمن هذا الرابط الكود النهائي بعد إكمال قسمي PDA وCPI.

الكود الأولي لهذا القسم يتضمن فقط قسم PDA مكتملاً.

تحديث تعليمة التحديث

أولاً، يحتاج البرنامج إلى آلية "الدفع للتحديث" البسيطة من خلال تغيير بنية Update ووظيفة update.

ابدأ بتحديث ملف lib.rs لإدخال العناصر من وحدة system_program.

lib.rs
use anchor_lang::system_program::{transfer, Transfer};

بعد ذلك، قم بتحديث بنية Update لتشمل حسابًا جديدًا يسمى vault_account. هذا الحساب، الذي يتحكم فيه البرنامج، يتلقى SOL من المستخدم عندما يقومون بتحديث حساب رسالتهم.

lib.rs
#[account(
mut,
seeds = [b"vault", user.key().as_ref()],
bump,
)]
pub vault_account: SystemAccount<'info>,

بعد ذلك، أضف منطق CPI في تعليمة update لتحويل 0.001 SOL من حساب المستخدم إلى حساب الخزنة.

lib.rs
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)?;

أعد بناء البرنامج.

Terminal
$
build

تحديث تعليمة الحذف

الآن أضف آلية "استرداد عند الحذف" عن طريق تغيير بنية Delete و دالة delete.

أولاً، قم بتحديث بنية Delete لتشمل vault_account. هذا يسمح بتحويل أي SOL في الخزنة مرة أخرى إلى المستخدم عندما يقومون بإغلاق حساب الرسالة الخاص بهم.

lib.rs
#[account(
mut,
seeds = [b"vault", user.key().as_ref()],
bump,
)]
pub vault_account: SystemAccount<'info>,

أضف أيضًا system_program لأن الـ CPI للتحويل يتطلب استدعاء System Program.

lib.rs
pub system_program: Program<'info, System>,

بعد ذلك، أضف منطق CPI في تعليمة delete لتحويل SOL من حساب الخزنة مرة أخرى إلى حساب المستخدم.

lib.rs
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> لاستخدام السياق في جسم الدالة.

أعد بناء البرنامج.

Terminal
$
build

إعادة نشر البرنامج

بعد إجراء هذه التغييرات، أعد نشر البرنامج المحدث. هذا يضمن أن البرنامج المعدل يصبح متاحًا للاختبار. في سولانا، يتطلب تحديث البرنامج ببساطة نشر البرنامج بنفس معرف البرنامج.

تأكد من أن محفظة Playground الخاصة بك تحتوي على devnet SOL. احصل على devnet SOL من Solana Faucet.

Terminal
$
deploy

تحديث ملف الاختبار

بعد ذلك، قم بتحديث ملف anchor.test.ts ليشمل حساب الخزنة الجديد في التعليمات. يتطلب هذا اشتقاق PDA للخزنة وتضمينه في استدعاءات تعليمات التحديث والحذف.

اشتقاق PDA للخزنة

أولاً، أضف اشتقاق PDA للخزنة:

anchor.test.ts
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), wallet.publicKey.toBuffer()],
program.programId
);

تغيير اختبار التحديث

ثم، قم بتحديث تعليمات التحديث لتشمل vaultAccount

anchor.test.ts
const transactionSignature = await program.methods
.update(message)
.accounts({
messageAccount: messagePda,
vaultAccount: vaultPda
})
.rpc({ commitment: "confirmed" });

تغيير اختبار الحذف

ثم، قم بتحديث تعليمات الحذف لتشمل vaultAccount

anchor.test.ts
const transactionSignature = await program.methods
.delete()
.accounts({
messageAccount: messagePda,
vaultAccount: vaultPda
})
.rpc({ commitment: "confirmed" });

إعادة تشغيل الاختبار

بعد إجراء هذه التغييرات، قم بتشغيل الاختبارات للتأكد من أن كل شيء يعمل كما هو متوقع:

Terminal
$
test

يمكنك بعد ذلك فحص روابط SolanaFM لعرض تفاصيل المعاملة، حيث ستجد Cross Program Invocation الخاصة بتعليمات التحويل ضمن تعليمات التحديث والحذف.

استدعاء عبر البرامج للتحديثاستدعاء عبر البرامج للتحديث

استدعاء عبر البرامج للحذفاستدعاء عبر البرامج للحذف

إذا واجهت أي أخطاء، يمكنك الرجوع إلى الكود النهائي.

الخطوات التالية

تهانينا على إكمال دليل البدء السريع لسولانا. لقد اكتسبت خبرة عملية في مفاهيم سولانا الرئيسية بما في ذلك:

  • جلب وقراءة البيانات من الحسابات
  • بناء وإرسال المعاملات
  • نشر وتحديث برامج سولانا
  • العمل مع Program Derived Addresses (PDAs)
  • إجراء Cross-Program Invocations (CPIs)

لتعميق فهمك لهذه المفاهيم، راجع وثائق المفاهيم الأساسية التي توفر شروحات مفصلة للموضوعات التي تم تناولها في هذا الدليل.

استكشاف المزيد من الأمثلة

إذا كنت تفضل التعلم من خلال الأمثلة، فراجع مستودع أمثلة البرامج للاطلاع على مجموعة متنوعة من البرامج التوضيحية.

توفر منصة سولانا بلايجراوند ميزة مريحة تتيح لك استيراد أو عرض المشاريع باستخدام روابط GitHub الخاصة بها. على سبيل المثال، افتح رابط سولانا بلايجراوند هذا لعرض مشروع Anchor من مستودع Github هذا.

انقر على زر Import وأدخل اسم المشروع لإضافته إلى قائمة مشاريعك في سولانا بلايجراوند. بمجرد استيراد المشروع، يتم حفظ جميع التغييرات وحفظها تلقائيًا.

Is this page helpful?