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

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

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

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

!

طرق ترقية عقد NEAR الشائعة

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

صدأ #[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);
}

}

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

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

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

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

  1. إضافة طريقة 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()), } }

  1. استدعاء طريقة migrate عند النشر:

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

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

!

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

  1. تنفيذ التحكم في الوصول، والسماح فقط للمطورين أو DAO بترقية العقود.

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

  3. أضف #[init(ignore_state)] قبل وظيفة الترحيل.

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

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

يمكن إكمال ترقية عقود Rust الذكية بأمان وكفاءة من خلال الطرق المذكورة أعلاه.

! </string,>

شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 7
  • مشاركة
تعليق
0/400
CryptoNomicsvip
· منذ 5 س
*sigh* دعني أشرح باستخدام مصفوفات الاحتمالات العشوائية لماذا الترقية != الأمان
شاهد النسخة الأصليةرد0
HodlBelievervip
· منذ 17 س
حتى لو كانت نسبة مخاطر العقد منخفضة، لا يمكن المراهنة.
شاهد النسخة الأصليةرد0
SnapshotLaborervip
· منذ 17 س
مرة أخرى في العقود الذكية، أنظر بهدوء إلى رصيد المحفظة.
شاهد النسخة الأصليةرد0
MEV_Whisperervip
· منذ 18 س
ترقية العقد كانت هكذا، فما الذي يجعلها مهمة؟
شاهد النسخة الأصليةرد0
GateUser-beba108dvip
· منذ 18 س
هذه الترقية يمكن للجميع القيام بها!
شاهد النسخة الأصليةرد0
MemeCuratorvip
· منذ 18 س
قريب جدًا لا أجرؤ على كتابة العقد... أخشى أن يُسرق مني
شاهد النسخة الأصليةرد0
WalletDivorcervip
· منذ 18 س
لقد خسرت بشكل كبير، حتى الترقية لن تعيد لي ما فقدته.
شاهد النسخة الأصليةرد0
  • تثبيت