
مختبر العقود الذكية لإيثيريوم
# Echidna: مُختبِر عقود ذكية سريع <a href="https://raw.githubusercontent.com/crytic/echidna/master/echidna.png"><img src="https://assets.kitploit.com/production/public/readmes/2659/763a0b6f546e53fe33e871cd7359ba47272d81be37527f1cceaa827256af0337.png" width="75"/></a>

Echidna مخلوق غريب يأكل الأخطاء وشديد الحساسية للكهرباء (مع الاعتذار لجاكوب ستانلي)
بشكل أكثر جدية، Echidna هو برنامج بلغة Haskell مصمم لاختبار التشويش/الاختبار القائم على الخصائص لعقود إيثيريوم الذكية. يستخدم حملات تشويش متطورة قائمة على القواعد النحوية بناءً على [واجهة ثنائية للعقد (contract ABI)](https://docs.soliditylang.org/en/develop/abi-spec.html) لدحض المسندات المعرّفة من قبل المستخدم أو [تأكيدات Solidity](https://docs.soliditylang.org/en/develop/control-structures.html#error-handling-assert-require-revert-and-exceptions). صممنا Echidna مع مراعاة المعيارية، بحيث يمكن توسيعه بسهولة ليشمل طفرات جديدة أو لاختبار عقود محددة في حالات معينة.
## الميزات
* يولّد مدخلات مصممة خصيصًا لشفرتك الفعلية
* جمع اختياري لمجموعة المدخلات، وتوجيه الطفرات والتغطية للعثور على أخطاء أعمق
* مدعوم بـ [Slither](https://github.com/crytic/slither) لاستخراج معلومات مفيدة قبل حملة التشويش
* تكامل مع الشفرة المصدرية لتحديد الأسطر التي تمت تغطيتها بعد حملة التشويش
* واجهة طرفية تفاعلية، أو إخراج نصي فقط أو بصيغة JSON
* تصغير تلقائي لحالات الاختبار لفرز سريع
* تكامل سلس في سير عمل التطوير
.. و[شعار جميل بدقة عالية مصنوع يدويًا](https://raw.githubusercontent.com/crytic/echidna/master/echidna.png).
<a href="https://i.imgur.com/saFWti4.png"><img src="https://assets.kitploit.com/production/public/readmes/2659/ec117cf17d5b4eeb75f52a3654df19ba615818f232d5e9238093cf010431fedc.png" width="650"/></a>
## الاستخدام
### تنفيذ مشغّل الاختبار
تتمثل الوظيفة الأساسية لـ Echidna في ملف تنفيذي يُسمى `echidna`، يأخذ عقدًا وقائمة من الثوابت (الخصائص التي يجب أن تظل صحيحة دائمًا) كمدخل. لكل ثابت، يولّد تسلسلات عشوائية من الاستدعاءات للعقد ويتحقق مما إذا كان الثابت صحيحًا. إذا تمكن من إيجاد طريقة لدحض الثابت، فإنه يطبع تسلسل الاستدعاءات الذي يفعل ذلك. وإذا لم يتمكن، فلديك بعض الطمأنينة بأن العقد آمن.
### كتابة الثوابت
يتم التعبير عن الثوابت كدوال Solidity بأسماء تبدأ بـ `echidna_`، ولا تأخذ وسائط، وتعيد قيمة منطقية. على سبيل المثال، إذا كان لديك متغير `balance` يجب ألا ينخفض أبدًا عن `20`، يمكنك كتابة دالة إضافية في عقدك مثل هذه:```solidity
function echidna_check_balance() public returns (bool) {
return(balance >= 20);
}
```
للتحقق من هذه الثوابت، شغّل:```sh
$ echidna myContract.sol
```
يمكن العثور على مثال لعقد مع اختبارات في [tests/solidity/basic/flags.sol](https://github.com/crytic/echidna/blob/master/tests/solidity/basic/flags.sol). لتشغيله، يجب عليك تنفيذ:```sh
$ echidna tests/solidity/basic/flags.sol
```
يجب أن يجد Echidna تسلسل استدعاء يزيّف `echidna_sometimesfalse` ويجب ألا يتمكن من إيجاد مدخل مزيّف لـ `echidna_alwaystrue`.
### أوضاع الاختبار
يستخدم المثال أعلاه الوضع الافتراضي **property**، لكن Echidna يدعم عدة أوضاع اختبار، تُضبط عبر `testMode` في ملف الإعدادات أو `--test-mode` على سطر الأوامر:
* **`property`** (افتراضي): اختبار الدوال التي تبدأ بـ `echidna_` والتي تُرجع `bool`.
* **`assertion`**: كشف إخفاقات التأكيد من `assert()` ومساعدات `assertX` الخاصة بـ Foundry (`assertTrue`، `assertEq`، إلخ).
* **`foundry`**: تشغيل اختبارات بنمط Foundry، باتباع اصطلاحات التسمية الخاصة به: اختبارات الوحدة والاختبارات العشوائية التي تبدأ بـ `test` (يُتوقع أن تُرجع التي تبدأ بـ `testFail`) والثوابت الحالية التي تبدأ بـ `invariant` أو `statefulFuzz`. الدوال التي تبدأ بـ `check` و `prove` هي نقاط دخول رمزية، لكن بما أن هذا الوضع هو حملة اختبار عشوائي، فإنها تُختبر عشوائياً مثل أي دالة اختبار أخرى.
* **`verification`**: التحقق رمزياً من كل دالة في العقد باستخدام معاملة واحدة. تُستخدم الدوال التي تبدأ بـ `check` و `prove` دائماً كنقاط دخول.
* **`overflow`**: كشف تجاوزات/نقصان الأعداد الصحيحة (Solidity >= 0.8.0).
* **`optimization`**: تعظيم القيمة المُرجعة للدوال التي تبدأ بـ `echidna_` والتي تُرجع `int256` (يستخدم نفس البادئة القابلة للضبط كما في وضع property).
* **`exploration`**: جمع التغطية دون التحقق من الخصائص.
### جمع التغطية وتصوّرها
بعد إنهاء حملة، يمكن لـ Echidna حفظ **corpus** يعظّم التغطية في دليل خاص يُحدد بخيار الإعدادات `corpusDir`. سيحتوي هذا الدليل على مدخلين: (1) دليل باسم `coverage` يحتوي على ملفات JSON يمكن لـ Echidna إعادة تشغيلها و(2) ملف نصي عادي باسم `covered.txt`، وهو نسخة من الشيفرة المصدرية مع تعليقات التغطية.
إذا شغّلت مثال `tests/solidity/basic/flags.sol`، فسيحفظ Echidna بضعة ملفات معاملات مُسلسلة في دليل `coverage` وملف `covered.$(date +%s).txt` بالأسطر التالية:```text
*r | function set0(int val) public returns (bool){
* | if (val % 100 == 0)
* | flag0 = false;
}
*r | function set1(int val) public returns (bool){
* | if (val % 10 == 0 && !flag0)
* | flag1 = false;
}
```
تقوم أداتنا بتمييز كل أثر تنفيذ في المجموعة بعلامة "سطر" التالية:
* `*` إذا انتهى التنفيذ بـ STOP
* `r` إذا انتهى التنفيذ بـ REVERT
* `o` إذا انتهى التنفيذ بخطأ نفاد الغاز
* `e` إذا انتهى التنفيذ بأي خطأ آخر (قسمة على صفر، فشل تأكيد، إلخ)
### دعم أنظمة بناء العقود الذكية
يمكن لـ Echidna اختبار العقود المُجمَّعة باستخدام أنظمة بناء العقود الذكية المختلفة، بما في ذلك [Foundry](https://book.getfoundry.sh/)، و[Hardhat](https://hardhat.org/)، و[Truffle](https://archive.trufflesuite.com/)، باستخدام [crytic-compile](https://github.com/crytic/crytic-compile). لاستدعاء Echidna مع إطار التجميع الحالي، استخدم `echidna .`.
بالإضافة إلى ذلك، تدعم Echidna وضعين لاختبار العقود المعقدة. أولاً، يمكن للمرء [الاستفادة من حالة الشبكة الموجودة](https://secure-contracts.com/program-analysis/echidna/advanced/state-network-forking.html) واستخدامها كحالة أساسية لـ Echidna. ثانياً، يمكن لـ Echidna استدعاء أي عقد بواجهة ABI معروفة عن طريق تمرير مصدر Solidity المقابل في سطر الأوامر. استخدم `allContracts: true` في إعداداتك لتفعيل هذا.
### دورة مكثفة عن Echidna
يحتوي مستودعنا [Building Secure Smart Contracts](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial) على دورة مكثفة عن Echidna، بما في ذلك أمثلة ودروس وتمارين.
### استخدام Echidna في سير عمل GitHub Actions
هناك إجراء Echidna يمكن استخدامه لتشغيل `echidna` كجزء من
سير عمل GitHub Actions. يرجى الرجوع إلى مستودع
[crytic/echidna-action](https://github.com/crytic/echidna-action) للحصول على
تعليمات الاستخدام والأمثلة.
### خيارات الإعدادات
يمكن استخدام واجهة سطر أوامر Echidna لاختيار العقد المراد اختباره وتحميل
ملف الإعدادات.```sh
$ echidna contract.sol --contract TEST --config config.yaml
```
يسمح ملف التكوين للمستخدمين باختيار معاملات EVM وتوليد الاختبارات. يمكن العثور على مثال لملف تكوين كامل ومُعلّق مع الخيارات الافتراضية في
[tests/solidity/basic/default.yaml](https://github.com/crytic/echidna/blob/master/tests/solidity/basic/default.yaml).
راجع [التوثيق](https://secure-contracts.com/program-analysis/echidna/configuration.html)
للحصول على معلومات أكثر تفصيلاً حول خيارات التكوين المتاحة.
يدعم Echidna ثلاثة برامج تشغيل مختلفة للإخراج. هناك برنامج التشغيل الافتراضي `text`،
وبرنامج التشغيل `json`، وبرنامج التشغيل `none`، الذي ينبغي أن يمنع كل
إخراج `stdout`. يُبلّغ برنامج تشغيل JSON عن الحملة الإجمالية على النحو التالي.```
Campaign = {
"success" : bool,
"error" : string?,
"tests" : [Test],
"seed" : number,
"coverage" : Coverage
}
Test = {
"contract" : string,
"name" : string,
"status" : string,
"error" : string?,
"testType" : string,
"transactions" : [Transaction]?
}
Transaction = {
"contract" : string,
"function" : string,
"arguments" : [string]?,
"gas" : number,
"gasprice" : number
}
```
`Coverage` هو dict يصف بعض الاستدعاءات التي تزيد التغطية. هذه الواجهات
قابلة للتغيير لتكون أكثر ملاءمة للمستخدم قليلاً في تاريخ لاحق. ستكون `testType`
واحدة من `property`، `assertion`، `optimization`، `exploration`، أو `call`،
و `status` تأخذ دائمًا إما `fuzzing`، `shrinking`، `solved`، `passed`، أو `error`.
### تصحيح مشاكل الأداء
إحدى طرق تشخيص مشاكل أداء Echidna هي تشغيل `echidna` مع تمكين التنميط (profiling).
لتشغيل Echidna مع التنميط الأساسي، أضف `+RTS -p -s` إلى أمر `echidna` الأصلي الخاص بك:```sh
$ nix develop # alternatively nix-shell
$ cabal --enable-profiling run echidna -- ... +RTS -p -s
$ less echidna.prof
```
هذا يُنتج ملف تقرير (`echidna.prof`)، يُظهر الدوال التي تستهلك أكبر قدر من استخدام وحدة المعالجة المركزية والذاكرة.
إذا لم تساعدك عملية التنميط الأساسية، يمكنك استخدام [تقنيات تنميط أكثر تقدمًا](https://haskell.foundation/hs-opt-handbook.github.io/src/Measurement_Observation/Haskell_Profiling/eventlog.html).
الأسباب الشائعة لمشكلات الأداء التي لاحظناها:
- دوال مكلفة تُستدعى في المسارات الساخنة
- بواني البيانات الكسولة التي تتراكم فيها الـ thunks
- هياكل بيانات غير فعالة تُستخدم في المسارات الساخنة
التحقق من هذه الأمور نقطة بداية جيدة. إذا كنت تشك في أن بعض العمليات الحسابية كسولة أكثر من اللازم وتُسرّب الذاكرة، يمكنك استخدام `force` من `Control.DeepSeq` للتأكد من تقييمها.
## القيود والمشكلات المعروفة
محاكاة EVM واختبارها أمر صعب. لدى Echidna بعض القيود في أحدث إصدار. بعضها موروث من [hevm](https://github.com/argotorg/hevm) بينما بعضها الآخر نتائج قرارات تصميمية/أدائية أو مجرد أخطاء في شيفرتنا. ندرجها هنا مع المشكلة المقابلة لها والحالة ("لن تُصلح"، "معلّقة"، "قيد المراجعة"، "مُصلحة"). المشكلات "المُصلحة" يُتوقع تضمينها في إصدار Echidna التالي.
| الوصف | المشكلة | الحالة |
| :--- | :---: | :---: |
| دعم Vyper محدود | [#652](https://github.com/crytic/echidna/issues/652) | *لن تُصلح* |
| دعم محدود للمكتبات لأغراض الاختبار | [#651](https://github.com/crytic/echidna/issues/651) | *لن تُصلح* |
## التثبيت
### ملفات ثنائية مُجمّعة مسبقًا
قبل البدء، تأكد من [تثبيت](https://github.com/crytic/slither) Slither (`pip3 install slither-analyzer --user`).
إذا كنت تريد اختبار Echidna بسرعة على Linux أو MacOS، فإننا نوفر ملفات ثنائية Linux مرتبطة بشكل ثابت مبنية على Ubuntu وملفات ثنائية MacOS شبه ثابتة على [صفحة الإصدارات](https://github.com/crytic/echidna/releases). يمكنك أيضًا الحصول على نفس النوع من الملفات الثنائية من [خط أنابيب CI](https://github.com/crytic/echidna/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush)، ما عليك سوى النقر على الـ commit للعثور على الملفات الثنائية الخاصة بـ Linux أو MacOS.
### Homebrew (macOS / Linux)
إذا كان Homebrew مثبتًا على جهاز Mac أو Linux لديك، يمكنك تثبيت Echidna وجميع تبعياته (Slither، crytic-compile) عن طريق تشغيل `brew install echidna`.
يمكنك أيضًا تجميع وتثبيت أحدث شيفرة من فرع `master` عن طريق تشغيل `brew install --HEAD echidna`
يمكنك الحصول على مزيد من المعلومات في صفحة [`echidna` Homebrew Formula](https://formulae.brew.sh/formula/echidna). الصيغة نفسها تُصان كجزء من [homebrew-core repository](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/e/echidna.rb)
### حاوية Docker
إذا كنت تفضل استخدام حاوية Docker مُجمّعة مسبقًا، فاطّلع على [حزمة docker](https://github.com/orgs/crytic/packages?repo_name=echidna) الخاصة بنا، والتي تُبنى تلقائيًا عبر GitHub Actions. تعتمد حاوية `echidna` على `ubuntu:noble` وهي مُصمّمة لتكون صورة صغيرة لكن مرنة بما يكفي لاستخدام Echidna. توفر نسخة مُجمّعة مسبقًا من `echidna`، بالإضافة إلى `slither` و`crytic-compile` و`solc-select` و`nvm` و`foundry` (بما في ذلك `forge` و`cast` و`anvil` و`chisel`) في أقل من 200 ميجابايت.
لاحظ أن صور الحاويات تُبنى حاليًا على أنظمة x86 فقط. لا يُنصح بتشغيلها على أجهزة ARM، مثل أنظمة Mac M1، بسبب فقدان الأداء الناتج عن محاكاة وحدة المعالجة المركزية.
تتوفر وسوم مختلفة لصورة حاوية Docker:
| الوسم | البناء في الوسم
|---------------|-------------
| `vx.y.z` | بناء مطابق للإصدار `vx.y.z`
| `latest` | أحدث إصدار Echidna موسوم.
| `edge` | أحدث commit على الفرع الافتراضي.
| `testing-foo` | بناء اختباري بناءً على فرع `foo`.
لتشغيل الحاوية بأحدث إصدار من Echidna بشكل تفاعلي، يمكنك استخدام أمر مثل ما يلي. سيقوم بربط الدليل الحالي كـ `/src` داخل الحاوية، ويمنحك shell حيث يمكنك استخدام `echidna`:```sh
$ docker run --rm -it -v "$(pwd)":/src ghcr.io/crytic/echidna/echidna
```
وإلا، إذا كنت ترغب في بناء أحدث إصدار من Echidna محليًا، فإننا
نوصي باستخدام Docker. من داخل نسخة مستنسخة من هذا المستودع، شغّل
الأمر التالي لبناء صورة حاوية Docker:```sh
$ docker build -t echidna -f docker/Dockerfile --target final-ubuntu .
```
بعد ذلك، يمكنك تشغيل صورة `echidna` محليًا. على سبيل المثال، لتثبيت solc
0.5.7 والتحقق من `tests/solidity/basic/flags.sol`، يمكنك تشغيل:```sh
$ docker run -it -v "$(pwd)":/src echidna bash -c "solc-select install 0.5.7 && solc-select use 0.5.7 && echidna /src/tests/solidity/basic/flags.sol"
```
تتضمن صورة Docker أيضًا أدوات Foundry لتطوير واختبار العقود الذكية بشكل شامل. يمكنك استخدام `forge` و`cast` و`anvil` و`chisel` مباشرةً داخل الحاوية:```sh
# Run an interactive shell with Foundry tools available
$ docker run -it -v "$(pwd)":/src echidna bash
# Inside the container, you can use Foundry commands:
$ forge --version
$ cast --version
$ anvil --version
$ chisel --version
# Example: Initialize a new Foundry project
$ forge init my-project
$ cd my-project
$ forge build
$ forge test
```
### البناء باستخدام Stack
إذا كنت تفضل البناء من المصدر، استخدم [Stack](https://docs.haskellstack.org/en/stable/). يجب أن يقوم `stack install` ببناء وتجميع `echidna` في `~/.local/bin`. ستحتاج إلى الربط مع libreadline و libsecp256k1 (المبنية مع تمكين الاسترداد)، والتي يجب تثبيتها باستخدام مدير الحزم الذي تختاره. تحتاج أيضًا إلى تثبيت أحدث إصدار من [libff](https://github.com/scipr-lab/libff). راجع [اختبارات CI](https://github.com/crytic/echidna/blob/master/.github/scripts/install-libff.sh) للحصول على الإرشادات.
بعض توزيعات Linux لا توفر مكتبات ثابتة لأشياء معينة يحتاجها Haskell، مثل Arch Linux، مما يؤدي إلى فشل `stack build` بأخطاء ربط لأننا نستخدم علامة `-static`. في هذه الحالة، استخدم `--flag echidna:-static` لإنتاج ملف ثنائي مرتبط ديناميكيًا.
إذا واجهت أخطاء في البناء متعلقة بالربط، جرب العبث بـ `--extra-include-dirs` و `--extra-lib-dirs`.
### البناء باستخدام Nix (يعمل أصليًا على أنظمة Apple M1)
يمكن لمستخدمي [Nix](https://nixos.org/download/) تثبيت أحدث إصدار من Echidna باستخدام:```sh
$ nix-env -i -f https://github.com/crytic/echidna/tarball/master
```
مع تمكين flakes، يمكنك تشغيل Echidna مباشرة من هذا المستودع:```sh
$ nix run github:crytic/echidna # master
$ nix run github:crytic/echidna/v2.1.1 # specific ref (tag/branch/commit)
```
لبناء إصدار مستقل لأنظمة macOS غير المزودة بـ Nix، فإن ما يلي سيبني Echidna في صورة ثنائية شبه ثابتة. يمكن استخدام هذا أيضًا على أنظمة Linux لإنتاج صورة ثنائية ثابتة بالكامل.```sh
$ nix build .#echidna-redistributable
```
سيقوم Nix تلقائيًا بتثبيت جميع التبعيات المطلوبة للتطوير
بما في ذلك `crytic-compile` و`solc`. طريقة سريعة لبدء تطوير Echidna:```sh
$ git clone https://github.com/crytic/echidna
$ cd echidna
$ nix develop # alternatively nix-shell
[nix-shell]$ cabal run echidna
[nix-shell]$ cabal run tests
[nix-shell]$ cabal new-repl
```
### تشغيل مجموعات الاختبار
`cabal run tests` هي مجموعة Haskell، وتغطي كل ما تفعله Echidna داخل العملية.
يُختبر خادم MCP خارج العملية بدلاً من ذلك، عبر بدء حملة حقيقية وقيادتها بالطريقة التي يفعلها عميل وكيل. تلك المجموعة بلغة Python، وتحتاج إلى `echidna` على `$PATH`:```sh
$ pip install -r tests/mcp/requirements-test.txt
$ pytest tests/mcp -v
```
وجّهه إلى حملة بدأتها بنفسك باستخدام `ECHIDNA_MCP_URL`، أو إلى منفذ مختلف باستخدام `ECHIDNA_MCP_PORT`، أو إلى ملف تنفيذي محدد باستخدام `ECHIDNA_BIN`. يوجد مثال لوكيل يدير حملة عبر الواجهة نفسها في [examples/](https://github.com/crytic/echidna/blob/master/examples/README.md).
## الاستخدام العام لـ Echidna
### أجنحة اختبار الخصائص
هذه قائمة جزئية بمشاريع العقود الذكية التي تستخدم Echidna للاختبار:
* [Curvance](https://github.com/curvance/Curvance-CantinaCompetition/tree/CodeFAQAndAdjustments/tests/fuzzing)
* [Primitive](https://github.com/primitivefinance/rmm-core/tree/main/contracts/crytic)
* [Uniswap-v3](https://github.com/search?q=org%3AUniswap+echidna&type=commits)
* [Balancer](https://github.com/balancer/balancer-core/tree/master/echidna)
* [MakerDAO vest](https://github.com/makerdao/dss-vest/pull/16)
* [Optimism DAI Bridge](https://github.com/makerdao/optimism-dai-bridge/blob/master/contracts/test/DaiEchidnaTest.sol)
* [WETH10](https://github.com/WETH10/WETH10/tree/main/contracts/fuzzing)
* [Yield](https://github.com/yieldprotocol/fyDai/pull/312)
* [Convexity Protocol](https://github.com/opynfinance/ConvexityProtocol/tree/dev/contracts/echidna)
* [Aragon Staking](https://github.com/aragon/staking/blob/82bf54a3e11ec4e50d470d66048a2dd3154f940b/packages/protocol/contracts/test/lib/EchidnaStaking.sol)
* [Centre Token](https://github.com/circlefin/stablecoin-evm/tree/release-2024-03-15T223309/echidna_tests)
* [Tokencard](https://github.com/tokencard/contracts/tree/master/tools/echidna)
* [Minimalist USD Stablecoin](https://github.com/usmfum/USM/pull/41)
### مراجعات الأمان
يوضح ما يلي مراجعات الأمان العامة التي استخدمت Echidna للكشف عن الثغرات
- [Advanced Blockchain](https://github.com/trailofbits/publications/blob/master/reviews/AdvancedBlockchain.pdf)
- [Amp](https://github.com/trailofbits/publications/blob/master/reviews/amp.pdf)
- [Ampleforth](https://github.com/trailofbits/publications/blob/master/reviews/ampleforth.pdf)
- [Atlendis](https://github.com/trailofbits/publications/blob/master/reviews/2023-03-atlendis-atlendissmartcontracts-securityreview.pdf)
- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/2021-04-balancer-balancerv2-securityreview.pdf)
- [Basis](https://github.com/trailofbits/publications/blob/master/reviews/basis.pdf)
- [Dai](https://github.com/trailofbits/publications/blob/master/reviews/mc-dai.pdf)
- [Frax](https://github.com/trailofbits/publications/blob/master/reviews/FraxQ22022.pdf)
- [Liquity](https://github.com/trailofbits/publications/blob/master/reviews/LiquityProtocolandStabilityPoolFinalReport.pdf)
- [LooksRare](https://github.com/trailofbits/publications/blob/master/reviews/LooksRare.pdf)
- [Maple](https://github.com/trailofbits/publications/blob/master/reviews/2022-03-maplefinance-securityreview.pdf)
- [Optimism](https://github.com/trailofbits/publications/blob/master/reviews/2022-11-optimism-securityreview.pdf)
- [Opyn](https://github.com/trailofbits/publications/blob/master/reviews/Opyn.pdf)
- [Origin Dollar](https://github.com/trailofbits/publications/blob/master/reviews/OriginDollar.pdf)
- [Origin](https://github.com/trailofbits/publications/blob/master/reviews/origin.pdf)
- [Paxos](https://github.com/trailofbits/publications/blob/master/reviews/paxos.pdf)
- [Primitive](https://github.com/trailofbits/publications/blob/master/reviews/Primitive.pdf)
- [RocketPool](https://github.com/trailofbits/publications/blob/master/reviews/RocketPool.pdf)
- [Seaport](https://github.com/trailofbits/publications/blob/master/reviews/SeaportProtocol.pdf)
- [Set Protocol](https://github.com/trailofbits/publications/blob/master/reviews/setprotocol.pdf)
- [Shell protocol](https://github.com/trailofbits/publications/blob/master/reviews/ShellProtocolv2.pdf)
- [Sherlock](https://github.com/trailofbits/publications/blob/master/reviews/Sherlockv2.pdf)
- [Pegasys Pantheon](https://github.com/trailofbits/publications/blob/master/reviews/pantheon.pdf)
- [TokenCard](https://github.com/trailofbits/publications/blob/master/reviews/TokenCard.pdf)
- [Uniswap](https://github.com/trailofbits/publications/blob/master/reviews/UniswapV3Core.pdf)
- [Yearn](https://github.com/trailofbits/publications/blob/master/reviews/YearnV2Vaults.pdf)
- [Yield](https://github.com/trailofbits/publications/blob/master/reviews/YieldProtocol.pdf)
- [88mph](https://github.com/trailofbits/publications/blob/master/reviews/88mph.pdf)
- [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf)
### الجوائز
تم العثور على ثغرات الأمان التالية بواسطة Echidna. إذا وجدت ثغرة أمنية باستخدام أداتنا، فيرجى تقديم PR يتضمن المعلومات ذات الصلة.
| Project | Vulnerability | Date |
|--|--|--|
[0x Protocol](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) | If an order cannot be filled, then it cannot be canceled | Oct 2019
[0x Protocol](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) | If an order can be partially filled with zero, then it can be partially filled with one token | Oct 2019
[0x Protocol](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) | The cobbdouglas function does not revert when valid input parameters are used | Oct 2019
[Balancer Core](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) | An attacker cannot steal assets from a public pool | Jan 2020
[Balancer Core](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) | An attacker cannot generate free pool tokens with joinPool | Jan 2020
[Balancer Core](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) | Calling joinPool-exitPool does not lead to free pool tokens | Jan 2020
[Balancer Core](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) | Calling exitswapExternAmountOut does not lead to free assets | Jan 2020
[Liquity Dollar](https://github.com/trailofbits/publications/blob/master/reviews/Liquity.pdf) | [Closing troves require to hold the full amount of LUSD minted](https://github.com/liquity/dev/blob/echidna_ToB_final/packages/contracts/contracts/TestContracts/E2E.sol#L242-L298) | Dec 2020
[Liquity Dollar](https://github.com/trailofbits/publications/blob/master/reviews/Liquity.pdf) | [Troves can be improperly removed](https://github.com/liquity/dev/blob/echidna_ToB_final/packages/contracts/contracts/TestContracts/E2E.sol#L242-L298) | Dec 2020
[Liquity Dollar](https://github.com/trailofbits/publications/blob/master/reviews/Liquity.pdf) | Initial redeem can revert unexpectedly | Dec 2020
[Liquity Dollar](https://github.com/trailofbits/publications/blob/master/reviews/Liquity.pdf) | Redeem without redemptions might still return success | Dec 2020
[Origin Dollar](https://github.com/trailofbits/publications/blob/master/reviews/OriginDollar.pdf) | Users are allowed to transfer more tokens that they have | Nov 2020
[Origin Dollar](https://github.com/trailofbits/publications/blob/master/reviews/OriginDollar.pdf) | User balances can be larger than total supply | Nov 2020
[Yield Protocol](https://github.com/trailofbits/publications/blob/master/reviews/YieldProtocol.pdf) | Arithmetic computation for buying and selling tokens is imprecise | Aug 2020
### الأبحاث
يمكننا أيضًا استخدام Echidna لإعادة إنتاج أمثلة بحثية من أوراق اختبار العقود الذكية بالـ fuzzing لإظهار مدى سرعة العثور على الحل. يمكن حل جميع هذه الأمثلة، في غضون ثوانٍ إلى دقيقة أو دقيقتين على حاسوب محمول.
| Source | Code
|--|--
[Using automatic analysis tools with MakerDAO contracts](https://forum.openzeppelin.com/t/using-automatic-analysis-tools-with-makerdao-contracts/1021) | [SimpleDSChief](https://github.com/crytic/echidna/blob/master/tests/solidity/research/vera_dschief.sol)
[Integer precision bug in Sigma Prime](https://github.com/muellerberndt/sabre#example-2-integer-precision-bug) | [VerifyFunWithNumbers](https://github.com/crytic/echidna/blob/master/tests/solidity/research/solcfuzz_funwithnumbers.sol)
[Learning to Fuzz from Symbolic Execution with Application to Smart Contracts](https://files.sri.inf.ethz.ch/website/papers/ccs19-ilf.pdf) | [Crowdsale](https://github.com/crytic/echidna/blob/master/tests/solidity/research/ilf_crowdsale.sol)
[Harvey: A Greybox Fuzzer for Smart Contracts](https://arxiv.org/abs/1905.06944) | [Foo](https://github.com/crytic/echidna/blob/master/tests/solidity/research/harvey_foo.sol), [Baz](https://github.com/crytic/echidna/blob/master/tests/solidity/research/harvey_baz.sol)
### المنشورات الأكاديمية
| Paper Title | Venue | Publication Date |
| --- | --- | --- |
| [echidna-parade: Diverse multicore smart contract fuzzing](https://agroce.github.io/issta21.pdf) | [ISSTA 2021](https://conf.researchr.org/home/issta-2021) | July 2021 |
| [Echidna: Effective, usable, and fast fuzzing for smart contracts](https://agroce.github.io/issta20.pdf) | [ISSTA 2020](https://conf.researchr.org/home/issta-2020) | July 2020 |
| [Echidna: A Practical Smart Contract Fuzzer](https://github.com/trailofbits/publications/blob/master/papers/echidna_fc_poster.pdf) | [FC 2020](https://fc20.ifca.ai/program.html) | Feb 2020 |
إذا كنت تستخدم Echidna في عمل أكاديمي، ففكر في التقديم على [جائزة Crytic البحثية بقيمة 10 آلاف دولار](https://blog.trailofbits.com/2019/11/13/announcing-the-crytic-10k-research-prize/).
## الحصول على المساعدة
لا تتردد في المرور بقناة #ethereum على slack في [Empire Hacking](https://slack.empirehacking.nyc/) للحصول على مساعدة في استخدام Echidna أو توسيعه.
* ابدأ بمراجعة هذه [ثوابت Echidna](https://github.com/crytic/echidna/blob/master/tests/solidity/basic/flags.sol) البسيطة
* فكر في [مراسلة](mailto:[email protected]) فريق تطوير Echidna مباشرةً لطرح أسئلة أكثر تفصيلاً
## الترخيص
Echidna مرخّص وموزّع بموجب [ترخيص AGPLv3](https://github.com/crytic/echidna/blob/master/LICENSE).