تقنيات ترقية العقود الذكية في Rust: أفضل الممارسات من إثيريوم إلى NEAR

robot
إنشاء الملخص قيد التقدم

Rustالعقود الذكية养成日记(9):合约安全之合约升级

العقود الذكية كنوع من أشكال الشيفرة البرمجية، قد تحتوي على عيوب وثغرات. حتى العقود التي تم اختبارها وتدقيقها بشكل كامل قد تحتوي على مشاكل لم يتم اكتشافها. هذه المشاكل المحتملة، إذا تم استغلالها، قد تؤدي إلى خسارة أصول المستخدمين وعواقب وخيمة أخرى. لذلك، فإن قدرة ترقية العقود مهمة جداً لإصلاح الثغرات وإضافة ميزات جديدة. ستتناول هذه المقالة طرق ترقية عقود Rust على منصة NEAR.

1. ضرورة ترقية العقود

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

!

2. طرق الترقية الشائعة لعقود الإيثيريوم

العقود الذكية على الإيثيريوم تتمتع بعدم القابلية للتغيير، وبمجرد نشرها لا يمكن تعديلها. لمعالجة هذه المشكلة، يتم عادة استخدام العقود الوكيلة (Proxy Contract).

  • العقد الوكيل يُستخدم لتخزين البيانات، ويستخدم deleGatecall لاستدعاء العقد المنطقي
  • تحتوي العقود الذكية على منطق الأعمال المحدد
  • عند الترقية، يكفي نشر عقد منطقي جديد وتحديث عقد الوكيل للإشارة إليه

هذه الطريقة يمكن أن تحتفظ بالبيانات الأصلية، فقط تحديث الجزء المنطقي.

!

3. طرق ترقية العقود الذكية NEAR

فيما يلي مثال على مشروع StatusMessage، نقدم طريقة ترقية عقود NEAR:

3.1 هيكل بيانات العقد لم يتغير

إذا كانت التعديلات تقتصر على منطق العقد دون تغيير هيكل البيانات، يمكن استخدام أمر near deploy لإعادة نشر الكود الجديد مباشرة. ستظل البيانات الأصلية محفوظة.

3.2 تم تعديل هيكل بيانات العقود

إذا تم تعديل بنية بيانات العقد، فإن إعادة نشره مباشرة ستؤدي إلى عدم تطابق بين بنية البيانات القديمة والجديدة، مما يجعل من المستحيل قراءة البيانات الأصلية بشكل طبيعي.

3.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

بهذه الطريقة يمكن إكمال نقل البيانات، حتى في حالة عدم توافق هيكل بيانات العقود القديمة والجديدة يمكن الترقية بشكل طبيعي.

4. اعتبارات الأمان لترقية العقود

ترقية العقود الذكية تحتاج إلى مراعاة العوامل الأمنية التالية:

  • التحكم الصارم في صلاحيات الترقية، والسماح فقط للمطورين أو DAO بالترقية
  • يوصى بتعيين مالك العقد إلى DAO، من خلال الاقتراحات والتصويت للإدارة
  • أضف #[init(ignore_state)] قبل وظيفة الترحيل.
  • بعد الترحيل، احذف دالة migrate، وتأكد من استدعائها مرة واحدة فقط.
  • تم الانتهاء من تهيئة الهيكل البياني الجديد أثناء الهجرة

من خلال هذه التدابير، يمكن ضمان أمان ترقية العقود وتقليل المخاطر أثناء عملية الترقية.

!

شاهد النسخة الأصلية
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • أعجبني
  • 5
  • مشاركة
تعليق
0/400
liquiditea_sippervip
· 07-13 07:37
يبدو قوياً جداً لكنني لا أجرؤ على التجربة
شاهد النسخة الأصليةرد0
NeverVoteOnDAOvip
· 07-13 07:37
هل الترقية موثوقة؟ أشعر دائمًا أنها لا تنظف جيدًا.
شاهد النسخة الأصليةرد0
BrokenDAOvip
· 07-13 07:24
السلطة تعادل الباب الخلفي، كيف يمكن الحديث عن الأمان؟
شاهد النسخة الأصليةرد0
LayerZeroHerovip
· 07-13 07:24
بمجرد الانتهاء من الترقية، لن يتمكن أحد من السيطرة على الأمر.
شاهد النسخة الأصليةرد0
ser_ngmivip
· 07-13 07:09
سقف عقد الرغوة
شاهد النسخة الأصليةرد0
  • تثبيت