العقود الذكية كنوع من البرامج، لا مفر من وجود عيوب. حتى بعد إجراء اختبارات وتدقيقات كثيرة، قد لا تزال هناك ثغرات. بمجرد استغلال الثغرات، قد يؤدي ذلك إلى خسائر جسيمة في أصول المستخدمين. لذلك، فإن قابلية ترقية العقود مهمة جداً، وتستخدم بشكل رئيسي لإصلاح الثغرات وإضافة ميزات جديدة.
!
طرق ترقية العقود الذكية NEAR
كمثال على مشروع StatusMessage، سأقوم بشرح طرق الترقية الشائعة لعقود NEAR.
1. لم يتم تعديل هيكل بيانات العقد
إذا تم تعديل منطق العقد فقط دون تغيير بنية البيانات، يمكن استخدام أمر near deploy لإعادة نشر الكود الجديد مباشرة. يمكن قراءة البيانات في العقد الأصلي بشكل طبيعي.
2. تم تعديل بنية بيانات العقد
إذا تم تعديل بنية بيانات العقد، فإن إعادة نشره مباشرة ستؤدي إلى عدم تطابق بنية البيانات الجديدة مع الحالة القديمة، مما يؤدي إلى حدوث خطأ.
3. استخدام طريقة Migrate للترقية
NEAR يوفر طريقة Migrate لمساعدة في ترقية العقود. أضف طريقة migrate في العقد الجديد:
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
دليل ترقية العقود الذكية Rust: ممارسات النقل الآمن على المنصة NEAR
دليل ترقية العقود الذكية على Rust
العقود الذكية كنوع من البرامج، لا مفر من وجود عيوب. حتى بعد إجراء اختبارات وتدقيقات كثيرة، قد لا تزال هناك ثغرات. بمجرد استغلال الثغرات، قد يؤدي ذلك إلى خسائر جسيمة في أصول المستخدمين. لذلك، فإن قابلية ترقية العقود مهمة جداً، وتستخدم بشكل رئيسي لإصلاح الثغرات وإضافة ميزات جديدة.
!
طرق ترقية العقود الذكية NEAR
كمثال على مشروع StatusMessage، سأقوم بشرح طرق الترقية الشائعة لعقود NEAR.
1. لم يتم تعديل هيكل بيانات العقد
إذا تم تعديل منطق العقد فقط دون تغيير بنية البيانات، يمكن استخدام أمر near deploy لإعادة نشر الكود الجديد مباشرة. يمكن قراءة البيانات في العقد الأصلي بشكل طبيعي.
2. تم تعديل بنية بيانات العقد
إذا تم تعديل بنية بيانات العقد، فإن إعادة نشره مباشرة ستؤدي إلى عدم تطابق بنية البيانات الجديدة مع الحالة القديمة، مما يؤدي إلى حدوث خطأ.
3. استخدام طريقة Migrate للترقية
NEAR يوفر طريقة Migrate لمساعدة في ترقية العقود. أضف طريقة migrate في العقد الجديد:
صدأ #[private] #[init(ignore_state)] pub fn migrate() -> Self { let old_state: OldStatusMessage = env::state_read().expect('failed'); ذاتي { الشعارات: old_state.records, السير الذاتية: LookupMap::new(b'b'.to_vec()), } }
استدعاء طريقة الهجرة عند إعادة النشر:
قريبًا نشر
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'ترحيل'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
بهذه الطريقة يمكن نشر العقد الجديد بنجاح ونقل البيانات القديمة.
!
اعتبارات الأمان في ترقية العقود
يجب أن تخضع دالة الترقية للتحكم في الأذونات، وعادة ما يمكن استدعاؤها فقط من قبل المطورين أو DAO.
يُنصح بتعيين مالك العقد كـ DAO، لإدارة مشتركة من خلال الاقتراحات والتصويت.
أضف قبل دالة الهجرة #[init(ignore_state)]، تأكد من عدم تحميل الحالة قبل التنفيذ.
بعد اكتمال النقل، قم بحذف دالة النقل، تأكد من أنه تم استدعاؤها مرة واحدة فقط.
يتم إكمال تهيئة الهيكل البيانات الجديد أثناء عملية النقل.
يمكن أن يوفر آلية ترقية معقولة مرونة وقابلية للصيانة للعقود مع ضمان الأمان.
!