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

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

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

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

يتضمن الغرض من هذا القسم شرح عملية تنفيذ CPIs في برنامج Solana باستخدام إطار عمل 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 للتحويل يتطلب استدعاء برنامج النظام.

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

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

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

تأكد من أن محفظة 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 لعرض تفاصيل المعاملة، حيث ستجد استدعاءات البرامج المتقاطعة (CPIs) لتعليمات التحويل ضمن تعليمات التحديث والحذف.

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

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

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

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

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

  • جلب وقراءة البيانات من الحسابات
  • بناء وإرسال المعاملات
  • نشر وتحديث برامج سولانا
  • العمل مع عناوين مشتقة من البرامج (PDAs)
  • إجراء استدعاءات البرامج المتقاطعة (CPIs)

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

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

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

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

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

Is this page helpful?