Echidna

Blockchain / Web3 v2.3.2 · 27.03.2026 активный

Фаззер смарт-контрактов на основе property-based testing от Trail of Bits. Генерирует случайные транзакции для нарушения инвариантов (property functions). Использует corpus-based и coverage-guided fuzzing. Находит баги недостижимые статическим анализом: reentrancy chains, state explosions.

v2.3.2
27.03.2026 current
Добавлен 13.07.2026 · Обновлён 15.07.2026 · Blockchain / Web3
Установка
# 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 и памяти.

Если базовое профилирование не помогает, вы можете использовать более продвинутые методы профилирования.

Типичные причины проблем производительности, которые мы наблюдали:

  • Дорогостоящие функции, вызываемые в горячих путях
  • Ленивые конструкторы данных, которые накапливают «тюнки» (thunks)
  • Неэффективные структуры данных, используемые в горячих путях

Проверка этих причин — хорошее начало. Если вы подозреваете, что какое-то вычисление слишком ленивое и утекает памятью, вы можете использовать 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 (macOS / Linux)

Если у вас установлен Homebrew на вашем Mac или Linux-машине, вы можете установить Echidna и все его зависимости (Slither, crytic-compile), выполнив команду brew install echidna.

Вы также можете скомпилировать и установить код последней ветки master, выполнив brew install --HEAD echidna.

Вы можете получить дополнительную информацию на странице Homebrew-формулы echidna. Сама формула поддерживается как часть репозитория homebrew-core.

Docker-контейнер

Если вы предпочитаете использовать готовый 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. Команда 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 (работает нативно на системах Apple M1)

Пользователи 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 для обнаружения уязвимостей:

Кубки

Ниже приведены уязвимости безопасности, обнаруенные с помощью 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ов, чтобы показать, как быстро она может найти решение. Все эти примеры могут быть решены за несколько секунд или одну-две минуты на компьютере.

Источник Код
Использование инструментов автоматического анализа с контрактами MakerDAO SimpleDSChief
Целочисленная погрешность в Sigma Prime VerifyFunWithNumbers
Обучение фаззингу на символьном выполнении с применением к смарт-контрактам Crowdsale
Harvey: Серый ящик для фаззинга смарт-контрактов Foo, Baz

Научные публикации

Название статьи Место проведения Дата публикации
echidna-parade: Разнообразный многопроцессорный фаззинг смарт-контрактов ISSTA 2021 Июль 2021
Echidna: Эффективный, удобный и быстрый фаззинг для смарт-контрактов ISSTA 2020 Июль 2020
Echidna: Практический фаззер для смарт-контрактов FC 2020 Фев 2020

Если вы используете Echidna для академических работ, рассмотрите возможность подачи заявки на Исследовательскую премию Crytic в размере $10 000.

Получение помощи

Заходите в наш канал #ethereum в Slack Empire Hacking для получения помощи по использованию или расширению Echidna.

Лицензия

Echidna лицензирована и распространяется по лицензии AGPLv3.

Комментарии
Войдите, чтобы оставить комментарий