أمان العقود الذكية Rust: أفضل الممارسات لرؤية الوظائف والتحكم في الأذونات

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

Rust العقود الذكية养成日记(7)合约安全之权限控制

ستتناول هذه المقالة الجوانب المتعلقة بالتحكم في الصلاحيات في العقود الذكية بلغة Rust من جانبين:

  1. رؤية الوصول/الاستدعاء لطرق العقد (الدوال)
  2. التحكم في الوصول إلى وظائف الامتياز / تقسيم الحقوق والواجبات

1. رؤية دالة العقد (الطريقة)

عند كتابة العقود الذكية، يمكن التحكم في أذونات استدعاء الدوال من خلال تحديد رؤية الدالة، مما يحمي الأجزاء الرئيسية من العقد من الوصول أو التحكم غير المقصود.

على سبيل المثال، حدثت حادثة أمان في بورصة Bancor Network في 18 يونيو 2020 بسبب خطأ في إعداد صلاحيات الوصول إلى الوظائف الرئيسية للعقد. تم كتابة هذا العقد بلغة Solidity، وتنقسم رؤية دوال العقد إلى نوعين: public/external و private/internal. يسمح النوع الأول باستدعاء دوال العقد من قبل المستدعين الخارجيين، ويُعتبر جزءًا من واجهة العقد.

أدى تعديل Bancor Network لثغرة أمنية معينة إلى تعيين بعض دوال التحويل الرئيسية في العقد كخاصية عامة، مما سمح لأي شخص باستدعاء هذه الدوال من خارج العقد لإجراء عمليات التحويل. وقد عرضت هذه الثغرة أصول المستخدمين التي تبلغ 590,000 دولار لخطر شديد.

!

في العقود الذكية بلغة Rust، يجب أيضًا إيلاء اهتمام خاص للتحكم في رؤية دوال العقد. يمكن استخدام الماكرو #[near_bindgen] المحدد في NEAR SDK لتزيين دوال العقود الذكية بلغة Rust، وتوجد عدة خصائص رؤية مختلفة.

  • pub fn: تعني أن هذه الطريقة في العقد عامة، وهي جزء من واجهة العقد، يمكن لأي شخص استدعاؤها من خارج العقد.
  • fn: إذا لم يتم الإشارة صراحةً إلى pub، فهذا يعني أنه لا يمكن استدعاء هذه الوظيفة مباشرةً من خارج العقد، ويمكن استدعاؤها فقط من داخل العقد بواسطة وظائف أخرى.
  • pub(crate) fn: يعادل pub(in crate)، مشابه لـ fn، يحد من استدعاء طرق العقود ضمن نطاق crate.

هناك طريقة أخرى لتعيين طريقة العقد إلى internal وهي تعريف كتلة كود impl Contract مستقلة داخل العقد، حيث لا يتم تمييز هذه التنفيذ بـ #[near_bindgen].

بالنسبة لدالة الاستدعاء (Callbacks)، يجب أن تكون تعريفها مضبوطة على خاصية عامة، ولكن يجب التأكد من أنه يمكن استدعاؤها فقط بواسطة العقد نفسه. يوفر NEAR SDK ماكرو #[private] لتحقيق هذه الوظيفة.

من الجدير بالذكر أن اللغة Rust تكون جميع المحتويات بها خاصة بشكل افتراضي، باستثناء العناصر الفرعية في pub Trait ومتغيرات Enum في pub Enum التي تكون عامة بشكل افتراضي.

!

2. التحكم في الوصول إلى دوال الامتياز (آلية القائمة البيضاء)

بالإضافة إلى رؤية الوظائف، يجب أيضًا إنشاء آلية كاملة لقائمة التحكم في الوصول من منظور دلالات العقود. بعض الوظائف المميزة، مثل تهيئة العقد، فتح/إيقاف، والتحويل الموحد، عادةً ما يمكن استدعاؤها فقط من قبل مالك العقد (owner).

يجب تعيين هذه الوظائف المميزة كخصائص عامة ليتم استدعاؤها من الخارج، ولكن يجب أيضًا تحديد قواعد التحكم في الوصول لضمان أن المستخدمين الذين يستوفون الشروط فقط يمكنهم التنفيذ الكامل.

في العقود الذكية بلغة Rust، يمكن تنفيذ وظيفة مشابهة لوظيفة modifier في Solidity، من خلال تخصيص 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، مثل التحكم في توقيت استدعاء العقد، وآلية الاستدعاء متعددة التوقيعات لوظائف العقد، وتنفيذ الحوكمة (DAO) وغيرها. سيتم تناول هذه المحتويات بالتفصيل في المقالات اللاحقة من سلسلة يوميات تطوير العقود الذكية.

!

!

!

!

!

!

!

BNT-0.17%
GET2.67%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 3
  • مشاركة
تعليق
0/400
Rugpull幸存者vip
· منذ 12 س
هذه الموجة هي مرة أخرى تضليل قائمة السماح، أليس كذلك؟
شاهد النسخة الأصليةرد0
RektHuntervip
· منذ 12 س
rust مبتدئ必看!靠谱~
شاهد النسخة الأصليةرد0
MetaLord420vip
· منذ 12 س
مرحبًا، يمكن أن يتم اختراق قائمة السماح أيضًا، أليس كذلك~
شاهد النسخة الأصليةرد0
  • تثبيت