ملخص
يمكن ترقية البرامج المنشورة عبر loader-v3 عندما يتم تعيين صلاحية الترقية. إلغاء الصلاحية يجعل البرنامج غير قابل للتغيير. يغطي آلية الترقية المكونة من 9 خطوات، وجميع تعليمات loader-v3 التسعة، والتحقق من البناء، وأنواع المحمل الخمسة.
نشر البرامج
Rust الأصلي
النشر باستخدام Solana CLI مع solana program deploy.
Anchor
النشر باستخدام إطار عمل Anchor مع anchor deploy.
ترقية البرامج
لترقية برنامج، يجب أن يحمل حساب صلاحية الترقية (عادةً الحساب الذي
نشر البرنامج في الأصل). أثناء النشر أو الترقية، يتم
تحميل الكود الثنائي الجديد إلى حساب مؤقت مخصص للتخزين المؤقت، ثم يُكتب إلى حساب
بيانات البرنامج. تعيين صلاحية الترقية إلى None يجعل البرنامج غير قابل
للتغيير ويمنع التحديثات الإضافية بشكل دائم.
آلية الترقية
عند معالجة
UpgradeableLoaderInstruction::Upgrade،
يقوم وقت التشغيل بـ:
- التحقق من أن حساب البرنامج قابل للكتابة ومملوك بواسطة loader-v3.
- التحقق من أن حساب المخزن المؤقت يحتوي على حالة
Bufferمع الصلاحية الصحيحة. - التحقق من أن
upgrade_authority_addressلحساب ProgramData يتطابق وليسNone. - التحقق من أن البرنامج لم يتم نشره بالفعل في الفترة الزمنية الحالية
(
clock.slot != slot). - تحميل والتحقق من بايتات ELF الجديدة من المخزن المؤقت.
- نسخ الكود الثنائي الجديد من المخزن المؤقت إلى حساب ProgramData وتصفير البايتات المتبقية.
- تمويل حساب ProgramData للإعفاء من الإيجار.
- تفريغ حساب المخزن المؤقت (تعيين lamports إلى 0) واقتطاع بياناته.
- تصبح النسخة الجديدة فعالة في الفترة الزمنية التالية (
deployment_slot + 1).
حساب Program نفسه (حالته ومؤشر programdata_address) لا يتغير أثناء الترقية.
يتم تحديث الكود الثنائي وبيانات الـ slot الوصفية لحساب ProgramData فقط.
مرجع تعليمات Loader-v3
Loader-v3 (BPF Loader Upgradeable) هو المحمّل الافتراضي الحالي لنشر البرامج على سولانا.
| التعليمة | الوصف |
|---|---|
InitializeBuffer | تعيّن حالة حساب المخزن المؤقت إلى Buffer مع الصلاحية المحددة. تفشل إذا كان مهيأً بالفعل. |
Write | تكتب البايتات عند الإزاحة المحددة في حساب المخزن المؤقت. يجب أن توقع الصلاحية. |
DeployWithMaxDataLen | تنشئ برنامجاً جديداً: تشتق عنوان ProgramData، تنشئ حساب ProgramData عبر CPI إلى System Program، تتحقق من ملف ELF وتنشره من المخزن المؤقت، تعيّن حالة حساب البرنامج وتجعله قابلاً للتنفيذ. |
Upgrade | تستبدل الكود الثنائي في حساب ProgramData لبرنامج موجود من مخزن مؤقت. |
SetAuthority | تغيّر صلاحية حساب Buffer أو ProgramData. التعيين إلى None على ProgramData يجعل البرنامج غير قابل للتغيير. لا يمكن تعيين صلاحية Buffer إلى None. |
SetAuthorityChecked | مثل SetAuthority، لكن تتطلب أن توقع الصلاحية الجديدة على المعاملة أيضاً. |
Close | تغلق حساب مخزن مؤقت أو غير مهيأ أو ProgramData بتحويل lamports الخاصة به إلى مستلم. إغلاق ProgramData يكتب أيضاً علامة Closed في ذاكرة التخزين المؤقت للبرنامج. لا يمكن إغلاق برنامج تم نشره في الـ slot الحالي. |
ExtendProgramChecked | توسّع تخصيص حساب ProgramData ببايتات إضافية، مع تمويل الإيجار الإضافي من الدافع. |
Migrate | تهاجر برنامج loader-v3 إلى loader-v4 بنقل ملكية حساب البرنامج ونسخ الكود الثنائي. تتطلب صلاحية الترحيل أو صلاحية ترقية البرنامج للتوقيع. loader-v4 لم يتم إصداره بعد على الشبكة الرئيسية. |
التحقق من البرامج
تدعم سولانا البناءات القابلة للتحقق، والتي تتيح للمستخدمين التأكد من أن الكود الثنائي للبرنامج على السلسلة يطابق كوده المصدري العام. يوفر إطار عمل Anchor دعمًا مدمجًا للبناءات القابلة للتحقق.
للتحقق من حالة التحقق لبرنامج منشور، ابحث عن معرف البرنامج الخاص به على Solana Explorer، أو استخدم Solana Verifiable Build CLI من Ellipsis Labs للتحقق بشكل مستقل من البرامج على السلسلة.
برامج التحميل
| المحمّل | العنوان | قابل للترقية | الوصف |
|---|---|---|---|
| Native Loader | NativeLoader1111111111111111111111111111111 | فقط عبر ترقية برنامج المدقق | يمتلك البرامج المدمجة (System، Vote، Stake) والمحملات الأخرى |
| BPF Loader (v1) | BPFLoader1111111111111111111111111111111111 | لا (إدارة المحمل معطلة) | البرامج القديمة |
| BPF Loader (v2) | BPFLoader2111111111111111111111111111111111 | لا (إدارة المحمل معطلة) | البرامج القديمة |
| BPF Loader Upgradeable | BPFLoaderUpgradeab1e11111111111111111111111 | نعم، إذا تم تعيين صلاحية الترقية | يمتلك جميع البرامج المنشورة حديثًا |
| Loader-v4 | LoaderV411111111111111111111111111111111111 | نعم، إذا تم تعيين الصلاحية | لم يتم إصداره بعد على الشبكة الرئيسية |
Is this page helpful?