Skip to main content
هذه الصفحة مُترجَمة آليًا بواسطة الذكاء الاصطناعي. النسخة الإنجليزية هي المرجع المعتمد.عرض النسخة الإنجليزية →
برامج Raydium الأحدث (CPMM و CLMM و Farm v6 و LaunchLab) مكتوبة بـ Anchor — إطار عمل Rust يبني على نموذج برنامج Solana الأصلي لتوفير التحقق من الحسابات ومعالجة الأخطاء و IDL (وصف الواجهة). يسبق AMM v4 والمزارع الأقدم Anchor. فهم كلا النموذجين يساعدك على قراءة الكود وإنشاء عملاء من IDL وتصحيح الأخطاء غير المتوقعة.

نموذج نشر البرنامج

كل برنامج Solana يعيش في Pubkey. يتم تخزين bytecode البرنامج في حساب قابل للتنفيذ مملوك لـ BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111). يتكون نشر البرنامج من ثلاثة حسابات:
  1. حساب البرنامج: حساب بيانات وصفية صغير في معرّف البرنامج. المالك: BPF Upgradable Loader.
  2. حساب ProgramData: يحتفظ بـ bytecode الفعلي. مشتق من [program_id, "programdata"].
  3. حساب Buffer (مؤقت): يحتفظ بـ bytecode جديد أثناء الترقية. يتم حذفه بعد الترقية.
حساب ProgramData له سلطة ترقية — مفتاح يمكنه استبدال bytecode بنسخة جديدة. سلطة ترقية Raydium هي multisig خلف timelock مدته 24 ساعة؛ انظر security/admin-and-multisig.

التحقق من برنامج مُنشّر

للتأكد من أن ما هو على السلسلة يطابق ما هو في المصدر المعتمد من التدقيق:
تثبت الـ hashes المتطابقة أنك تتفاعل مع المصدر الذي تعتقد أنك تتفاعل معه. تنشر Raydium تعليمات البناء المُتحقق منها في ملاحظات الإصدار.

Anchor: إطار عمل فوق Solana

برامج Solana الخام هي دوال Rust بهذا التوقيع:
يلف Anchor كل الكود المتكرر ويسمح لك بالكتابة:
يقوم Anchor بـ:
  • إنشاء discriminator حتمي بـ 8 بايتات لكل تعليمة ولكل نوع حساب.
  • التحقق من قيود الحساب (المالك والـ seeds والـ writable والـ signer ومطابقة الـ mint ومطابقة برنامج الرموز) قبل تشغيل الكود الخاص بك.
  • إنشاء IDL — ملف وصف الواجهة الذي يستخدمه العملاء لاستدعاء البرنامج.
  • يأتي مع مكتبة عميل Rust و TypeScript و Python.

discriminator بـ 8 بايتات

كل حساب Anchor وكل تعليمة Anchor تبدأ بـ discriminator بـ 8 بايتات — أول 8 بايتات من SHA-256 لسلسلة ثابتة:
عند استدعاء تعليمة Anchor، أول 8 بايتات من بيانات التعليمة هي هذا discriminator؛ يقوم Anchor بالتوجيه إلى المعالج الصحيح من خلال البحث عنها. عند قراءة حساب Anchor، أول 8 بايتات تخبرك بنوعه — حاسم لأدوات مثل getProgramAccounts التي تعدد جميع الحسابات من نوع معين.

الأخطاء

تحدد برامج Anchor الأخطاء عبر #[error_code]:
يقوم Anchor بتعيين هذه الأكواد الرقمية تلقائيًا بدءًا من 6000 (0x1770). جدول أكواد الأخطاء الكامل لـ Raydium موجود في reference/error-codes.

IDL

ملف IDL (لغة وصف الواجهة) الخاص بـ Anchor هو وصف JSON لبرنامج: تعليماته وحساباته وأنواعه وأخطاؤه وأحداثه. إنه معادل Ethereum ABI. تنشر Raydium IDLs لجميع برامج Anchor. جلب مباشر من على السلسلة:
أو من مصدر SDK: src/raydium/*/idl/*.json.

هيكل IDL

إنشاء عميل من IDL

يقوم CLI anchor الخاص بـ Anchor بإنشاء أنواع TypeScript و Rust:
يمكن لأدوات الجهات الخارجية مثل Codama إنشاء عملاء Rust أو Go أو Python أو JavaScript من IDL. (و Codama هو خليفة Kinobi من Metaplex، الذي لم يشحن قط سوى مُصيِّر JavaScript.)

عندما يكون IDL صديقك

إذا كنت تريد بناء تكامل مخصص لا يمر عبر Raydium SDK:
  1. جلب IDL (مباشر من على السلسلة أو من مصدر SDK).
  2. البحث عن التعليمة التي تريدها (مثل swap_base_input).
  3. بناء بيانات التعليمة: discriminator بـ 8 بايتات + الحجج المشفرة.
  4. تمرير الحسابات بالترتيب الذي يحدده IDL.
انظر sdk-api/anchor-idl للحصول على أمثلة عملية.

برامج ما قبل Anchor: AMM v4 و Farm v3/v5

هذه البرامج تسبق Anchor. تستخدم:
  • توزيع التعليمات اليدوي: علامة u8 في instruction_data مع بيان match.
  • التحقق من الحساب اليدوي: if accounts[0].owner != &expected_program { ... }.
  • حجج التعليمات المسلسلة بـ Borsh: لا توجد discriminator، فقط instruction_data[1..].
  • التخطيط عبر #[repr(C, packed)]: تخطيط ثنائي لهيكل C.
يشحن Raydium SDK v2 تخطيطات TypeScript لتعليمات AMM v4 غير Anchor بحيث يمكن للعملاء الترميز/فك الترميز بدون Anchor:
نمط التكامل هو نفسه — فقط لا تحصل على إنشاء Anchor الآلي المدفوع بـ IDL.

ميكانيكا ترقية البرنامج

فقط upgrade_authority الخاص بـ ProgramData يمكنه الترقية. الخطوات:
  1. ترجمة bytecode جديد.
  2. كتابته إلى حساب buffer (solana program write-buffer).
  3. تقديم تعليمة ترقية: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. يقوم وقت التشغيل بالاستبدال الذري لـ bytecode البرنامج بمحتويات buffer.
تضع Raydium هذا خلف timelock مدته 24 ساعة مُنفذ في إعدادات multisig الخاص بـ Squads. يجب أن تنتظر معاملة الترقية 24 ساعة بعد موافقة multisig قبل التنفيذ. هذا يحمي من الترقيات المستعجلة / المكرهة. انظر security/admin-and-multisig.

جعل برنامج غير قابل للتغيير

يمكن تعيين سلطة الترقية إلى None، وعند هذه النقطة يصبح البرنامج غير قابل للتغيير بشكل دائم. لم تقم Raydium بهذا لأي منتج — يحتفظ الفريق بالقدرة على دفع إصلاحات الأمان. المقايضة: يجب على المستخدمين الثقة في عملية multisig + timelock.

البرامج والإيجار

نشر برنامج يستهلك lamports معفاة من الإيجار:
  • برنامج بحجم 50 كيلوبايت: ~0.35 SOL في الإيجار.
  • برنامج بحجم 200 كيلوبايت: ~1.4 SOL في الإيجار.
إغلاق برنامج (عبر solana program close) يعيد lamports. تبقى برامج Raydium نشطة ولا يتم جدولة إغلاقها.

تصحيح برامج Anchor

إخراج السجل

يكتب ماكرو msg! الخاص بـ Anchor إلى سجل المعاملة. محاكاة معاملة لرؤية السجلات:
تتضمن السجلات:
  • استدعاء البرنامج (Program CPMMoo8... invoke [1]).
  • استدعاءات msg! من كود البرنامج.
  • استهلاك وحدة الحساب (consumed 137842 of 400000 compute units).
  • نجاح البرنامج أو خطأ.

أكواد الأخطاء

إذا رمى برنامج Anchor خطأ، يظهر السجل:
0x1770 = 6000 عشري = أول خطأ Anchor (مثل SlippageExceeded). تحقق من مع مصفوفة errors الخاصة بـ IDL. انظر reference/error-codes لجدول الأخطاء الكامل الخاص بـ Raydium.

عدم تطابق تخطيط الحساب

إذا مررت الحساب الخاطئ في الفتحة الخاطئة، تعيد ماكروهات التحقق من الحساب الخاصة بـ Anchor أخطاء مثل:
أرقام الأخطاء أقل من 6000 هي أخطاء Anchor المدمجة (انظر enum ErrorCode الخاص بـ Anchor)؛ الأخطاء ≥6000 هي أكواد البرنامج المخصصة.

مؤشرات

المصادر: