
محلل ثابت لعقود Starknet الذكية
كاراكال هي أداة تحليل ثابتة تعمل على تمثيل SIERRA للعقود الذكية لـ Starknet.
الملفات الثنائية المجمعة مسبقاً متوفرة في صفحة الإصدارات. إذا كنت تستخدم مترجم Cairo 1.x.x فاستخدم الإصدار الثنائي v0.1.x، وإذا كنت تستخدم مترجم Cairo 2.x.x فاستخدم v0.2.x.
تحتاج إلى مترجم Rust و Cargo. البناء من git:
cargo install --git https://github.com/crytic/caracal --profile release --force
البناء من نسخة محلية:
git clone https://github.com/crytic/caracal
cd caracal
cargo install --path . --profile release --force
عرض الكاشفات:
caracal detectors
عرض الطابعات:
caracal printers
لاستخدامه مع ملف Cairo مستقل ولديك مترجم Cairo محلي ثنائي، يكفي توجيهه إلى الملف. وإلا، يتم استخدام مترجم مدمج وتحتاج إلى تمرير مسار مكتبة corelib إما باستخدام خيار --corelib أو بتعيين متغير البيئة CORELIB_PATH.
تشغيل الكاشفات:
caracal detect path/file/to/analyze
caracal detect path/file/to/analyze --corelib path/to/corelib/src
تشغيل الطابعات:
caracal print path/file/to/analyze --printer printer_to_use --corelib path/to/corelib/src
إذا كان لديك مشروع Cairo يحتوي على عدة ملفات وعقود، فقد تحتاج إلى تحديد العقود باستخدام --contract-path. يتم استخدام مترجم Cairo المحلي الثنائي إذا كان متاحاً، وإلا يتم استخدام مترجم مدمج. في الحالة الأخيرة، تحتاج أيضاً إلى تحديد corelib كما هو موضح أعلاه للحالة المستقلة. المسار هو الدليل الذي يحتوي على ملف cairo_project.toml.
تشغيل الكاشفات:
caracal detect path/to/dir
caracal detect path/to/dir --contract-path token::myerc20::... token::myerc721::...
تشغيل الطابعات:
caracal print path/to/dir --printer printer_to_use
إذا كان لديك مشروع يستخدم Scarb، فأنت بحاجة إلى إضافة ما يلي في ملف Scarb.toml:
[[target.starknet-contract]]
sierra = true
[cairo]
sierra-replace-ids = true
ثم قم بتمرير المسار إلى الدليل الذي يحتوي على ملف Scarb.toml. تشغيل الكاشفات:
caracal detect path/to/dir
تشغيل الطابعات:
caracal print path/to/dir --printer printer_to_use
يمثل عمود Cairo إصدار (إصدارات) المترجم الذي يكون الكاشف صالحاً له.
cfg: تصدير CFG لكل دالة إلى ملف .dotcallgraph: تصدير رسم بياني لاستدعاءات الدوال إلى ملف .dotاطلع على الويكي في المواضيع التالية:
| الرقم | الكاشف | ما يكتشفه | التأثير | الثقة | Cairo |
|---|
| 1 | controlled-library-call | استدعاءات مكتبة مع هاش فئة يتحكم فيه المستخدم | عالية | متوسطة | 1 & 2 |
| 2 | unchecked-l1-handler-from | اكتشاف معالجات L1 بدون التحقق من عنوان المرسل | عالية | متوسطة | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | اكتشاف عمليات يتحكم بها المستخدم باستخدام نوع felt252، وهو غير آمن من الفيضان/النقصان | متوسطة | متوسطة | 1 & 2 |
| 4 | reentrancy | اكتشاف عندما يتم قراءة متغير تخزين قبل استدعاء خارجي وكتابته بعده | متوسطة | متوسطة | 1 & 2 |
| 5 | read-only-reentrancy | اكتشاف عندما تقرأ دالة عرض متغير تخزين تمت كتابته بعد استدعاء خارجي | متوسطة | متوسطة | 1 & 2 |
| 6 | unused-events | أحداث تم تعريفها ولكن لم يتم إصدارها | متوسطة | متوسطة | 1 & 2 |
| 7 | unused-return | قيم إرجاع غير مستخدمة | متوسطة | متوسطة | 1 & 2 |
| 8 | unenforced-view | الدالة تحتوي على معدِّل view ولكنها تعدل الحالة | متوسطة | متوسطة | 1 |
| 9 | tx-origin | اكتشاف استخدام عنوان مصدر المعاملة كتحكم في الوصول | متوسطة | متوسطة | 2 |
| 10 | unused-arguments | وسائط غير مستخدمة | منخفضة | متوسطة | 1 & 2 |
| 11 | reentrancy-benign | اكتشاف عندما يتم كتابة متغير تخزين بعد استدعاء خارجي ولكن لم يتم قراءته قبله | منخفضة | متوسطة | 1 & 2 |
| 12 | reentrancy-events | اكتشاف عندما يتم إصدار حدث بعد استدعاء خارجي مما يؤدي إلى أحداث خارج الترتيب | منخفضة | متوسطة | 1 & 2 |
| 13 | dead-code | دوال خاصة لم يتم استخدامها أبداً | منخفضة | متوسطة | 1 & 2 |
| 14 | use-after-pop-front | اكتشاف استخدام مصفوفة أو span بعد إزالة عنصر/عناصر | منخفضة | متوسطة | 1 & 2 |