ستخدم أدوات تدقيق العقود الذكية لتحديد الثغرات الأمنية في العقود الذكية . يمكن استخدام هذه الأدوات من قبل مدققي العقود الذكية أو المطورين أو أي شخص آخر يريد التأكد من أن عقودهم الذكية آمنة أو تتمتع بمستوى معين من الأمان.
سنقدم لمحة عامة عن اختبار الطفرة و هو نهج حديث يُستخدم لتحسين جودة البرمجيات عن طريق تقييم وتحسين مجموعات الاختبار. يتضمن هذا النهج إدخال طفرات في البرنامج لمعرفة مدى قدرة مجموعة الاختبار على اكتشافها. في هذا المقال، سنركز على استخدام أدوات مثل Vertigo-rs وSuMo، التي تم تصميمها خصيصًا لاختبار الطفرة في بيئات مثل Foundry وHardhat، وسنقدم نظرة شاملة عن كيفية التثبيت والاستخدام.
كما سبق و تحدثنا عن في مقالات سابقة عن أدوات التحليل الثابت، وأدوات التشويش، وأدوات التحقق الرسمية، وأدوات التصور.
ملاحظة: تحتوي بعض هذه الأدوات على متطلبات Python غير متوافقة عند التثبيت، لذا كن حذرًا عند استخدامها على نفس الجهاز. تفترض هذه المقالة إتقان لغة Solidity.
اختبار الطفرة (Mutation Testing)
يقوم اختبار الطفرة بتقييم وتحسين مجموعات الاختبار عن طريق إدخال أخطاء (طفرات) في البرنامج الذي يتم اختباره.
الهدف هو معرفة مدى نجاح مجموعة الاختبار في اكتشاف هذه الطفرات والقضاء عليها.الطفرات الحية التي تجتاز جميع الاختبارات، يكشفون عن نقاط الضعف في مجموعة الاختبار ويوجهون تحسينها.
يمكنك معرفة المزيد حول اختبار الطفرات في مقال إختبار الطفرات في سوليتي .
دعونا نلقي نظرة على بعض أدوات الطفرة.
1. Vertigo-rs
Vertigo-rs عبارة عن شوكة من vertigo testing framework الخاص بـ Joran Honig مع دعم إضافي لـ Foundry.
يقوم Vertigo-rs بتحويل الملفات في src/ وتشغيل اختبار forge لمعرفة ما إذا كانت الطفرة ستبقى على قيد الحياة. يتم تجاهل الملفات التي تنتهي بـ .t.sol أو التي تحتوي على test باسمها (بما في ذلك المسار). لن يتم تغيير الملفات الموجودة في lib (أو أي مجلد ليس src/).
لا تحتاج إلى تحديد أنك في مشروع Foundry. سيشير وجود ملف Foundry.toml لهذه الأداة إلى أنه Foundry. إذا كانت لديك ملفات configuration لـ Truffle أو Hardhat في مشروعك، فستحدث هذه الأداة خطأً.
التثبيت: لتثبيت vertigo-rs، اتبع الخطوات التالية:
git clone https://github.com/RareSkills/vertigo-rs
cd vertigo-rs
python setup.py develop
mukaebكيفية الاستخدام: استخدم هذه الأوامر لتشغيل vertigo-rs في مشروع Foundry:
cd <your foundry project>
# Run vertigo
python <path-to-the-vertigo-project>/vertigo-rs/vertigo.py run
mukaebسنجرب مثالا أدناه.
تهيئة مشروع Foundry جديد باستخدام:
forge init vertigo-test
cd vertigo-test
mukaebسنقوم بتحديث ملفات src الافتراضية و الإختبارات في المشروع بحيث يتم توليد طفرات في المشروع بسهولة
انسخ هذا الكود والصقه داخل ملف Counter.sol.
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
contract Counter {
int256 public number;
function setNumber(int256 newNumber) public {
number = newNumber;
}
function increment() public {
number = number + 1;
}
function decrement() public {
number = number - 1;
}
function multiply() public {
number = number * 2;
}
}
mukaebالصق هذا داخل ملف Counter.t.sol.
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import "forge-std/Test.sol";
import "../src/Counter.sol";
contract CounterTest is Test {
Counter public counter;
function setUp() public {
counter = new Counter();
counter.setNumber(0);
}
function testIncrement() public {
counter.increment();
counter.increment();
assertEq(counter.number(), 2);
}
function testDecrement() public {
counter.setNumber(20);
counter.decrement();
counter.decrement();
assertEq(counter.number(), 18);
}
function testMultiply() public {
counter.setNumber(6);
counter.multiply();
assertEq(counter.number(), 12);
}
function testSetNumber(int256 x) public {
counter.setNumber(x);
assertEq(counter.number(), x);
}
}
mukaebبعد ذلك، قم بتشغيل python3 <path-to-vertigo-rd-folder>/vertigo-rs/vertigo.py run. نحصل على النتيجة التالية:
يمكننا أن نرى أنه تم إنشاء ثلاثة طفرات ولم ينج أي منهم لأن اختبارنا كان قادرًا على إيجادهم.
دعونا نختبر السيناريو الذي يبقى فيه المتحول على قيد الحياة. إذا لم يتسبب تغيير الكود في فشل الاختبار، فهذا يعني أن مجموعة الاختبار تمت كتابتها بشكل سيئ.
قم بتعليق assertEq(counter.number(), 2) ; في السطر 18 من ملف الاختبار، داخل وظيفة “testIncrement” وقم بتشغيل vertigo مرة أخرى.
هذه المرة حصلنا على طفرة على قيد الحياة:
2. Certora Gambit
Gambit هو نظام طفرة متطور للـسوليدتي. ويستخدم مشغلي الطفرة لتعديل الكود المصدري لبرنامج Solidity. يؤدي هذا إلى إنشاء طفرات، وهي متغيرات متحورة من البرنامج.
هذه الطفرات، مفيدة لتحليل مجموعات الاختبار والمواصفات المستخدمة للتحقق الرسمي. تمثل كل طفرة خطأ محتملا. يمكن قياس كفاءة مجموعات الاختبار والمواصفات من خلال عدد الطفرات المتبقية المكتشفة.
التثبيت:
يتطلب Gambit تثبيت كل من Rust وsolc.
قم بتشغيل الأوامر التالية:
- تثبيت Rust و cargo:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
mukaeb- تثبيت solc:
- لينكس:
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
mukaeb- ماك:
brew tap ethereum/ethereum
brew install solidity
mukaebالآن لتثبيت Gambit، قم باستنساخ مستودع Gambit وقم ببناء Gambit:
git clone https://github.com/Certora/gambit.git
cd gambit/
cargo install --path .
gambit -h
mukaebكيفية الاستخدام:
لإنشاء الطفرات : قم بتشغيل:
gambit mutate --filename <file.sol>
mukaebسيؤدي هذا إلى إنشاء طفرات لملف Solidity في مجلد gambit_out/mutants/.
يمكنك الحصول على ملخص للطفرات التي تم إنشاؤها عن طريق تشغيل:.
gambit summary
mukaebعلى سبيل المثال، سنقوم بإنشاء طفرات لكود Solidity أدناه (اسمه Code.sol).
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.0;
contract Vulnerable {
mapping(address => uint) public balance;
function donate(address to) public payable {
balance[to] += msg.value;
}
function withdraw(uint amount) public {
if (balance[msg.sender] >= amount) {
msg.sender.call{value: amount}("");
balance[msg.sender] -= amount;
}
}
function queryBalance(address to) public view returns (uint) {
return balance[to];
}
}
mukaebعندما نقوم بتشغيل gambit mutate –filename Code.sol، نحصل على:
تم إنشاء سبعة طفرات ويمكننا العثور عليها في المجلد gambit_out/ كما ذكرنا سابقًا.
الآن قم بتشغيلgambit summary. نحصل على ملخص للطفرات التي تم إنشاؤها:
نقاط القوة
- عملية التثبيت والاستخدام سهلة.
- يقوم Gambit أيضًا بإنشاء تعليقات في ملفات الطفرات تشير إلى أي جزء من الكود تم تغييره.
- يتم إنشاء الطفرات بسرعة.
- يمكنك تعديل ملفات Solidity متعددة باستخدام ملفات التكوين.
نقاط الضعف
- على عكس vertigo-rs الذي يقوم بتحويل كود العقد الذكي وإجراء الاختبار له، فإن Gambit يقوم فقط بتحويل كود Solidity وسيتعين عليك إجراء اختبار يدويًا على الكود لمعرفة ما إذا كانت هناك أي طفرات ستنجو.
3. SuMo
SuMo هي أداة اختبار الطفرات لعقود Solidity Smart، وهي مصممة للعمل في الغالب في بيئة NodeJS.
التثبيت:
يمكن استخدام SuMo في مشروع Truffle أو Hardhat أو Brownie أو Foundry، ولكننا سنستخدم hardhat.
أولاً نقوم بإنشاء مشروع hardhat وتثبيت sumo كحزمة npm داخل مشروعنا:
mkdir sumo-hardhat
cd sumo-hardhat
npm init -y
npm install --save-dev hardhat
npx hardhat init
npm install @morenabarboni/sumo
mukaebسيتم إنشاء ملف التكوين: sumo-config.js.
استبدل محتوى ملف config الذي تم إنشاؤه تلقائيًا بما يلي:
module.exports = {buildDir: "artifacts",contractsDir: "contracts",testDir: "test",skipContracts: [""],skipTests: [""],testingTimeOutInSec: 300,network: "none",testingFramework: "hardhat",minimal: false,tce: false,};
mukaebSuMo جاهز الآن للاستخدام.
كيفية الاستخدام:
الآن بعد أن تم تعديل config، يمكننا تشغيل:
- اnpx sumo preflight لعرض الطفرات المتاحة وحفظ نموذج تقرير في ملف .sumo/report.txt.
npx sumo preflight
mukaeb- npx sumo mutate لإنشاء طفرات. يتم حفظ الطفرات في ملف .sumo/mutants وسيتوفر نموذج تقرير في ملف .sumo/report.txt،
npx sumo mutate
mukaebقم بتشغيل npx sumo list لعرض قائمة بجميع عوامل الطفرة الممكّنة، و npx sumo enable لتمكين جميع مشغلي الطفرة .
يتم إنشاء المجلد .sumo لإخراج هذه الأوامر. انقر هنا لمعرفة المزيد عن الأداة .
يأتي Hardhat مع عقد افتراضي واختبار. يمكننا اختبار موثوقية الاختبار باستخدام السومو للعثور على المسوخ.
للقيام بذلك نقوم بتشغيل:
npx sumo test
mukaebوبعد الاختبار نحصل على التقرير التالي:
لقد حصلنا على درجة طفرة قدرها 72.92%. على الرغم من أن هذا هو الملف الافتراضي الذي يأتي مع Hardhat ، إلا أنه من الأفضل أن يكون لديك درجة طفرة لا تقل عن 80%.
يمكنك التحقق من مجلد .sumo/ لمزيد من المعلومات، كما يمكن العثور على العقد الأصلي والاختبار في مجلد .sumo.baseline.
نقاط القوة
- يدعم مشاريع Truffle أو Hardhat أو Brownie أو Foundry
- ويضم 25 عامل طفرة خاص بـ Solidity، بالإضافة إلى 19 عاملًا تقليديًا.
- يقوم SuMo بإنشاء العديد من الأكواد المتحولة.
- لديه ميزات فريدة، مثل preflight, mutate, restore and diff.
- تقوم SuMo بإنشاء تقارير مفيدة بعد تشغيل أوامر مثل preflight و mutate.
- فهو يولد درجة طفرة وملخص اختبار في نهاية الاختبار.
نقاط الضعف
- قد يكون بطيئا في اختبار كبير.
ختاما
إن مفهوم اختبار الطفرة هو أحد الأساليب الحديثة المستخدمة لضمان جودة البرمجيات والحد من الأخطاء. بفضل أدوات مثل Vertigo-rs وSuMo، أصبح من الممكن الآن تقييم فعالية مجموعات الاختبار بطرق أكثر تطورًا. مع استمرار تطور هذه الأدوات وظهور أدوات جديدة، يمكننا أن نتوقع تحسينًا مستمرًا في جودة البرمجيات وأمان التطبيقات المبنية باستخدام Solidity وغيرها من لغات البرمجة.
إطرح رأيك ؟
أظهر التعليقات / إنرك تعليق