العقود الذكية كنوع من كود البرنامج، لا مفر من وجود عيوب وثغرات. حتى بعد إجراء اختبارات وتدقيقات مكثفة، قد تظهر مشكلات أمنية. بمجرد استغلال الثغرات في العقد من قبل المهاجمين، قد يتسبب ذلك في خسارة أصول المستخدمين وغيرها من العواقب الخطيرة. لذلك، فإن ترقية العقد أمر بالغ الأهمية لإصلاح الثغرات وإضافة ميزات جديدة. ستتناول هذه المقالة طرق ترقية العقود الذكية المكتوبة بلغة Rust.
!
طرق ترقية عقد NEAR الشائعة
باستخدام مشروع StatusMessage كمثال، نقدم طرق الترقية الشائعة لعقود NEAR:
إذا كان الأمر يتعلق بإضافة وظائف جديدة فقط دون تعديل هيكل البيانات، يمكنك استخدام أمر near deploy لإعادة نشر الشيفرة الجديدة مباشرة. يمكن قراءة البيانات الأصلية بشكل طبيعي.
تم تعديل هيكل البيانات للعقود
إذا تم تعديل بنية البيانات، فإن إعادة النشر مباشرة ستؤدي إلى عدم تطابق بين بنية البيانات القديمة والجديدة، مما يجعل من المستحيل قراءة البيانات بشكل صحيح. في هذه الحالة، تحتاج إلى استخدام طريقة Migrate للتحديث:
نير نشر
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'ترحيل'
--initArgs '{}'
--accountId statusmessage.example.testnet
بهذه الطريقة يمكن نقل البيانات القديمة إلى بنية البيانات الجديدة.
!
اعتبارات أمان ترقية العقود
تنفيذ التحكم في الوصول، والسماح فقط للمطورين أو DAO بترقية العقود.
يُوصى بتعيين مالك العقد كـ DAO، لإدارة مشتركة من خلال الاقتراحات والتصويت.
أضف #[init(ignore_state)] قبل وظيفة الترحيل.
بعد اكتمال الترحيل، قم بحذف دالة migrate، وتأكد من استدعائها مرة واحدة فقط.
يتم إتمام تهيئة هيكل البيانات الجديد أثناء النقل.
يمكن إكمال ترقية عقود Rust الذكية بأمان وكفاءة من خلال الطرق المذكورة أعلاه.
! </string,>
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تقنيات ترقية العقود الذكية في Rust: طرق التحديث الآمن لعقود NEAR
تقنيات ترقية العقود الذكية بلغة 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); }
}
هيكل بيانات العقد لم يتغير
إذا كان الأمر يتعلق بإضافة وظائف جديدة فقط دون تعديل هيكل البيانات، يمكنك استخدام أمر near deploy لإعادة نشر الشيفرة الجديدة مباشرة. يمكن قراءة البيانات الأصلية بشكل طبيعي.
تم تعديل هيكل البيانات للعقود
إذا تم تعديل بنية البيانات، فإن إعادة النشر مباشرة ستؤدي إلى عدم تطابق بين بنية البيانات القديمة والجديدة، مما يجعل من المستحيل قراءة البيانات بشكل صحيح. في هذه الحالة، تحتاج إلى استخدام طريقة 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()), } }
نير نشر
--wasmFile target/wasm32-unknown-unknown/release/status_message.wasm
--initFunction 'ترحيل'
--initArgs '{}'
--accountId statusmessage.example.testnet
بهذه الطريقة يمكن نقل البيانات القديمة إلى بنية البيانات الجديدة.
!
اعتبارات أمان ترقية العقود
تنفيذ التحكم في الوصول، والسماح فقط للمطورين أو DAO بترقية العقود.
يُوصى بتعيين مالك العقد كـ DAO، لإدارة مشتركة من خلال الاقتراحات والتصويت.
أضف #[init(ignore_state)] قبل وظيفة الترحيل.
بعد اكتمال الترحيل، قم بحذف دالة migrate، وتأكد من استدعائها مرة واحدة فقط.
يتم إتمام تهيئة هيكل البيانات الجديد أثناء النقل.
يمكن إكمال ترقية عقود Rust الذكية بأمان وكفاءة من خلال الطرق المذكورة أعلاه.
! </string,>