تخطي إلى المحتوى الرئيسي

إرشادات أمان العقود الذكية

Solidity
العقود الذكية
الأمان
متوسط
Trailofbits
6 سبتمبر 2020
5 دقيقة للقراءة

اتبع هذه التوصيات عالية المستوى لبناء عقود ذكية أكثر أمانًا.

إرشادات التصميم

يجب مناقشة تصميم العقد مسبقًا، قبل كتابة أي سطر من التعليمات البرمجية.

التوثيق والمواصفات

يمكن كتابة التوثيق بمستويات مختلفة، ويجب تحديثه أثناء تنفيذ العقود:

الحوسبة على السلسلة مقابل خارج السلسلة

  • احتفظ بأكبر قدر ممكن من التعليمات البرمجية خارج السلسلة. اجعل الطبقة التي على السلسلة صغيرة. قم بمعالجة البيانات مسبقًا باستخدام تعليمات برمجية خارج السلسلة بطريقة تجعل التحقق على السلسلة بسيطًا. هل تحتاج إلى قائمة مرتبة؟ قم بفرز القائمة خارج السلسلة، ثم تحقق فقط من ترتيبها على السلسلة.

قابلية الترقية

ناقشنا حلول قابلية الترقية المختلفة في منشور مدونتنا (يفتح في علامة تبويب جديدة). اتخذ خيارًا مدروسًا لدعم قابلية الترقية من عدمه قبل كتابة أي تعليمات برمجية. سيؤثر هذا القرار على كيفية هيكلة التعليمات البرمجية الخاصة بك. بشكل عام، نوصي بما يلي:

  • تفضيل ترحيل العقد (يفتح في علامة تبويب جديدة) على قابلية الترقية. تتمتع أنظمة الترحيل بالعديد من المزايا نفسها التي تتمتع بها الأنظمة القابلة للترقية، ولكن دون عيوبها.
  • استخدام نمط فصل البيانات بدلاً من نمط الوكيل (delegatecallproxy). إذا كان مشروعك يحتوي على فصل تجريدي واضح، فإن قابلية الترقية باستخدام فصل البيانات لن تتطلب سوى تعديلات قليلة. يتطلب نمط delegatecallproxy خبرة في جهاز إيثريوم الظاهري (EVM) وهو عرضة للأخطاء بشكل كبير.
  • توثيق إجراء الترحيل/الترقية قبل النشر. إذا اضطررت إلى التصرف تحت الضغط دون أي إرشادات، فسوف ترتكب أخطاء. اكتب الإجراء الذي يجب اتباعه مسبقًا. يجب أن يتضمن:
    • الاستدعاءات التي تبدأ العقود الجديدة
    • أين يتم تخزين المفاتيح وكيفية الوصول إليها
    • كيفية التحقق من النشر! قم بتطوير واختبار برنامج نصي لما بعد النشر.

إرشادات التنفيذ

اسعَ إلى البساطة. استخدم دائمًا أبسط حل يناسب غرضك. يجب أن يكون أي عضو في فريقك قادرًا على فهم حلك.

تكوين الدوال

يجب أن تجعل بنية قاعدة التعليمات البرمجية الخاصة بك من السهل مراجعتها. تجنب الخيارات المعمارية التي تقلل من القدرة على التفكير في صحتها.

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

الوراثة

  • اجعل الوراثة قابلة للإدارة. يجب استخدام الوراثة لتقسيم المنطق، ومع ذلك، يجب أن يهدف مشروعك إلى تقليل عمق وعرض شجرة الوراثة.
  • استخدم طابعة الوراثة (يفتح في علامة تبويب جديدة) الخاصة بأداة سليذر للتحقق من التسلسل الهرمي للعقود. ستساعدك طابعة الوراثة في مراجعة حجم التسلسل الهرمي.

الأحداث

  • سجل جميع العمليات الحاسمة. ستساعد الأحداث في تصحيح أخطاء العقد أثناء التطوير، ومراقبته بعد النشر.

تجنب المزالق المعروفة

التبعيات

  • استخدم مكتبات تم اختبارها جيدًا. سيؤدي استيراد التعليمات البرمجية من مكتبات تم اختبارها جيدًا إلى تقليل احتمالية كتابة تعليمات برمجية مليئة بالأخطاء. إذا كنت ترغب في كتابة عقد ERC-20، فاستخدم أوبن زبلن (يفتح في علامة تبويب جديدة).
  • استخدم مدير تبعيات؛ وتجنب نسخ ولصق التعليمات البرمجية. إذا كنت تعتمد على مصدر خارجي، فيجب عليك إبقاؤه محدثًا مع المصدر الأصلي.

الاختبار والتحقق

Solidity

  • فضل الإصدار 0.5 من Solidity على 0.4 و0.6. في رأينا، الإصدار 0.5 من Solidity أكثر أمانًا ويحتوي على ممارسات مدمجة أفضل من 0.4. أثبت الإصدار 0.6 من Solidity أنه غير مستقر للغاية بالنسبة للإنتاج ويحتاج إلى وقت لينضج.
  • استخدم إصدارًا مستقرًا للتجميع؛ واستخدم أحدث إصدار للتحقق من التحذيرات. تحقق من أن التعليمات البرمجية الخاصة بك لا تحتوي على مشكلات مُبلغ عنها مع أحدث إصدار من المترجم. ومع ذلك، تتمتع Solidity بدورة إصدار سريعة ولها تاريخ من أخطاء المترجم، لذلك لا نوصي بأحدث إصدار للنشر (انظر توصية إصدار solc (يفتح في علامة تبويب جديدة) الخاصة بأداة سليذر).
  • لا تستخدم لغة التجميع المضمنة (inline assembly). تتطلب لغة التجميع خبرة في جهاز إيثريوم الظاهري (EVM). لا تكتب تعليمات برمجية لجهاز EVM إذا لم تكن قد أتقنت الورقة الصفراء.

إرشادات النشر

بمجرد تطوير العقد ونشره:

  • راقب عقودك. راقب السجلات، وكن مستعدًا للتصرف في حالة اختراق العقد أو المحفظة.
  • أضف معلومات الاتصال الخاصة بك إلى blockchain-security-contacts (يفتح في علامة تبويب جديدة). تساعد هذه القائمة الأطراف الخارجية على الاتصال بك في حالة اكتشاف ثغرة أمنية.
  • قم بتأمين محافظ المستخدمين ذوي الامتيازات. اتبع أفضل الممارسات (يفتح في علامة تبويب جديدة) الخاصة بنا إذا كنت تقوم بتخزين المفاتيح في محافظ الأجهزة.
  • ضع خطة استجابة للحوادث. ضع في اعتبارك أن عقودك الذكية يمكن أن تتعرض للاختراق. حتى إذا كانت عقودك خالية من الأخطاء، فقد يسيطر المهاجم على مفاتيح مالك العقد.