Фаззер смарт-контрактов на основе property-based testing от Trail of Bits. Генерирует случайные транзакции для нарушения инвариантов (property functions). Использует corpus-based и coverage-guided fuzzing. Находит баги недостижимые статическим анализом: reentrancy chains, state explosions.
# Docker (рекомендуется) docker run -it -v $PWD:/src trailofbits/echidna echidna-test contract.sol --contract Test --config config.yaml
Драйвер JSON описывает всю кампанию следующим образом.
Один из способов диагностики проблем производительности Echidna — запуск echidna с включённым профилированием.
Для запуска Echidna с базовым профилированием добавьте +RTS -p -s к вашей исходной команде echidna:
$ nix develop # alternatively nix-shell
$ cabal --enable-profiling run echidna -- ... +RTS -p -s
$ less echidna.prof
Это создаст файл отчёта (echidna.prof), который покажет, какие функции потребляют больше всего ресурсов CPU и памяти.
Если базовое профилирование не помогает, вы можете использовать более продвинутые методы профилирования.
Типичные причины проблем производительности, которые мы наблюдали:
Проверка этих причин — хорошее начало. Если вы подозреваете, что какое-то вычисление слишком ленивое и
утекает памятью, вы можете использовать force из Control.DeepSeq, чтобы гарантировать его вычисление.
Эмуляция и тестирование EVM — сложная задача. Echidna имеет некоторые ограничения в последнем выпуске. Некоторые из них унаследованы от hevm, тогда как другие являются результатом решений по дизайну/производительности или просто ошибок в нашем коде. Мы перечисляем их здесь вместе с соответствующей проблемой и статусом ("не будет исправлено", "на паузе", "на рассмотрении", "исправлено"). Проблемы со статусом "исправлено" ожидается включить в следующий выпуск Echidna.
| Описание | Проблема | Статус |
|---|---|---|
| Поддержка Vyper ограничена | #652 | не будет исправлено |
| Ограниченная поддержка библиотек для тестирования | #651 | не будет исправлено |
Прежде всего, убедитесь, что Slither установлен (pip3 install slither-analyzer --user).
Если вы хотите быстро протестировать Echidna в Linux или MacOS, мы предоставляем статически связанные бинарные файлы Linux, собранные в Ubuntu, и в основном статические бинарные файлы MacOS на странице наших релизов. Вы также можете получить те же типы бинарных файлов из нашего конвейера CI, просто нажмите на коммит, чтобы найти бинарные файлы для Linux или MacOS.
Если у вас установлен Homebrew на вашем Mac или Linux-машине, вы можете установить Echidna и все его зависимости (Slither, crytic-compile), выполнив команду brew install echidna.
Вы также можете скомпилировать и установить код последней ветки master, выполнив brew install --HEAD echidna.
Вы можете получить дополнительную информацию на странице Homebrew-формулы echidna. Сама формула поддерживается как часть репозитория homebrew-core.
Если вы предпочитаете использовать готовый Docker-контейнер, ознакомьтесь с нашим docker-пакетом, который автоматически собирается через GitHub Actions. Контейнер echidna основан на ubuntu:noble и представляет собой небольшой, но достаточно гибкий образ для использования Echidna. Он предоставляет предварительно собранный echidna, а также slither, crytic-compile, solc-select, nvm и foundry (включая forge, cast, anvil и chisel) размером менее 200 МБ.
Обратите внимание, что образы контейнеров в настоящее время собираются только для систем x86. Их запуск на устройствах ARM, таких как системы Mac M1, не рекомендуется из-за потери производительности, связанной с эмуляцией CPU.
Для образа Docker-контейнера доступны различные теги:
| Тег | Сборка в теге |
|---|---|
vx.y.z |
Сборка, соответствующая релизу vx.y.z |
latest |
Последний подписанный релиз Echidna. |
edge |
Самый последний коммит в ветке по умолчанию. |
testing-foo |
Тестовая сборка, основанная на ветке foo. |
Чтобы запустить контейнер с последней версией Echidna интерактивно, вы можете использовать команду, подобную следующей. Она смонтирует текущую директорию как /src внутри контейнера и предоставит вам оболочку, где вы сможете использовать echidna:
$ docker run --rm -it -v "$(pwd)":/src ghcr.io/crytic/echidna/echidna
В противном случае, если вы хотите локально собрать последнюю версию Echidna, мы рекомендуем использовать Docker. Из директории клона этого репозитория выполните следующую команду для сборки образа Docker-контейнера:
$ docker build -t echidna -f docker/Dockerfile --target final-ubuntu .
Затем вы можете запустить образ echidna локально. Например, чтобы установить solc 0.5.7 и проверить tests/solidity/basic/flags.sol, вы можете выполнить:
$ 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 непосредственно в контейнере:
# 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 install должна собрать и скомпилировать echidna в ~/.local/bin. Вам нужно будет связать с библиотеками libreadline и libsecp256k1 (собранной с включенным восстановлением), которые должны быть установлены через менеджер пакетов по вашему выбору. Вам также необходимо установить последний релиз libff. Обратитесь к нашим тестам CI для получения руководства.
Некоторые дистрибутивы Linux не поставляют статические библиотеки для определенных компонентов, необходимых Haskell, например Arch Linux, что приведет к ошибкам связывания при выполнении stack build, поскольку мы используем флаг -static. В этом случае используйте --flag echidna:-static для создания динамически связанного бинарного файла.
Если вы получаете ошибки сборки, связанные с ошибками связывания, попробуйте поэкспериментировать с --extra-include-dirs и --extra-lib-dirs.
Пользователи Nix могут установить последнюю Echidna с помощью:
$ nix-env -i -f https://github.com/crytic/echidna/tarball/master
С включенными flake вы можете запустить Echidna непосредственно из этого репозитория:
$ nix run github:crytic/echidna # master
$ nix run github:crytic/echidna/v2.1.1 # specific ref (tag/branch/commit)
Для сборки автономного релиза для не-Nix систем macOS следующая команда соберет Echidna в преимущественно статический бинарный файл. Это также можно использовать в системах Linux для создания полностью статического бинарного файла.
$ nix build .#echidna-redistributable
Nix автоматически установит все зависимости, необходимые для разработки, включая crytic-compile и solc. Быстрый способ начать разработку Echidna:
$ 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
Это неполный список проектов смарт-контрактов, которые используют Echidna для тестирования:
Ниже приведены публичные обзоры безопасности, в которых использовалась Echidna для обнаружения уязвимостей:
Ниже приведены уязвимости безопасности, обнаруенные с помощью Echidna. Если вы обнаружили уязвимость безопасности с помощью нашего инструмента, пожалуйста, отправьте PR с соответствующей информацией.
| Проект | Уязвимость | Дата |
|---|---|---|
| 0x Protocol | Если ордер не может быть исполнен, то он не может быть отменен | Окт 2019 |
| 0x Protocol | Если ордер может быть частично исполнен с нулем, то он может быть частично исполнен с одним токеном | Окт 2019 |
| 0x Protocol | Функция cobbdouglas не вызывает откат при использовании допустимых входных параметров | Окт 2019 |
| Balancer Core | Злоумышленник не может украсть активы из публичного пула | Янв 2020 |
| Balancer Core | Злоумышленник не может сгенерировать бесплатные токены пула с помощью joinPool | Янв 2020 |
| Balancer Core | Вызовы joinPool-exitPool не приводят к появлению бесплатных токенов пула | Янв 2020 |
| Balancer Core | Вызов exitswapExternAmountOut не приводит к появлению бесплатных активов | Янв 2020 |
| Liquity Dollar | Для закрытия трев требуются все выпущенные LUSD | Дек 2020 |
| Liquity Dollar | Тревы могут быть неправильно удалены | Дек 2020 |
| Liquity Dollar | Начальное погашение может неожиданно откатиться | Дек 2020 |
| Liquity Dollar | Погашение без операций погашения может все еще вернуть успех | Дек 2020 |
| Origin Dollar | Пользователям разрешено передавать больше токенов, чем у них есть | Ноя 2020 |
| Origin Dollar | Балансы пользователей могут превышать общую эмиссию | Ноя 2020 |
| Yield Protocol | Арифметические вычисления для покупки и продажи токенов неточны | Авг 2020 |
Мы также можем использовать Echidna для воспроизведения примеров исследований из научных статей по фаззингу смарт-contractов, чтобы показать, как быстро она может найти решение. Все эти примеры могут быть решены за несколько секунд или одну-две минуты на компьютере.
| Название статьи | Место проведения | Дата публикации |
|---|---|---|
| echidna-parade: Разнообразный многопроцессорный фаззинг смарт-контрактов | ISSTA 2021 | Июль 2021 |
| Echidna: Эффективный, удобный и быстрый фаззинг для смарт-контрактов | ISSTA 2020 | Июль 2020 |
| Echidna: Практический фаззер для смарт-контрактов | FC 2020 | Фев 2020 |
Если вы используете Echidna для академических работ, рассмотрите возможность подачи заявки на Исследовательскую премию Crytic в размере $10 000.
Заходите в наш канал #ethereum в Slack Empire Hacking для получения помощи по использованию или расширению Echidna.
Начните с изучения простых инвариантов Echidna
По более детальным вопросам можно написать напрямую команде разработчиков Echidna
Echidna лицензирована и распространяется по лицензии AGPLv3.