تطبيق ترقية العقود الذكية باستخدام Rust: ثلاث طرق واعتبارات أمان في نظام NEAR البيئي

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

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

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

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

مثال على كود العقد StatusMessage:

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

impl الافتراضي ل StatusMessage { fn default() -> Self { الذات { السجلات: LookupMap::new(b'r'.to_vec()), } } }

#[near_bindgen] impl StatusMessage { pub fn set_status(&mut self, message: String) { دع account_id = env::signer_account_id(); self.records.insert(&account_id, &message); }

pub fn get_status(& self, account_id: String) -> الخيار<string> {
    return self.records.get(&account_id);
}

}

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

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

على سبيل المثال، إضافة دالة جديدة:

صدأ 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. ترقية تعديل هيكل بيانات العقود

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

على سبيل المثال تعديل هيكل البيانات:

صدأ pub struct StatusMessage { taglines: LookupMap<string, string="">, السير الذاتية: LookupMap<string, string="">, }

في هذه الحالة، يجب استخدام طريقة Migrate للترقية.

3. استخدام طريقة 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 أثناء النشر:

near نشر
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'ترحيل'
--initArgs '{}'
--accountId statusmessage.blocksec_upgrade.testnet

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

!

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

  1. التحكم في الأذونات - يجب أن تكون وظيفة الترقية مخصصة للمالك، يُنصح بتعيين المالك كـ DAO

  2. أضف #[init(ignore_state)] قبل دالة الهجرة

  3. بعد اكتمال النقل، قم بحذف دالة النقل

  4. إكمال التهيئة للهياكل البيانات الجديدة أثناء الهجرة

من خلال تصميم آلية الترقية بشكل معقول، يمكن تحقيق قابلية ترقية العقود مع ضمان الأمان، مما يضع أساسًا للصيانة والتحسين على المدى الطويل.

! </string,></string,></string,>

GET-0.08%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 4
  • مشاركة
تعليق
0/400
PretendingToReadDocsvip
· 07-23 12:26
تكون عقود الوكالة أكثر أمانًا
شاهد النسخة الأصليةرد0
ArbitrageBotvip
· 07-23 12:19
ترقية تخشى أن تُستغل بغباء.
شاهد النسخة الأصليةرد0
LiquidityNinjavip
· 07-23 12:10
ترقية العقد صعبة.
شاهد النسخة الأصليةرد0
EthMaximalistvip
· 07-23 12:04
قد تحتوي الترقية على ثغرات.
شاهد النسخة الأصليةرد0
  • تثبيت