العقود الذكية في جوهرها هي برامج، ومن المحتمل أن تحتوي على عيوب. حتى بعد إجراء الكثير من الاختبارات والتدقيق، قد لا تزال هناك ثغرات. يمكن أن يؤدي استغلال ثغرات العقد إلى خسائر في أصول المستخدمين، مما ينتج عنه عواقب وخيمة. يتطلب إصلاح الثغرات وإضافة ميزات جديدة ترقية العقد. لذلك، فإن قابلية ترقية العقد أمر ضروري للغاية. ستقدم هذه المقالة طرق ترقية عقود Rust.
!
طرق ترقية العقود الذكية NEAR
كمثال على مشروع StatusMessage، نقدم طرق الترقية الشائعة لعقود NEAR.
1. هيكل بيانات العقد لم يتم تعديله
إذا كنت ستقوم بتعديل منطق العقد فقط دون تغيير في بنية البيانات، يمكنك استخدام near deploy لإعادة نشر الشيفرة الجديدة مباشرة. يمكن قراءة البيانات الموجودة في العقد الأصلي بشكل طبيعي.
2. تم تعديل هيكل بيانات العقد
إذا تم تعديل هيكل بيانات العقد، فإن إعادة نشره مباشرة ستؤدي إلى عدم تطابق الهيكل القديم والجديد، مما يجعل من المستحيل قراءة البيانات الأصلية.
3. استخدام Migrate لترقية العقد
يوفر NEAR طريقة Migrate لمساعدة العقود في الترقية. أضف طريقة migrate في العقد الجديد:
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
دليل كامل لترقية العقود الذكية Rust: من NEAR إلى اعتبارات الأمان
ممارسات ترقية العقود الذكية Rust
العقود الذكية في جوهرها هي برامج، ومن المحتمل أن تحتوي على عيوب. حتى بعد إجراء الكثير من الاختبارات والتدقيق، قد لا تزال هناك ثغرات. يمكن أن يؤدي استغلال ثغرات العقد إلى خسائر في أصول المستخدمين، مما ينتج عنه عواقب وخيمة. يتطلب إصلاح الثغرات وإضافة ميزات جديدة ترقية العقد. لذلك، فإن قابلية ترقية العقد أمر ضروري للغاية. ستقدم هذه المقالة طرق ترقية عقود 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()), } }
استدعاء طريقة migrate عند إعادة النشر:
قريب من النشر
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'ترحيل'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet
بهذه الطريقة يمكن نقل بيانات العقد القديم بنجاح إلى العقد الجديد.
!
اعتبارات الأمان لترقية العقود
يجب أن تكون دالة الترقية دالة only owner، لضمان أنه يمكن استدعاؤها فقط من قبل المالك
يُوصى بتعيين مالك العقد كـ DAO، لإدارة مشتركة من خلال الاقتراحات والتصويت.
أضف #[init(ignore_state)] قبل دالة الهجرة
بعد الانتهاء من الترحيل، قم بحذف دالة الترحيل
إكمال تهيئة بنية البيانات الجديدة أثناء النقل
ترقية العقود هي وسيلة مهمة لضمان أمان العقود، ويجب على المطورين التعامل معها بحذر لضمان سلامة عملية الترقية.
!