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

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

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

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

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

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

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

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

  • وصف واضح للنظام، يصف ما تفعله العقود وأي افتراضات حول قاعدة التعليمات البرمجية.
  • المخططات الهيكلية والمعمارية، بما في ذلك تفاعلات العقد وآلة حالة النظام. يمكن أن تساعد طابعات سليذر (opens in a new tab) في إنشاء هذه المخططات.
  • توثيق شامل للتعليمات البرمجية، يمكن استخدام تنسيق NatSpec (opens in a new tab) مع لغة Solidity.

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

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

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

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

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

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

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

تكوين الدوال

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

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

الوراثة

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

الأحداث

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

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

التبعيات

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

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

  • اكتب اختبارات وحدة شاملة. تعد مجموعة الاختبارات الشاملة أمرًا بالغ الأهمية لبناء برمجيات عالية الجودة.
  • اكتب فحوصات وخصائص مخصصة لأدوات سليذر (opens in a new tab)، وإيكيدنا (opens in a new tab)، ومانتيكور (opens in a new tab). ستساعد الأدوات الآلية في ضمان أمان عقدك. راجع بقية هذا الدليل لمعرفة كيفية كتابة فحوصات وخصائص فعالة.
  • استخدم crytic.io (opens in a new tab). تتكامل أداة Crytic مع GitHub، وتوفر الوصول إلى كاشفات سليذر الخاصة، وتُشغل فحوصات خصائص مخصصة من إيكيدنا.

Solidity

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

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

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

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