دليل ترقية عقود Rust الذكية: شرح مفصل لطرق تحديث الأمان على المنصة NEAR

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

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

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

طريقة ترقية العقود الذكية على 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); } }

يمكنك إعادة النشر باستخدام near deploy بعد الترجمة. يمكن قراءة البيانات في العقد الأصلي بشكل طبيعي.

!

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

إذا تم تعديل هيكل بيانات العقد، فإن إعادة النشر مباشرة ستؤدي إلى فشل تسلسل الحالة. على سبيل المثال، قمنا بتعديل هيكل العقد على النحو التالي:

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

في هذه الحالة، يجب استخدام طريقة 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,>

NEAR2.31%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 2
  • مشاركة
تعليق
0/400
WalletDetectivevip
· منذ 12 س
واو، إنه قوي حقًا!
شاهد النسخة الأصليةرد0
MetaverseVagrantvip
· منذ 12 س
又在卷 العقود الذكية了
شاهد النسخة الأصليةرد0
  • تثبيت