سيتم تقديم محتوى التحكم في الأذونات في العقود الذكية لـ Rust من زاويتين:
رؤية الوصول/الاستدعاء لطريقة العقد (الوظائف)
التحكم في الوصول إلى وظائف الامتياز / تقسيم المسؤوليات
1. رؤية دوال العقد (الطرق)
عند كتابة العقود الذكية، يمكن التحكم في أذونات استدعاء الدوال من خلال تحديد رؤية دالة العقد. هذا مهم لحماية الأجزاء الأساسية من العقد من الوصول أو التلاعب غير المقصود.
على سبيل المثال، حدثت حادثة أمنية في بورصة Bancor Network في 18 يونيو 2020 بسبب خطأ في إعداد أذونات الوصول لوظائف العقود الرئيسية. تم كتابة هذا العقد بلغة Solidity، وتقسم رؤية الوظائف إلى نوعين: public/external و private/internal.
أثناء تعديل ثغرة أمنية، قام Bancor عن طريق الخطأ بتعيين بعض وظائف التحويل الأساسية على أنها عامة، مما أدى إلى إمكانية أي شخص استدعاء هذه الوظائف من خارج العقد للقيام بعمليات تحويل، مما عرض أصول المستخدمين بقيمة 590,000 دولار لخطر كبير.
!
في العقود الذكية بلغة Rust، يعتبر التحكم في رؤية الدوال أمرًا مهمًا أيضًا. تحتوي دوال العقود التي تم تزيينها باستخدام ماكرو #[near_bindgen] المعرّف بواسطة NEAR SDK على الخصائص المرئية التالية:
pub fn: وظيفة عامة، وهي جزء من واجهة العقد ويمكن استدعاؤها من خارج العقد.
fn: الدالة غير المحددة بـ pub يمكن استدعاؤها فقط داخل العقد.
pub(crate) fn: تقييد الاستدعاءات ضمن نطاق crate.
طريقة أخرى لتعيين الطريقة إلى internal هي تعريفها في كتلة كود impl Contract التي لم يتم تمييزها بواسطة #[near_bindgen].
بالنسبة لدالة الاستدعاء، يجب تعيينها كخاصية عامة حتى يمكن استدعاؤها من خلال دالة function call. كما يجب التأكد من أن دالة الاستدعاء يمكن أن تُستدعى فقط بواسطة العقد نفسه، ويمكن استخدام ماكرو #[private] لتحقيق ذلك.
!
2. التحكم في الوصول لوظائف الامتياز ( آلية القائمة البيضاء )
بالإضافة إلى رؤية الوظائف، من الضروري أيضًا إنشاء آلية قائمة بيضاء كاملة للتحكم في الوصول على المستوى الدلالي. يمكن استدعاء بعض الوظائف المميزة (مثل تهيئة العقد، وفتح/إيقاف، والتحويل الموحد، وما إلى ذلك) فقط من قبل مالك العقد (owner).
يمكن تنفيذ Trait مخصص للتحكم في وصول وظائف الامتياز، والتحقق مما إذا كان المتصل بالمعاملة هو مالك العقد:
استنادًا إلى هذه المبادئ، يمكن من خلال تخصيص سمات أكثر تعقيدًا تعيين عدة مستخدمين أو قوائم بيضاء متعددة في القائمة البيضاء، مما يحقق التحكم الدقيق في الوصول.
!
3. المزيد من أساليب التحكم في الوصول
تشمل طرق التحكم في الوصول في العقود الذكية Rust الأخرى ما يلي:
التحكم في توقيت استدعاء العقد
آلية استدعاء متعددة التوقيع لدوال العقود
الحوكمة(DAO) للتنفيذ
ستتم مناقشة هذه المحتويات بالتفصيل في سلسلة مذكرات تطوير العقود الذكية القادمة.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 9
أعجبني
9
4
مشاركة
تعليق
0/400
not_your_keys
· منذ 4 س
لا أزال غير قادر على فهم الثغرة التي حدثت في bancor حتى الآن.
شاهد النسخة الأصليةرد0
SigmaBrain
· منذ 23 س
بالفعل، درس بنكور من الفشل لا يُنسى.
شاهد النسخة الأصليةرد0
NewPumpamentals
· منذ 23 س
مرة أخرى يتحدث عن التحكم في الأذونات، لماذا لا يتعلم من دروس بانكور؟
تحكم وصول العقود الذكية في Rust: رؤية الدالة وإدارة الوصول المميز
Rust العقود الذكية养成日记(7)合约安全之权限控制
سيتم تقديم محتوى التحكم في الأذونات في العقود الذكية لـ Rust من زاويتين:
1. رؤية دوال العقد (الطرق)
عند كتابة العقود الذكية، يمكن التحكم في أذونات استدعاء الدوال من خلال تحديد رؤية دالة العقد. هذا مهم لحماية الأجزاء الأساسية من العقد من الوصول أو التلاعب غير المقصود.
على سبيل المثال، حدثت حادثة أمنية في بورصة Bancor Network في 18 يونيو 2020 بسبب خطأ في إعداد أذونات الوصول لوظائف العقود الرئيسية. تم كتابة هذا العقد بلغة Solidity، وتقسم رؤية الوظائف إلى نوعين: public/external و private/internal.
أثناء تعديل ثغرة أمنية، قام Bancor عن طريق الخطأ بتعيين بعض وظائف التحويل الأساسية على أنها عامة، مما أدى إلى إمكانية أي شخص استدعاء هذه الوظائف من خارج العقد للقيام بعمليات تحويل، مما عرض أصول المستخدمين بقيمة 590,000 دولار لخطر كبير.
!
في العقود الذكية بلغة Rust، يعتبر التحكم في رؤية الدوال أمرًا مهمًا أيضًا. تحتوي دوال العقود التي تم تزيينها باستخدام ماكرو #[near_bindgen] المعرّف بواسطة NEAR SDK على الخصائص المرئية التالية:
طريقة أخرى لتعيين الطريقة إلى internal هي تعريفها في كتلة كود impl Contract التي لم يتم تمييزها بواسطة #[near_bindgen].
بالنسبة لدالة الاستدعاء، يجب تعيينها كخاصية عامة حتى يمكن استدعاؤها من خلال دالة function call. كما يجب التأكد من أن دالة الاستدعاء يمكن أن تُستدعى فقط بواسطة العقد نفسه، ويمكن استخدام ماكرو #[private] لتحقيق ذلك.
!
2. التحكم في الوصول لوظائف الامتياز ( آلية القائمة البيضاء )
بالإضافة إلى رؤية الوظائف، من الضروري أيضًا إنشاء آلية قائمة بيضاء كاملة للتحكم في الوصول على المستوى الدلالي. يمكن استدعاء بعض الوظائف المميزة (مثل تهيئة العقد، وفتح/إيقاف، والتحويل الموحد، وما إلى ذلك) فقط من قبل مالك العقد (owner).
يمكن تنفيذ Trait مخصص للتحكم في وصول وظائف الامتياز، والتحقق مما إذا كان المتصل بالمعاملة هو مالك العقد:
صدأ سمة الحانة مملوكة { الجبهة الوطنية assert_owner(&self) { assert_eq!(env::p redecessor_account_id(), self.get_ owner()). } fn get_owner(&self) -> AccountId; fn set_owner( & mut self ، المالك: AccountId); }
استنادًا إلى هذه المبادئ، يمكن من خلال تخصيص سمات أكثر تعقيدًا تعيين عدة مستخدمين أو قوائم بيضاء متعددة في القائمة البيضاء، مما يحقق التحكم الدقيق في الوصول.
!
3. المزيد من أساليب التحكم في الوصول
تشمل طرق التحكم في الوصول في العقود الذكية Rust الأخرى ما يلي:
ستتم مناقشة هذه المحتويات بالتفصيل في سلسلة مذكرات تطوير العقود الذكية القادمة.
!
!
!
!
!
!
!