دليل ترقية العقود الذكية Rust: التحديثات الأمنية للعقود NEAR وترحيل البيانات

دليل ترقية العقود الذكية Rust

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

!

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

باستخدام مشروع StatusMessage كمثال، نقدم طرق الترقية الشائعة لعقود NEAR.

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

إذا قمت بتعديل منطق العقد فقط دون تعديل بنية البيانات، يمكنك استخدام أمر near deploy لإعادة نشر الكود الجديد مباشرة. على سبيل المثال، إضافة دالة جديدة:

صدأ #[near_bindgen] impl StatusMessage { pub fn set_get_status(&mut self, message: String) -> Option { دع account_id = env::signer_account_id(); self.records.insert(&account_id, &message); return self.records.get(&account_id); } }

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

2. تم تعديل بنية بيانات العقد

إذا تم تعديل بنية البيانات الأصلية، على سبيل المثال:

صدأ #[near_bindgen] #[derive(BorshDeserialize ، BorshSerialize)] pub struct StatusMessage { taglines: LookupMap<string, string="">, السير الذاتية: LookupMap<string, string="">, }

إعادة النشر بشكل مباشر ستؤدي إلى خطأ في عدم إمكانية إعادة تسلسل حالة العقد.

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

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

!

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

  1. التحكم في الصلاحيات: يجب أن تكون وظيفة الترقية وظيفة only owner، لضمان أنه يمكن استدعاؤها فقط من قبل المالك.

  2. يُوصى بتعيين مالك العقد كـ DAO، لإدارة مشتركة من خلال الاقتراحات والتصويت.

  3. أضف #[init(ignore_state)] قبل دالة النقل، تأكد من عدم تحميل الحالة قبل التنفيذ.

  4. بعد الانتهاء من الترحيل، احذف وظيفة الترحيل، وتأكد من أنها تم استدعاؤها مرة واحدة فقط.

  5. يتم الانتهاء من تهيئة هيكل البيانات الجديد أثناء النقل.

باتباع المبادئ المذكورة أعلاه، يمكن ترقية وصيانة العقود الذكية بأمان.

! </string,></string,>

شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 5
  • إعادة النشر
  • مشاركة
تعليق
0/400
GweiWatchervip
· 08-12 18:54
صرخ لاعب العقد بصوت عالٍ: سواء ارتفعت أو لم ترتفع، الأمر متروك لك!
شاهد النسخة الأصليةرد0
ContractHuntervip
· 08-12 18:54
آه آه آه لقد وقعت مرة أخرى في فخ ترقية rust المألوف.
شاهد النسخة الأصليةرد0
NFTRegrettervip
· 08-12 18:35
آه، يجب أن أترقى مرة أخرى، لقد أزعجني ذلك.
شاهد النسخة الأصليةرد0
TokenVelocityvip
· 08-12 18:31
هناك الكثير من الثغرات، من يجرؤ على الاقتراب منها؟
شاهد النسخة الأصليةرد0
DuskSurfervip
· 08-12 18:31
الثغرات في العقود تحدث يومياً، حقاً تجعل الناس مستائين
شاهد النسخة الأصليةرد0
  • تثبيت