كتابة ونشر أول برنامج (Program) على شبكة Solana المحلية

دقائق القراءة: 5

مقدمة

عند الانتقال من بيئات EVM التقليدية إلى شبكة Solana، يكتشف المطور بسرعة أن مفهوم العقد الذكي هنا يُسمى Program، وأن نموذج التنفيذ يختلف جذرياً عن Ethereum. لذلك فإن تشغيل أول برنامج على شبكة محلية هو أفضل نقطة انطلاق لفهم الحسابات، التوقيعات، وتدفق المعاملات دون المخاطرة برصيد فعلي.

في هذا الدليل سنبني برنامجاً بسيطاً على Solana localnet باستخدام Rust وإطار Anchor. إذا كنت قرأت سابقاً مقال استكشاف البلوكتشين البديلة: لماذا يفضل المطورون Solana للسرعة العالية؟ فستكون لديك صورة أوضح عن أسباب اختيار هذه الشبكة، أما من ناحية الأساس البرمجي فمقال نظرة سريعة على لغة Rust: أساسيات لبرمجة العقود الذكية على شبكة Solana يساعد كثيراً قبل بدء التنفيذ.

لماذا نبدأ على localnet؟

العمل على شبكة محلية يمنحك دورة تطوير سريعة جداً: تكتب الكود، تترجمه، تنشره، ثم تختبره خلال ثوانٍ. كما أنك تتحكم بالعقدة بالكامل وتستطيع إعادة ضبط الحالة بسهولة، وهو أمر مثالي أثناء تعلم بنية حسابات Accounts وآليات التوقيع.

بعكس كثير من بيئات Smart Contracts، فإن برامج Solana لا تخزن الحالة داخل الكود نفسه، بل داخل حسابات منفصلة يمررها العميل إلى البرنامج. هذا يعني أن فهم النشر المحلي ليس مجرد خطوة تشغيل، بل تدريب عملي على النموذج المعماري الحقيقي للشبكة.

المتطلبات الأساسية

قبل البدء، يفترض أن تكون أنهيت إعداد البيئة كما في مقال تثبيت بيئة عمل Solana وإطار عمل Anchor لتسهيل كتابة العقود. ستحتاج عملياً إلى الأدوات التالية:

  • تثبيت Rust و Cargo.
  • تثبيت Solana CLI.
  • تثبيت Anchor CLI.
  • وجود Node.js لتشغيل الاختبارات وسكربتات العميل.
  • محفظة محلية عبر ملف keypair.

إنشاء مشروع البرنامج

أنشئ مشروعاً جديداً باستخدام Anchor. هذا الهيكل يوفر لك مجلد البرنامج، ملف الإعدادات، ومسار الاختبارات. الفكرة هنا مشابهة جزئياً لما يقدمه Hardhat في عالم EVM، لكن مع اختلافات واضحة في أسلوب الحسابات والتنفيذ.

anchor init hello_local_solana
cd hello_local_solana

بعدها افتح الملف الموجود داخل المسار programs/hello_local_solana/src/lib.rs واستبدل محتواه ببرنامج بسيط يقوم بإنشاء رسالة ترحيبية داخل سجل التنفيذ.

use anchor_lang::prelude::*;

declare_id!("11111111111111111111111111111111");

#[program]
pub mod hello_local_solana {
    use super::*;

    pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
        msg!("Hello from your first local Solana program!");
        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize {}

رغم أن الكود أعلاه مكتوب بلغة Rust، إلا أننا نضعه داخل قالب التنسيق المطلوب. الدالة initialize تمثل نقطة دخول تعليمية، بينما الوسم #[program] يعرّف مجموعة التعليمات التي يستطيع العميل استدعاءها.

ماذا يفعل هذا البرنامج فعلياً؟

  • يعرّف معرف البرنامج عبر declare_id!.
  • ينشئ تعليمة باسم initialize.
  • يطبع رسالة داخل سجلات المعاملة عبر msg!.
  • لا يطلب أي حسابات في بنية Initialize لأن المثال تمهيدي فقط.

تشغيل الشبكة المحلية وضبط الاتصال

الآن شغّل مدقق Solana test validator في نافذة طرفية مستقلة. هذا المدقق يعمل كبلوكتشين محلي كامل يتيح إنشاء الكتل، استقبال المعاملات، وتخزين الحسابات.

solana-test-validator

في نافذة أخرى، اضبط عنوان RPC المحلي:

solana config set --url localhost

ثم تحقق من المحفظة الحالية، وأنشئ رصيداً تجريبياً محلياً:

solana address
solana airdrop 10

هنا تختلف الفكرة عن بيئات العملات التجريبية العامة. ففي الشبكة المحلية لا تحتاج عادة إلى خدمات خارجية مثل الحصول على عملات تجريبية مجانية (Faucet) للبدء في نشر واختبار العقود الذكية، لأن المدقق المحلي يستطيع منحك رصيداً تجريبياً فورياً.

ترجمة البرنامج ونشره

بعد تجهيز الكود والشبكة، نفذ عملية البناء. سيقوم Anchor بترجمة البرنامج إلى صيغة BPF المناسبة للتنفيذ على Solana VM.

anchor build

بعد نجاح البناء، انشر البرنامج على الشبكة المحلية:

anchor deploy

أثناء النشر سيتم تحميل الملف الثنائي للبرنامج إلى حساب مخصص على السلسلة، ثم ربطه بعنوان Program ID. هذا المعرّف هو ما ستستخدمه لاحقاً عند بناء الواجهة أو عند إرسال المعاملات من السكربتات البرمجية، وهي فكرة قريبة من ربط الواجهة بالعقود في مقال هندسة الويب اللامركزي (Web3.js & Ethers.js): كيف نربط الواجهات بالعقود الذكية؟ لكن بأدوات مختلفة.

لا تعتمد على Program ID عشوائي أو منسوخ من مشروع آخر. أي عدم تطابق بين المعرّف المصرّح به في lib.rs والملفات المولدة قد يؤدي إلى فشل الاستدعاء أو نشر نسخة لا يمكن الوصول إليها بشكل صحيح.

كتابة اختبار يستدعي البرنامج

قوة Anchor تظهر فعلاً عند الاختبار. افتح ملف الاختبار داخل مجلد tests واكتب استدعاء بسيطاً للتعليمة initialize.

const anchor = require("@coral-xyz/anchor");

describe("hello_local_solana", () => {
  const provider = anchor.AnchorProvider.env();
  anchor.setProvider(provider);

  const program = anchor.workspace.HelloLocalSolana;

  it("Calls initialize", async () => {
    const tx = await program.methods.initialize().rpc();
    console.log("Transaction signature:", tx);
  });
});

بعد ذلك شغّل الاختبار:

anchor test --skip-local-validator

استخدام الخيار --skip-local-validator مناسب عندما تكون قد شغلت المدقق المحلي بنفسك. عند نجاح التنفيذ سترى توقيع المعاملة، ويمكنك أيضاً قراءة السجلات للتأكد من ظهور رسالة الترحيب القادمة من msg!.

فهم ما يحدث خلف الكواليس

عندما تستدعي الدالة من الاختبار، لا يتم “تنفيذ كود داخل العقد” بالشكل الشائع في بعض الشبكات الأخرى، بل يتم إنشاء معاملة تحتوي على بيانات التعليمة، ثم تُرسل إلى البرنامج المحدد. يقوم وقت التشغيل في Solana runtime بتحميل البرنامج والحسابات المطلوبة، ثم تنفيذ المنطق والتحقق من التوقيعات والصلاحيات.

هذا التصميم يجعل الفصل بين الكود والبيانات أكثر وضوحاً، ويمنح قابلية أداء مرتفعة جداً. لكنه يفرض على المطور فهماً أعمق للعلاقات بين Accounts و Signers وقيود الوصول، وهي اعتبارات أمنية لا تقل أهمية عن موضوع أمن العقود الذكية في سلاسل أخرى.

في Solana، أخطاء التحقق من الحسابات أخطر من بساطة المثال الحالي. احرص دائماً على تعريف الحسابات المطلوبة بدقة، وتحقق من المالك owner، القابلية للكتابة is_mut، وحالة التوقيع is_signer قبل بناء أي منطق مالي أو إداري.

نصائح عملية قبل الانتقال إلى devnet

خاتمة

كتابة ونشر أول Program على شبكة Solana المحلية ليست مجرد خطوة تعليمية بسيطة، بل هي حجر الأساس لفهم فلسفة هذه الشبكة عالية الأداء. بمجرد أن تتقن إنشاء المشروع، تشغيل المدقق المحلي، تنفيذ build و deploy، وكتابة أول اختبار ناجح، ستكون جاهزاً للانتقال إلى برامج تخزن بيانات حقيقية وتتعامل مع حسابات مخصصة وتعليمات أكثر تعقيداً.

المرحلة التالية المنطقية هي بناء برنامج يحتفظ بحالة داخل حساب مخصص، ثم ربطه بواجهة عميل تقرأ وتكتب البيانات بصورة عملية. عندها ستنتقل من مجرد تجربة محلية إلى تطوير DApps متكاملة على Solana بثقة تقنية أعلى وانضباط برمجي أفضل.

2 comments

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *