أمان العقود الذكية Rust: شرح مفصل للتحكم في الأذونات وإدارة الوصول

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

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

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

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

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

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

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

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

!

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

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

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

!

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

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

!

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); }

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

!

!

!

!

!

!

!

BNT1.59%
GET-0.8%
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 6
  • مشاركة
تعليق
0/400
ContractTestervip
· منذ 5 س
مرة أخرى، فشلت solidity، روست هو الأول في العالم
شاهد النسخة الأصليةرد0
ApeEscapeArtistvip
· منذ 6 س
روست آه دروس الدم والدموع
شاهد النسخة الأصليةرد0
AllTalkLongTradervip
· منذ 6 س
لماذا لا تزال إدارة الأذونات معقدة بهذا الشكل؟
شاهد النسخة الأصليةرد0
defi_detectivevip
· منذ 6 س
بنكور هذه العلة حقاً بسيطة جداً لا أريد حتى أن أقول شيئاً عنها
شاهد النسخة الأصليةرد0
GasWastingMaximalistvip
· منذ 6 س
لقد عانيت من هذه الفخاخ المتعلقة بالصلاحيات ، فتفجرت مباشرة.
شاهد النسخة الأصليةرد0
CryptoAdventurervip
· منذ 6 س
مرة أخرى، هل حدث فشل في تبادل؟ التحكم في المخاطر هو دائمًا آلة خداع الناس لتحقيق الربح~
شاهد النسخة الأصليةرد0
  • تثبيت