اختبار العقود الذكية
آخر تحديث للصفحة: 26 فبراير 2026
تعتبر سلاسل الكتل العامة مثل إيثريوم غير قابلة للتغيير، مما يجعل من الصعب تغيير كود العقود الذكية بعد النشر. توجد أنماط ترقية العقود لإجراء "ترقيات افتراضية"، ولكن من الصعب تنفيذها وتتطلب إجماعًا اجتماعيًا. علاوة على ذلك، لا يمكن للترقية إصلاح الخطأ إلا بعد اكتشافه—إذا اكتشف المهاجم الثغرة الأمنية أولاً، فسيكون عقدك الذكي معرضًا لخطر الاستغلال.
لهذه الأسباب، يُعد اختبار العقود الذكية قبل نشرها على الشبكة الرئيسية (Mainnet) متطلبًا أدنى لـالأمان. هناك العديد من التقنيات لاختبار العقود وتقييم صحة التعليمات البرمجية؛ ما تختاره يعتمد على احتياجاتك. ومع ذلك، فإن مجموعة الاختبار المكونة من أدوات وأساليب مختلفة تعتبر مثالية لالتقاط العيوب الأمنية البسيطة والكبيرة في كود العقد.
المتطلبات الأساسية
تشرح هذه الصفحة كيفية اختبار العقود الذكية قبل نشرها على شبكة إيثريوم. يفترض أنك على دراية بـالعقود الذكية.
What is smart contract testing؟ ما هو اختبار العقود الذكية؟
اختبار العقد الذكي هو عملية التحقق من أن كود العقد الذكي يعمل كما هو متوقع. يعد الاختبار مفيدًا للتحقق مما إذا كان عقد ذكي معين يلبي متطلبات الموثوقية وسهولة الاستخدام والأمان.
على الرغم من اختلاف الأساليب، فإن معظم طرق الاختبار تتطلب تنفيذ عقد ذكي مع عينة صغيرة من البيانات التي من المتوقع التعامل معها. إذا أنتج العقد نتائج صحيحة لبيانات العينة، فمن المفترض أن يعمل بشكل صحيح. توفر معظم أدوات الاختبار موارد لكتابة وتنفيذ حالات الاختبار (opens in a new tab) للتحقق مما إذا كان تنفيذ العقد يطابق النتائج المتوقعة.
لماذا يعد اختبار العقود الذكية مهماً؟
نظرًا لأن العقود الذكية غالبًا ما تدير أصولًا مالية عالية القيمة، فإن الأخطاء البرمجية البسيطة يمكن أن تؤدي، وغالبًا ما تؤدي، إلى خسائر فادحة للمستخدمين (opens in a new tab). ومع ذلك، يمكن أن يساعدك الاختبار الصارم في اكتشاف العيوب والمشكلات في كود العقد الذكي مبكرًا وإصلاحها قبل الإطلاق على الشبكة الرئيسية.
على الرغم من أنه من الممكن ترقية العقد إذا تم اكتشاف خطأ ما، إلا أن الترقيات معقدة ويمكن أن تؤدي إلى أخطاء (opens in a new tab) إذا تم التعامل معها بشكل غير صحيح. يؤدي ترقية العقد إلى إلغاء مبدأ عدم التغيير بشكل أكبر ويثقل كاهل المستخدمين بافتراضات ثقة إضافية. وعلى العكس من ذلك، فإن الخطة الشاملة لاختبار عقدك تخفف من مخاطر أمان العقود الذكية وتقلل من الحاجة إلى إجراء ترقيات منطقية معقدة بعد النشر.
طرق اختبار العقود الذكية
تندرج طرق اختبار عقود الإيثريوم الذكية ضمن فئتين عريضتين: الاختبار الآلي و الاختبار اليدوي. يقدم الاختبار الآلي والاختبار اليدوي فوائد ومقايضات فريدة، ولكن يمكنك الجمع بينهما لإنشاء خطة قوية لتحليل عقودك.
الاختبار الآلي
يستخدم الاختبار الآلي أدوات تقوم تلقائيًا بفحص كود العقود الذكية بحثًا عن أخطاء في التنفيذ. تأتي فائدة الاختبار الآلي من استخدام البرامج النصية (opens in a new tab) لتوجيه تقييم وظائف العقد. يمكن جدولة الاختبارات النصية ليتم تشغيلها بشكل متكرر مع الحد الأدنى من التدخل البشري، مما يجعل الاختبار الآلي أكثر كفاءة من الأساليب اليدوية للاختبار.
يُعد الاختبار الآلي مفيدًا بشكل خاص عندما تكون الاختبارات متكررة وتستغرق وقتًا طويلاً؛ ويصعب تنفيذها يدويًا؛ أو تكون عرضة للخطأ البشري؛ أو تنطوي على تقييم وظائف العقد الحرجة. ولكن يمكن أن يكون لأدوات الاختبار الآلية عيوب—فقد تفوِّت بعض الأخطاء وتنتج العديد من الإيجابيات الكاذبة (opens in a new tab). ومن ثم، فإن الجمع بين الاختبار الآلي والاختبار اليدوي للعقود الذكية يعد أمرًا مثاليًا.
الاختبار اليدوي
الاختبار اليدوي هو اختبار يتم بمساعدة الإنسان ويتضمن تنفيذ كل حالة اختبار في مجموعة الاختبار الخاصة بك واحدة تلو الأخرى عند تحليل صحة العقود الذكية. يختلف هذا عن الاختبار الآلي حيث يمكنك تشغيل اختبارات معزولة متعددة في وقت واحد على عقد والحصول على تقرير يوضح جميع الاختبارات الفاشلة والناجحة.
يمكن أن يتم إجراء الاختبار اليدوي بواسطة فرد واحد وفقًا لخطة اختبار مكتوبة تغطي سيناريوهات اختبار مختلفة. يمكنك أيضًا أن يكون لديك عدة أفراد أو مجموعات تتفاعل مع عقد ذكي خلال فترة زمنية محددة كجزء من الاختبار اليدوي. سيقوم المختبرون بمقارنة السلوك الفعلي للعقد مع السلوك المتوقع، واعتبار أي اختلاف بمثابة خطأ.
يتطلب الاختبار اليدوي الفعال موارد كبيرة (مهارة ووقت ومال وجهد)، ومن الممكن - بسبب الخطأ البشري - تفويت بعض الأخطاء أثناء تنفيذ الاختبارات. ولكن الاختبار اليدوي قد يكون مفيدًا أيضًا - على سبيل المثال، قد يستخدم المختبر البشري (مثل المدقق) الحدس لاكتشاف الحالات الحدسية التي قد تفوتها أداة الاختبار الآلية. ولكن الاختبار اليدوي قد يكون مفيداً أيضاً - على سبيل المثال، قد يستخدم المختبر البشري (مثل المدقق) الحدس لاكتشاف الحالات الحدية التي قد تفوتها أداة اختبار آلية.
الاختبار الآلي للعقود الذكية
اختبار الوحدة
يقوم اختبار الوحدة بتقييم وظائف العقد بشكل منفصل ويتحقق من عمل كل مكون بشكل صحيح. yaqum akhtibar alwahdat bitaqyim wazayif aleaqd bishakl munfasil wayatahaqaq min eamal kuli mukawan bishakl sahihin. يجب أن تكون اختبارات الوحدة الجيدة بسيطة وسريعة التشغيل وتوفر فكرة واضحة عما حدث خطأً إذا فشلت الاختبارات. يجب أن تكون اختبارات الوحدة الجيدة بسيطة وسريعة التشغيل وتوفر فكرة واضحة عما حدث بشكل خاطئ إذا فشلت الاختبارات.
تُعد اختبارات الوحدة مفيدة للتحقق من أن الوظائف تعيد القيم المتوقعة وأن تخزين العقد يتم تحديثه بشكل صحيح بعد تنفيذ الوظيفة. tued akhtibarat alwahdat mufidatan liltahaquq min 'ana alwazayif tueid alqiam almutawaqaeat wa'ana takhzin aleaqd yatimu tahdithuh bishakl sahih baed tanfidh alwazifati. علاوة على ذلك، فإن تشغيل اختبارات الوحدة بعد إجراء تغييرات على قاعدة بيانات العقود يضمن عدم إدخال أخطاء في المنطق الجديد. علاوة على ذلك، فإن تشغيل اختبارات الوحدة بعد إجراء تغييرات على قاعدة بيانات العقود يضمن عدم إدخال أخطاء في المنطق الجديد. فيما يلي بعض الإرشادات لتشغيل اختبارات الوحدة الفعالة: فيما يلي بعض الإرشادات لتشغيل اختبارات الوحدة الفعالة:
إرشادات لاختبار الوحدات في العقود الذكية
١. فهم منطق العمل وسير العمل لعقودك fahum mantiq aleamal wasiar aleamal lieuqudik
قبل كتابة اختبارات الوحدة، من المفيد معرفة الوظائف التي يوفرها العقد الذكي وكيفية وصول المستخدمين إلى هذه الوظائف واستخدامها. qabl kitabat aikhtibarat alwahdati, min almufid maerifat alwazayif alati yuafiruha aleaqd aldhakiu wakayfiat wusul almustakhdimin 'iilaa hadhih alwazayif waistikhdamiha. هذا مفيد بشكل خاص لتشغيل اختبارات المسار السعيد (opens in a new tab) التي تحدد ما إذا كانت الوظائف في العقد تُرجع المخرجات الصحيحة لمدخلات المستخدم الصالحة. سنشرح هذا المفهوم باستخدام هذا المثال (المختصر) لـعقد مزاد (opens in a new tab)
1constructor(2 uint biddingTime,3 address payable beneficiaryAddress4 ) {5 beneficiary = beneficiaryAddress;6 auctionEndTime = block.timestamp + biddingTime;7 }89function bid() external payable {1011 if (block.timestamp > auctionEndTime)12 revert AuctionAlreadyEnded();1314 if (msg.value <= highestBid)15 revert BidNotHighEnough(highestBid);1617 if (highestBid != 0) {18 pendingReturns[highestBidder] += highestBid;19 }20 highestBidder = msg.sender;21 highestBid = msg.value;22 emit HighestBidIncreased(msg.sender, msg.value);23 }2425 function withdraw() external returns (bool) {26 uint amount = pendingReturns[msg.sender];27 if (amount > 0) {28 pendingReturns[msg.sender] = 0;2930 if (!payable(msg.sender).send(amount)) {31 pendingReturns[msg.sender] = amount;32 return false;33 }34 }35 return true;36 }3738function auctionEnd() external {39 if (block.timestamp < auctionEndTime)40 revert AuctionNotYetEnded();41 if (ended)42 revert AuctionEndAlreadyCalled();4344 ended = true;45 emit AuctionEnded(highestBidder, highestBid);4647 beneficiary.transfer(highestBid);48 }49}إظهار الكلهذا عقد مزاد بسيط مصمم لتلقي العطاءات خلال فترة المزايدة.
hadha eaqd mazad basit musamim litalaqiy aleata'at khilal fatrat almuzayadati. إذا زاد highestBid، يستلم صاحب أعلى عرض سابق أمواله؛ وبمجرد انتهاء فترة المزايدة، يستدعي beneficiary العقد للحصول على أمواله.
ستغطي اختبارات الوحدة لعقد مثل هذا وظائف مختلفة قد يستدعيها المستخدم عند التفاعل مع العقد.
satughatiy akhtibarat alwahdat lieaqd mithl hadha wazayif mukhtalifatan qad yastadeiha almustakhdam eind altafaeul mae aleaqdi. مثال على ذلك هو اختبار الوحدة الذي يتحقق مما إذا كان المستخدم يمكنه تقديم عرض أسعار أثناء استمرار المزاد (أي أن الاستدعاءات إلى bid() تنجح)، أو اختبار يتحقق مما إذا كان يمكن للمستخدم تقديم عرض أسعار أعلى من highestBid الحالي.
يساعد فهم سير العمل التشغيلي للعقود أيضًا في كتابة اختبارات الوحدة التي تتحقق مما إذا كان التنفيذ يلبي المتطلبات.
yusaeid fahm sayr aleamal altashghilii lileuqud aydan fi kitabat aikhtibarat alwahdat alati tatahaqaq mimaa 'iidha kan altanfidh yulabiy almutatalabati. على سبيل المثال، يحدد عقد المزاد أنه لا يمكن للمستخدمين تقديم عروض أسعار عندما ينتهي المزاد (أي عندما يكون auctionEndTime أقل من block.timestamp). وبالتالي، قد يقوم المطور بتشغيل اختبار وحدة يتحقق مما إذا كانت الاستدعاءات إلى الدالة bid() تنجح أم تفشل عند انتهاء المزاد (أي عندما يكون auctionEndTime > block.timestamp).
٢. تقييم جميع الافتراضات المتعلقة بتنفيذ العقد taqyim jamie alaiftiradat almutaealiqat bitanfidh aleaqd
من المهم توثيق أي افتراضات حول تنفيذ العقد وكتابة اختبارات الوحدة للتحقق من صحة تلك الافتراضات. min almuhimi tawthiq 'ayi aiftiradat hawl tanfidh aleaqd wakitabat aikhtibarat alwahdat liltahaquq min sihat tilk alaiftiradati. إلى جانب توفير الحماية ضد التنفيذ غير المتوقع، فإن اختبار التأكيدات يجبرك على التفكير في العمليات التي قد تؤدي إلى كسر نموذج أمان العقود الذكية. 'iilaa janib tawfir alhimayat dida altanfidh ghayr almutawaqae, fa'iina aikhtibar altaakidat yujbiruk ealaa altafkir fi aleamaliaat alati qad tuadiy 'iilaa kasr namudhaj 'aman aleuqud aldhakiati. إحدى النصائح المفيدة هي أن تذهب إلى ما هو أبعد من "اختبارات المستخدم السعيد" وتكتب اختبارات سلبية تتحقق مما إذا كانت الوظيفة تفشل في حالة المدخلات الخاطئة. إحدى النصائح المفيدة هي الذهاب إلى أبعد من "اختبارات المستخدم السعيدة" وكتابة اختبارات سلبية تتحقق مما إذا كانت الوظيفة تفشل في حالة المدخلات الخاطئة.
تتيح لك العديد من أطر اختبار الوحدات إنشاء تأكيدات - عبارات بسيطة تنص على ما يمكن للعقد فعله وما لا يمكنه فعله - وتشغيل الاختبارات لمعرفة ما إذا كانت هذه التأكيدات صالحة أثناء التنفيذ. tutih lak aleadid min 'utur akhtibar alwahadat 'iinsha' takidat - eibarat basitat tanusu ealaa ma yumkin lileaqd fieluh wama la yumkinuh fieluh - watashghil aliaikhtibarat limaerifat ma 'iidha kanat hadhih altaakidat salihat 'athna' altanfidhi. يمكن للمطور الذي يعمل على عقد المزاد الموصوف سابقًا أن يقدم التأكيدات التالية حول سلوكه قبل تشغيل الاختبارات السلبية: يمكن للمطور الذي يعمل على عقد المزاد الموصوف سابقاً تقديم التأكيدات التالية حول سلوكه قبل تشغيل الاختبارات السلبية:
-
لا يمكن للمستخدمين تقديم عروض عندما يكون المزاد قد انتهى أو لم يبدأ بعد. لا يمكن للمستخدمين تقديم عطاءات عندما يكون المزاد قد انتهى أو لم يبدأ بعد.
-
يتم إلغاء عقد المزاد إذا كان العرض أقل من الحد المقبول. يتم إلغاء عقد المزاد إذا كان العطاء أقل من الحد الأدنى المقبول.
-
يتم إضافة أموال المستخدمين الذين فشلوا في الفوز بالعطاء إلى رصيدهم تتم إضافة أموال المستخدمين الذين فشلوا في الفوز بالعطاء إلى رصيدهم
ملاحظة: هناك طريقة أخرى لاختبار الافتراضات وهي كتابة اختبارات تؤدي إلى تشغيل مُعدِّلات الوظائف (opens in a new tab) في العقد، وخاصةً عبارات require وassert وif…else.
3. قياس تغطية الكود qias taghtiat alkud
تغطية الكود (opens in a new tab) هي مقياس اختبار يتتبع عدد الفروع والأسطر والعبارات في الكود الخاص بك التي يتم تنفيذها أثناء الاختبارات. يجب أن تتمتع الاختبارات بتغطية جيدة للكود لتقليل مخاطر الثغرات الأمنية غير المختبرة. yajib 'an tatamatae aliakhtibarat bitaghtiat jayidat lilkud litaqlil makhatir althagharat al'amniat ghayr almukhtabarati. بدون تغطية كافية، قد تفترض خطأً أن عقدك آمن لأن جميع الاختبارات تنجح، بينما لا تزال الثغرات الأمنية موجودة في مسارات التعليمات البرمجية غير المختبرة. bidun taghtiat kafiatin, qad taftarid khtaan 'ana eaqdak aman li'ana jamie alaikhtibarat tanjahu, baynama la tazal althagharat al'amniat mawjudat fi masarat altaelimat albarmajiat ghayr almukhtabarati. ومع ذلك، فإن تسجيل تغطية الكود العالية يمنح ضمانًا بأن جميع البيانات/الوظائف في العقد الذكي تم اختبارها بشكل كافٍ للتأكد من صحتها. ومع ذلك، فإن تسجيل تغطية الكود العالية يمنح ضماناً بأن جميع البيانات/الوظائف في العقد الذكي قد تم اختبارها بشكل كافٍ للتأكد من صحتها.
4. استخدم أطر اختبار متطورة aistakhdim 'utur akhtibar mutatawira
إن جودة الأدوات المستخدمة في تشغيل اختبارات الوحدة لعقودك الذكية أمر بالغ الأهمية. إطار عمل الاختبار المثالي هو الإطار الذي يتم صيانته بانتظام؛ ويوفر ميزات مفيدة (على سبيل المثال، إمكانيات التسجيل وإعداد التقارير)؛ ويجب استخدامه وفحصه على نطاق واسع من قبل مطورين آخرين.
تأتي أطر اختبار الوحدات الخاصة بعقود سوليديتي الذكية بلغات مختلفة (معظمها جافا سكريبت وبايثون وراست). راجع بعض الأدلة أدناه للحصول على معلومات حول كيفية بدء تشغيل اختبارات الوحدة باستخدام أطر الاختبار المختلفة:
- تشغيل اختبارات الوحدة باستخدام Brownie (opens in a new tab)
- تشغيل اختبارات الوحدة باستخدام فاوندري (opens in a new tab)
- تشغيل اختبارات الوحدة باستخدام وافل (opens in a new tab)
- تشغيل اختبارات الوحدة باستخدام ريميكس (opens in a new tab)
- تشغيل اختبارات الوحدة باستخدام Ape (opens in a new tab)
- تشغيل اختبارات الوحدة باستخدام هارد هات (opens in a new tab)
- تشغيل اختبارات الوحدة باستخدام ويك (opens in a new tab)
الاختبار التكاملي
في حين أن اختبار الوحدة يصحح أخطاء وظائف العقد بشكل معزول، فإن اختبارات التكامل تقيم مكونات العقد الذكي ككل fi hin 'ana aikhtibar alwahdat yusahih 'akhta' wazayif aleaqd bishakl maezulin, fa'iina akhtibarat altakamul tuqim mukawinat aleaqd aldhakii kakulin يمكن لاختبار التكامل اكتشاف المشكلات الناشئة عن مكالمات العقود المتبادلة أو التفاعلات بين الوظائف المختلفة في نفس العقد الذكي. yumkin liakhtibar altakamul aktishaf almushkilat alnaashiat ean mukalamat aleuqud almutabadalat 'aw altafaeulat bayn alwazayif almukhtalifat fi nafs aleaqd aldhakii على سبيل المثال، يمكن أن تساعد اختبارات التكامل في التحقق مما إذا كانت أمور مثل الوراثة (opens in a new tab) وحقن التبعية تعمل بشكل صحيح.
يعد اختبار التكامل مفيدًا إذا كان عقدك يعتمد على بنية معيارية أو يتفاعل مع عقود أخرى على السلسلة أثناء التنفيذ. yueadu akhtibar altakamul mfydan 'iidha kan eaqduk yaetamid ealaa binyat mieyariat 'aw yatafaeal mae euqud 'ukhraa ealaa alsilsilat 'athna' altanfidhi. إحدى طرق تشغيل اختبارات التكامل هي عند ارتفاع معين (باستخدام أداة مثل Forge (opens in a new tab) أو هارد هات (opens in a new tab)) ومحاكاة التفاعلات بين عقدك والعقود المنشورة.
ستتصرف سلسلة الكتل المتشعبة بشكل مشابه لشبكة Mainnet وستحتوي على حسابات بحالات وأرصدة مرتبطة بها. لكنها تعمل فقط كبيئة تطوير محلية محمية، مما يعني أنك لن تحتاج إلى ETH حقيقي للمعاملات، على سبيل المثال، ولن تؤثر تغييراتك على بروتوكول إيثريوم الحقيقي.
الاختبار القائم على الخصائص
الاختبار القائم على الملكية هو عملية التحقق من أن العقد الذكي يلبي بعض الخصائص المحددة. تؤكد الخصائص حقائق حول سلوك العقد والتي من المتوقع أن تظل صحيحة في سيناريوهات مختلفة - يمكن أن يكون أحد أمثلة خصائص العقد الذكي "العمليات الحسابية في العقد لا تتجاوز الحد الأقصى أو تتجاوزه أبدًا".
التحليل الثابت والتحليل الديناميكي هما تقنيتان شائعتان لتنفيذ الاختبار القائم على الخصائص، وكلاهما يمكنه التحقق من أن كود البرنامج (وهو عقد ذكي في هذه الحالة) يفي بخاصية محددة مسبقًا. تحتوي بعض أدوات الاختبار القائمة على الخصائص على قواعد محددة مسبقًا حول خصائص العقد المتوقعة وتتحقق من الكود وفقًا لتلك القواعد، بينما تسمح لك أدوات أخرى بإنشاء خصائص مخصصة لعقد ذكي.
التحليل الثابت
يقوم المحلل الثابت بأخذ الكود المصدر لعقد ذكي كمدخل ويخرج نتائج توضح ما إذا كان العقد يلبي خاصية أم لا. على عكس التحليل الديناميكي، لا يتضمن التحليل الثابت تنفيذ عقد لتحليله للتأكد من صحته. بدلاً من ذلك، يقوم التحليل الثابت بالتفكير في جميع المسارات المحتملة التي يمكن أن يتخذها العقد الذكي أثناء التنفيذ (أي عن طريق فحص بنية الكود المصدر لتحديد ما قد يعنيه ذلك لعملية العقود في وقت التشغيل).
التدقيق (Linting) (opens in a new tab) والاختبار الثابت (opens in a new tab) هما طريقتان شائعتان لإجراء التحليل الثابت على العقود. كلاهما يتطلب تحليل التمثيلات منخفضة المستوى لتنفيذ العقد مثل أشجار البنية المجردة (opens in a new tab) والرسوم البيانية لتدفق التحكم (opens in a new tab) التي يخرجها المترجم.
في معظم الحالات، يكون التحليل الثابت مفيدًا للكشف عن مشكلات السلامة مثل استخدام هياكل غير آمنة، أو أخطاء بناء الجملة، أو انتهاكات معايير الترميز في كود العقود. ومع ذلك، من المعروف أن المحللين الثابتين غير قادرين بشكل عام على اكتشاف نقاط الضعف العميقة، وقد ينتجون نتائج إيجابية خاطئة مفرطة.
التحليل الديناميكي
يولد التحليل الديناميكي مدخلات رمزية (على سبيل المثال، في التنفيذ الرمزي (opens in a new tab)) أو مدخلات ملموسة (على سبيل المثال، في fuzzing (opens in a new tab)) لوظائف العقود الذكية لمعرفة ما إذا كان أي مسار (مسارات) تنفيذ ينتهك خصائص معينة. يختلف هذا الشكل من الاختبار القائم على الخاصية عن اختبارات الوحدة في أن حالات الاختبار تغطي سيناريوهات متعددة ويتولى البرنامج معالجة إنشاء حالات الاختبار.
Fuzzing (opens in a new tab) هو مثال على تقنية التحليل الديناميكي للتحقق من الخصائص العشوائية في العقود الذكية. يستدعي fuzzer وظائف في عقد مستهدف مع اختلافات عشوائية أو مشوهة لقيمة إدخال محددة. إذا دخل العقد الذكي في حالة خطأ (على سبيل المثال، حيث يفشل التأكيد)، يتم وضع علامة على المشكلة ويتم إنتاج المدخلات التي تدفع التنفيذ نحو المسار المعرض للخطر في تقرير.
يعد التضليل مفيدًا لتقييم آلية التحقق من صحة مدخلات العقود الذكية نظرًا لأن التعامل غير السليم مع المدخلات غير المتوقعة قد يؤدي إلى تنفيذ غير مقصود وإنتاج تأثيرات خطيرة. يمكن أن يكون هذا الشكل من الاختبار المبني على الملكية مثاليًا لأسباب عديدة:
-
إن كتابة حالات الاختبار لتغطية العديد من السيناريوهات أمر صعب. يتطلب اختبار الخاصية فقط أن تقوم بتعريف سلوك ومجموعة من البيانات لاختبار السلوك بها - يقوم البرنامج تلقائيًا بإنشاء حالات اختبار استنادًا إلى الخاصية المحددة.
-
قد لا تغطي مجموعة الاختبار الخاصة بك جميع المسارات الممكنة داخل البرنامج بشكل كافٍ. حتى مع التغطية بنسبة 100%، من الممكن أن تفوتك بعض الحالات الهامشية.
-
تثبت اختبارات الوحدة أن العقد يتم تنفيذه بشكل صحيح لبيانات العينة، ولكن ما إذا كان العقد يتم تنفيذه بشكل صحيح للمدخلات خارج العينة يظل غير معروف. تنفذ اختبارات الخاصية عقدًا مستهدفًا مع اختلافات متعددة لقيمة إدخال معينة للعثور على آثار التنفيذ التي تسبب فشل التأكيد. وبالتالي، يوفر اختبار الخاصية مزيدًا من الضمانات بأن العقد يتم تنفيذه بشكل صحيح لفئة واسعة من بيانات الإدخال.
إرشادات لتشغيل الاختبارات القائمة على الخصائص للعقود الذكية
يبدأ تشغيل الاختبار القائم على الخصائص عادةً بتعريف خاصية (على سبيل المثال، غياب تجاوزات الأعداد الصحيحة (opens in a new tab)) أو مجموعة من الخصائص التي تريد التحقق منها في عقد ذكي. قد تحتاج أيضًا إلى تحديد نطاق من القيم التي يمكن للبرنامج من خلالها إنشاء بيانات لمدخلات المعاملات عند كتابة اختبارات الخصائص.
بمجرد تكوينه بشكل صحيح، ستقوم أداة اختبار الخصائص بتنفيذ وظائف العقود الذكية الخاصة بك باستخدام مدخلات تم إنشاؤها عشوائيًا. إذا كان هناك أي انتهاكات للتأكيدات، فيجب عليك الحصول على تقرير يحتوي على بيانات إدخال محددة تنتهك العقار قيد التقييم. راجع بعض الأدلة أدناه للبدء في تشغيل الاختبار القائم على الخاصية باستخدام أدوات مختلفة:
- التحليل الثابت للعقود الذكية باستخدام سليذر (opens in a new tab)
- التحليل الثابت للعقود الذكية باستخدام ويك (opens in a new tab)
- الاختبار القائم على الخصائص باستخدام Brownie (opens in a new tab)
- اختبار Fuzzing للعقود باستخدام فاوندري (opens in a new tab)
- اختبار Fuzzing للعقود باستخدام Echidna (opens in a new tab)
- اختبار Fuzzing للعقود باستخدام Wake (opens in a new tab)
- التنفيذ الرمزي للعقود الذكية باستخدام مانتيكور (opens in a new tab)
- التنفيذ الرمزي للعقود الذكية باستخدام ميثريل (opens in a new tab)
الاختبار اليدوي للعقود الذكية
غالبًا ما يأتي الاختبار اليدوي للعقود الذكية في وقت لاحق في دورة التطوير بعد تشغيل الاختبارات الآلية. يقوم هذا النموذج من الاختبار بتقييم العقد الذكي باعتباره منتجًا متكاملًا بالكامل لمعرفة ما إذا كان يعمل كما هو محدد في المتطلبات الفنية.
اختبار العقود على بلوكتشين محلي
على الرغم من أن الاختبار الآلي الذي يتم إجراؤه في بيئة تطوير محلية يمكن أن يوفر معلومات تصحيح أخطاء مفيدة، إلا أنك سترغب في معرفة كيفية تصرف عقدك الذكي في بيئة الإنتاج. ومع ذلك، فإن النشر على سلسلة إيثريوم الرئيسية يتكبد رسومًا للغاز - ناهيك عن أنك أو مستخدميك قد تخسرون أموالاً حقيقية إذا كان عقدك الذكي لا يزال يحتوي على أخطاء.
يعد اختبار عقدك على بلوكتشين محلي (المعروف أيضًا باسم شبكة التطوير) بديلاً موصى به للاختبار على الشبكة الرئيسية. سلسلة الكتل المحلية عبارة عن نسخة من سلسلة كتل الإيثريوم تعمل محليًا على جهاز الكمبيوتر الخاص بك والتي تحاكي سلوك طبقة تنفيذ الإيثريوم. وبالتالي، يمكنك برمجة المعاملات للتفاعل مع العقد دون تكبد تكاليف إضافية كبيرة.
قد يكون تشغيل العقود على blockchain المحلية مفيدًا كشكل من أشكال اختبار التكامل اليدوي. تتميز العقود الذكية بسهولة تكوينها، مما يسمح لك بالتكامل مع البروتوكولات الموجودة - ولكنك ستظل بحاجة إلى التأكد من أن مثل هذه التفاعلات المعقدة على السلسلة تنتج النتائج الصحيحة.
اختبار العقود على شبكات الاختبار
تعمل شبكة الاختبار أو testnet تمامًا مثل شبكة إيثريوم Mainnet، إلا أنها تستخدم الأثير (ETH) بدون قيمة حقيقية في العالم الحقيقي. taemal shabakat aliakhtibar 'aw testnet tmaman mithl shabakat إيثريوم Mainnet, 'iilaa 'anaha tastakhdim al'athir (ETH) bidun qimat haqiqiat fi alealam alhaqiqii إن نشر عقدك على شبكة الاختبار يعني أن أي شخص يمكنه التفاعل معه (على سبيل المثال، عبر الواجهة الأمامية للتطبيق اللامركزي) دون تعريض الأموال للخطر.
يُعد هذا الشكل من الاختبار اليدوي مفيدًا لتقييم التدفق الشامل لتطبيقك من وجهة نظر المستخدم yued hadha alshakl min aliakhtibar alyadawii mfydan litaqyim altadafuq alshaamil litatbiqik min wijhat nazar almustakhdam هنا، يمكن لمختبري النسخة التجريبية أيضًا إجراء عمليات تجريبية والإبلاغ عن أي مشكلات تتعلق بمنطق أعمال العقد والوظائف العامة. هنا، يمكن لمختبري النسخة التجريبية أيضاً إجراء عمليات تجريبية والإبلاغ عن أي مشكلات تتعلق بمنطق أعمال العقد والوظائف العامة.
يعد النشر على شبكة اختبار بعد الاختبار على blockchain محلي أمرًا مثاليًا نظرًا لأن الأول أقرب إلى سلوك إيثريوم Virtual Machine. yueadu alnashr ealaa shabakat akhtibar baed aliakhtibar ealaa blockchain mahaliyin amran mthalyan nzran li'ana al'awal 'aqrab 'iilaa suluk إيثريوم Virtual Machine. لذلك، من الشائع بالنسبة للعديد من مشاريع إيثريوم الأصلية نشر تطبيقات لامركزية على شبكات الاختبار لتقييم عملية العقود الذكية في ظل ظروف العالم الحقيقي. لذلك، من الشائع بالنسبة للعديد من مشاريع Ethereum الأصلية نشر تطبيقات لامركزية على شبكات الاختبار لتقييم عمليات العقود الذكية في ظل ظروف العالم الحقيقي.
المزيد عن شبكات اختبار إيثريوم.
الاختبار مقابل التحقق الرسمي
While testing helps confirm that a contract returns the expected results for some data inputs, it cannot conclusively prove the same for inputs not used during tests. لذلك، فإن اختبار العقد الذكي لا يمكنه ضمان "الصحة الوظيفية" (أي أنه لا يمكنه إظهار أن البرنامج يتصرف كما هو مطلوب لـ_جميع_ مجموعات قيم الإدخال).
التحقق الرسمي هو نهج لتقييم صحة البرنامج من خلال التحقق مما إذا كان النموذج الرسمي للبرنامج يتطابق مع المواصفات الرسمية. altahaquq alrasmiu hu nahj litaqyim sihat albarnamaj min khilal altahaquq mimaa 'iidha kan alnamudhaj alrasmiu lilbarnamaj yatatabaq mae almuasafat alrasmiati. النموذج الرسمي هو تمثيل رياضي مجرد لبرنامج، في حين أن المواصفات الرسمية تحدد خصائص البرنامج (أي التأكيدات المنطقية حول تنفيذ البرنامج). النموذج الرسمي هو تمثيل رياضي مجرد لبرنامج، في حين تحدد المواصفات الرسمية خصائص البرنامج (أي التأكيدات المنطقية حول تنفيذ البرنامج).
نظرًا لأن الخصائص مكتوبة بمصطلحات رياضية، فمن الممكن التحقق من أن النموذج الرسمي (الرياضي) للنظام يلبي المواصفات باستخدام قواعد الاستدلال المنطقي. نظراً لأن الخصائص مكتوبة بمصطلحات رياضية، فمن الممكن التحقق من أن النموذج الرسمي (الرياضي) للنظام يلبي المواصفات باستخدام قواعد الاستدلال المنطقي. وبالتالي، يُقال إن أدوات التحقق الرسمية تُنتج "دليلاً رياضياً" على صحة النظام. وبالتالي، يُقال إن أدوات التحقق الرسمية تُنتج "دليلاً رياضياً" على صحة النظام.
على عكس الاختبار، يمكن استخدام التحقق الرسمي للتأكد من أن تنفيذ العقود الذكية يلبي مواصفات رسمية لـ_جميع_ عمليات التنفيذ (أي أنه لا يحتوي على أخطاء) دون الحاجة إلى تنفيذه باستخدام بيانات العينة. لا يؤدي هذا إلى تقليل الوقت المستغرق في تشغيل العشرات من اختبارات الوحدة فحسب، بل إنه أيضًا أكثر فعالية في اكتشاف الثغرات الأمنية المخفية. لا يؤدي هذا إلى تقليل الوقت المستغرق في تشغيل العشرات من اختبارات الوحدة فحسب، بل إنه أيضاً أكثر فاعلية في اكتشاف الثغرات الأمنية المخفية. ومع ذلك، فإن تقنيات التحقق الرسمية تقع على طيف يعتمد على صعوبة تنفيذها ومدى فائدتها. ومع ذلك، فإن تقنيات التحقق الرسمية تقع على طيف يعتمد على صعوبة تنفيذها ومدى فائدتها.
المزيد عن التحقق الرسمي للعقود الذكية.
الاختبار مقابل عمليات التدقيق ومكافآت الأخطاء
وكما ذكرنا، نادراً ما يمكن للاختبارات الصارمة ضمان عدم وجود أخطاء في العقد؛ ويمكن أن توفر أساليب التحقق الرسمية ضمانات أقوى للصحة، ولكنها يصعب استخدامها حالياً وتتطلب تكاليف كبيرة.
ومع ذلك، يمكنك زيادة احتمال اكتشاف ثغرات العقد من خلال الحصول على مراجعة مستقلة للكود. تدقيقات العقود الذكية (opens in a new tab) ومكافآت الأخطاء (opens in a new tab) هما طريقتان لجعل الآخرين يحللون عقودك.
يتم إجراء عمليات التدقيق من قبل مدققين لديهم خبرة في العثور على حالات الثغرات الأمنية وممارسات التطوير الرديئة في العقود الذكية. عادةً ما يتضمن التدقيق الاختبار (وربما التحقق الرسمي) بالإضافة إلى المراجعة اليدوية لقاعدة التعليمات البرمجية بأكملها.
على العكس من ذلك، فإن برنامج مكافأة الأخطاء عادة ما ينطوي على تقديم مكافأة مالية لشخص (يُطلق عليه عادةً اسم مخترقي القبعات البيضاء (opens in a new tab)) يكتشف ثغرة أمنية في عقد ذكي ويكشفها للمطورين. Bug bounties are similar to audits since it involves asking others to help find defects in smart contracts.
الفرق الرئيسي هو أن برامج مكافأة الأخطاء مفتوحة لمجتمع المطورين/المتسللين الأوسع وتجذب فئة واسعة من المتسللين الأخلاقيين ومحترفي الأمن المستقلين ذوي المهارات والخبرات الفريدة. This may be an advantage over smart contract audits that mainly rely on teams who may possess limited or narrow expertise.
أدوات ومكتبات الاختبار
أدوات اختبار الوحدة
-
solidity-coverage (opens in a new tab) - أداة تغطية الكود للعقود الذكية المكتوبة بلغة سوليديتي.
-
وافل (opens in a new tab) - إطار عمل لتطوير واختبار العقود الذكية المتقدمة (يعتمد على ethers.js).
-
اختبارات Remix (opens in a new tab) - أداة لاختبار عقود Solidity الذكية. تعمل تحت المكون الإضافي لـ Remix IDE "Solidity Unit Testing" والذي يُستخدم لكتابة وتشغيل حالات الاختبار للعقد.
-
أوبن زبلين Test Helpers (opens in a new tab) - مكتبة تأكيد لاختبار عقود إيثريوم الذكية. Make sure your contracts behave as expected!_
-
إطار عمل اختبار الوحدات Brownie (opens in a new tab) - يستخدم Brownie إطار Pytest، وهو إطار عمل اختبار غني بالميزات يتيح لك كتابة اختبارات صغيرة بأقل قدر من التعليمات البرمجية، ويتوسع بشكل جيد للمشاريع الكبيرة، كما أنه قابل للتوسع بدرجة كبيرة.
-
اختبارات فاوندري (opens in a new tab) - تقدم فاوندري إطار Forge، وهو إطار عمل سريع ومرن لاختبار إيثريوم قادر على تنفيذ اختبارات وحدات بسيطة، وفحوصات تحسين الغاز، وfuzzing العقود.
-
هارد هات Tests (opens in a new tab) - إطار عمل لاختبار العقود الذكية يعتمد على ethers.js وMocha وChai.
-
ApeWorx (opens in a new tab) - إطار عمل للتطوير والاختبار قائم على بايثون للعقود الذكية التي تستهدف آلة إيثريوم الافتراضية.
-
ويك (opens in a new tab) - إطار عمل قائم على بايثون لاختبار الوحدات وfuzzing مع إمكانيات تصحيح أخطاء قوية ودعم اختبار عبر السلسلة، باستخدام pytest وAnvil للحصول على أفضل تجربة مستخدم وأداء.
أدوات الاختبار القائم على الخصائص
أدوات التحليل الثابت
-
سليذر (opens in a new tab) - إطار عمل تحليل ثابت قائم على بايثون بلغة سوليديتي للبحث عن الثغرات الأمنية، وتحسين فهم الكود، وكتابة تحليلات مخصصة للعقود الذكية.
-
Ethlint (opens in a new tab) - أداة Linter لتطبيق أفضل ممارسات الأسلوب والأمان للغة برمجة العقود الذكية سوليديتي.
-
Cyfrin Aderyn (opens in a new tab) - محلل ثابت قائم على راست مصمم خصيصًا لأمان وتطوير عقود ويب3 الذكية.
-
ويك (opens in a new tab) - إطار عمل تحليل ثابت قائم على بايثون مع كاشفات للثغرات الأمنية وجودة الكود، وطابعات لاستخراج المعلومات المفيدة من الكود ودعم لكتابة وحدات فرعية مخصصة.
-
Slippy (opens in a new tab) - أداة تدقيق (linter) بسيطة وقوية للغة سوليديتي.
أدوات التحليل الديناميكي
-
إيكيدنا (opens in a new tab) - أداة fuzzing سريعة للعقود للكشف عن الثغرات الأمنية في العقود الذكية من خلال الاختبار القائم على الخصائص.
-
Diligence Fuzzing (opens in a new tab) - أداة Fuzzing آلية مفيدة للكشف عن انتهاكات الخصائص في كود العقد الذكي.
-
مانتيكور (opens in a new tab) - إطار عمل تنفيذ رمزي ديناميكي لتحليل الكود الثنائي (bytecode) لآلة إيثريوم الافتراضية (EVM).
-
ميثريل (opens in a new tab) - أداة تقييم الكود الثنائي (bytecode) لآلة الإيثريوم الافتراضية (EVM) للكشف عن ثغرات العقود باستخدام تحليل التلوث، والتحليل التوافقي، وفحص تدفق التحكم.
-
Diligence سكربل (opens in a new tab) - Scribble هي لغة مواصفات وأداة للتحقق من وقت التشغيل تتيح لك إضافة تعليقات توضيحية على العقود الذكية بخصائص تسمح لك باختبار العقود تلقائيًا باستخدام أدوات مثل Diligence Fuzzing أو ميث إكس.
دروس تعليمية ذات صلة
- نظرة عامة ومقارنة لمنتجات الاختبار المختلفة _
- كيفية استخدام إيكيدنا لاختبار العقود الذكية
- كيفية استخدام مانتيكور للعثور على أخطاء العقود الذكية
- كيفية استخدام سليذر للعثور على أخطاء العقود الذكية
- كيفية محاكاة عقود سوليديتي للاختبار
- كيفية تشغيل اختبارات الوحدة في سوليديتي باستخدام فاوندري (opens in a new tab)