Обзор современных средств тестирования смарт-контрактов
Введение
В условиях стремительного развития технологий блокчейн и смарт-контрактов критически важной становится проблема их безопасности. Статистика показывает, что из-за уязвимостей в смарт-контрактах ежегодно теряются сотни миллионов долларов.
Тестирование смарт-контрактов стало неотъемлемой частью их разработки и аудита, особенно для блокчейн-проектов с высокими требованиями к безопасности. Существует множество инструментов анализа смарт-контрактов. Каждый из этих инструментов имеет уникальные функции, которые помогают обеспечить качество и безопасность.
Ранее мы проводили сравнительный анализ инструментов Mythril, Securify и Slither, демонстрируя их возможности в поиске таких уязвимостей, как атаки повторного входа и арифметические ошибки. Также мы описывали ключевые сценарии атак и давали рекомендации по избежанию уязвимостей и ограничению доступа к критическим функциям.
Прошло несколько лет, и ситуация изменилась. Сейчас мы видим следующие основные вызовы, связанные с безопасностью смарт-контрактов:
- Сложность выбора инструментов тестирования из-за их большого количества и различной специфики.
- Отсутствие систематизированной информации о возможностях и ограничениях каждого инструмента.
- Потребность в практических рекомендациях по настройке и использованию инструментов.
- Необходимость понимания, какие типы уязвимостей обнаруживает каждый инструмент.
Поэтому сегодня мы видим для себя следующие задачи:
- Систематизировать информацию о самых актуальных современных инструментах тестирования смарт-контрактов.
- Предоставить первоочередные практические рекомендации по их использованию.
- Помочь разработчикам выбрать оптимальный набор инструментов и методов для своих проектов.
- Продемонстрировать эффективность различных инструментов на реальных примерах.
В этой статье мы описали лучшие средства анализа смарт-контрактов, а также поделились опытом нашей команды аудиторов, которая помогает проектам достигать высокого уровня безопасности. Это позволит разработчикам и специалистам по информационной безопасности выбрать лучшие инструменты для повышения безопасности своих проектов и обеспечить эффективный аудит смарт-контрактов.
Как мы выбирали инструменты анализа смарт-контрактов

Из большого количества средств аудита смарт-контрактов мы выбрали ограниченный перечень современных инструментов на основе их популярности, гибкости, эффективности и возможностей интеграции.
Популярность в сообществе
Выбранные инструменты имеют широкую поддержку в среде блокчейн-разработчиков и активно обновляются. Популярность инструментов среди разработчиков и специалистов по безопасности смарт-контрактов, а также активная поддержка со стороны сообщества и разработчиков этих инструментов обеспечивают регулярные обновления и быстрое исправление ошибок. Это делает инструменты более надежными, чем ранее. Кроме того, поддержка примеров, документации и плагинов делает эти инструменты более удобными в использовании.
- Hardhat и Truffle – ведущие фреймворки для разработки на Ethereum, которые предоставляют удобные средства для компиляции, тестирования и развертывания контрактов. Популярность этих фреймворков гарантирует богатую экосистему плагинов и поддержки.
- Slither и Mythril известны своими мощными возможностями для, соответственно, статического и динамического анализа смарт-контрактов. Такие возможности делают эти инструменты незаменимыми для аудита безопасности.
Гибкость
Инструменты из этого списка подходят для широкого спектра блокчейн-платформ, обеспечивая разработчикам необходимую гибкость.
- Aderyn позволяет создавать кастомные анализаторы, что делает его особенно полезным для проектов с высокими требованиями к безопасности.
- Foundry поддерживает мультиблокчейн-проекты, обеспечивая быструю интеграцию с различными сетями.
- Ganache создает частную блокчейн-сеть для тестирования смарт-контрактов, позволяя симулировать транзакции без затрат на газ.
- Tenderly позволяет проводить реалистичную симуляцию транзакций и отладку в реальном времени. Это делает его идеальным для проектов в области DeFi.
Эффективность нахождения уязвимостей
Данные инструменты предоставляют разнообразные подходы для проверки безопасности и подходят для чрезвычайно сложных задач. Каждый инструмент является уникальным, внося свой вклад в качество, точность и надежность тестирования. Они помогают разработчикам и аудиторам найти логические ошибки, оптимизировать код и выявить потенциальные уязвимости.
- Diligence Fuzzing от ConsenSys позволяет находить скрытые уязвимости с помощью автоматизированного генерирования входных данных и фаззинга. Инструмент интегрируется со Scribble, инструментом тестирования смарт-контрактов, путем проверки во время выполнения. Это позволяет разработчикам определять спецификации смарт-контрактов для более точного тестирования и выявления потенциальных проблем в логике контракта.
- Echidna – это фреймворк для фаззинг-тестирования смарт-контрактов на Solidity, который генерирует различные входные данные для выявления аномалий в поведении контрактов, обеспечивая высокий уровень покрытия тестирования и выявления скрытых уязвимостей.
- Manticore – это инструмент анализа бинарных файлов, который позволяет запускать символическое выполнение и исследовать различные варианты работы алгоритмов, выявляя потенциальные уязвимости и ошибки в смарт-контрактах.
- Medusa – мощный инструмент для фаззинг-тестирования, способный выполнять параллельные тесты, что значительно ускоряет процесс обнаружения ошибок. Благодаря своей способности работать с большими кодовыми базами, Medusa особенно эффективна в больших командах или для масштабных проектов.
- Mythril – это инструмент для анализа безопасности байт-кода EVM. Mythril использует символьное исполнение, SMT-решение и taint-анализ для выявления различных уязвимостей в смарт-контрактах, разработанных для Ethereum и других блокчейнов, совместимых с EVM.
- Slither – это статический анализатор кода смарт-контрактов, который не только автоматически находит уязвимости, но и выявляет возможности для оптимизации кода и визуализирует алгоритм выполнения. Это помогает аудиторам лучше понимать структуру смарт-контракта.
Интеграция
Современные блокчейн-проекты активно используют автоматизацию для обеспечения безопасности и качества кода.
- Solhint – линтер для кода Solidity, который обеспечивает автоматическую проверку на соответствие стандартам стиля и безопасности. Он идеально подходит для процессов CI/CD.
- Tenderly обеспечивает непрерывный мониторинг контрактов, интегрируясь с популярными инструментами разработки, такими как Hardhat и Foundry.
Описание инструментов анализа смарт-контрактов

Приведем немного более детальное описание самых актуальных средств тестирования смарт-контрактов в алфавитном порядке.
Aderyn
Aderyn — это статический анализатор смарт-контрактов Solidity, созданный на базе Rust. Основная цель этого инструмента — помочь разработчикам и исследователям безопасности идентифицировать уязвимости в кодовой базе. Благодаря высокой скорости работы и возможности создания кастомных детекторов, Aderyn легко интегрируется в процессы разработки.
Ключевые функции:
- Анализ уязвимостей смарт-контрактов Solidity.
- Поддержка создания кастомных детекторов для специфических задач.
- Быстрый интерфейс командной строки (CLI) для удобного взаимодействия.
- Вывод результатов в форматах Markdown и JSON.
Diligence Fuzzing
Этот инструмент от ConsenSys использует фаззинг для выявления уязвимостей в смарт-контрактах. Diligence Fuzzing генерирует случайные входные данные для проверки устойчивости контрактов к непредсказуемым сценариям.
Ключевые функции:
- Поддержка тестирования на основе Foundry и Scribble.
- Использование фаззера Harvey для анализа байт-кода EVM.
- Отчетность для быстрой идентификации потенциальных проблем.
Echidna
Echidna обеспечивает тестирование смарт-контрактов на основе фаззинга. Инструмент проверяет сохранение инвариантов даже при экстремальных входных данных.
Ключевые функции:
- Генерация входных данных, адаптированных к конкретному коду.
- Отчеты об использовании газа и покрытии тестами.
- Интерактивный интерфейс для настройки кампаний фаззинга.
Foundry
Foundry — это многофункциональный фреймворк для разработки и тестирования смарт-контрактов. Его преимущества включают поддержку мультиблокчейн-проектов и высокопроизводительное юнит-тестирование.
Ключевые функции:
- Поддержка тестов Solidity с автоматическим обнаружением функций тестов.
- Тестирование на основе свойств для проверки общего поведения.
- Поддержка интеграции с другими инструментами.
Ganache
Ganache создает локальную частную блокчейн-сеть для тестирования смарт-контрактов.
Ключевые функции:
- Имитация транзакций с точностью до блока.
- Форкинг основной сети Ethereum для реалистичных тестов.
- Быстрое создание снимков состояния и их восстановление.
Кейс-стади: В проекте Geisted команда H-X Technologies использовала Ganache для симуляции реальных транзакций. Была обнаружена уязвимость, связанная с Unchecked CALL Return Values, которая возникала из-за использования ассемблера для проверки контрактов. Это увеличивало вероятность ошибок, которые могли остаться незамеченными. Рекомендации включали избегание ассемблера и внедрение более безопасных конструкций Solidity. Подробные результаты тестирования изложены в Report on Security Assessment of ERC20, GMarketplace, and NFTCollection + GNFT.
Hardhat
Hardhat – это удобный фреймворк для разработчиков с поддержкой функций отладки и автоматизации тестирования.
Ключевые функции:
- Тестирование с использованием Mocha и Chai.
- Дополнительные функции для отладки контрактов.
- Интеграция с современными инструментами развертывания.
Manticore
Manticore обеспечивает символическое исполнение для анализа всех возможных путей выполнения смарт-контракта.
Ключевые функции:
- Автоматическое создание входных данных для тестирования.
- Гибкий Python API для расширенного контроля.
Medusa
Medusa предлагает фаззинг с распараллеленным исполнением для более быстрого обнаружения уязвимостей.
Ключевые функции:
- Поддержка многопоточного фаззинга.
- Покрытие данных для расширенного анализа.
Mythril
Mythril использует символьное исполнение для обнаружения широкого спектра уязвимостей, таких как повторный вход и переполнение чисел.
Ключевые функции:
- Анализ байт-кода для EVM-совместимых блокчейнов.
- Отчеты о ключевых уязвимостях с высокой точностью.
Slither
Slither выполняет статический анализ кода Solidity для выявления уязвимостей с относительно низким уровнем ложных срабатываний.
Ключевые функции:
- Автоматизация проверок с помощью CI/CD.
- Генерация отчетов об улучшении эффективности.
Кейс-стади: В процессе тестирования одного из проектов мы обнаружили возможность оптимизации использования газа. Инструмент подсказал, что переменные CALLBACK_SUCCESS и PERMIT_TYPEHASH можно объявить как constant. Это уменьшило бы затраты на газ за счет вычисления значений на этапе компиляции. Рекомендации по этой оптимизации были внедрены. Это улучшило эффективность контракта без влияния на его функциональность. Подробные результаты анализа изложены в Report on Security Assessment of Milkomeda Smart Contracts for OccamX.
Solhint
Solhint помогает поддерживать стиль кода и базовую безопасность с помощью интеграции с существующими рабочими процессами. Это инструмент для линтинга кода Solidity со следующими особенностями:
- Настройка правил проверки в соответствии с требованиями проекта, а также поддержка общих конфигураций.
- Расширение функционала с помощью плагинов. Это позволяет добавлять новые правила и интеграции.
- Интеграция с популярными средами разработки, такими как Sublime Text, Atom, Vim, JetBrains IDEA и Visual Studio Code.
- Эффективный парсинг и валидация.
Tenderly
Tenderly позволяет симулировать транзакции в реальном времени для выявления потенциальных ошибок.
Ключевые функции:
- Интеграция с Foundry и Hardhat.
- Расширенные возможности отладки.
Truffle
Truffle предлагает среду для полного цикла разработки, тестирования и развертывания смарт-контрактов.
Ключевые функции:
- Встроенные средства компиляции и миграции.
- Интерактивная консоль для работы с контрактами.
Кейс-стади: Команда H-X использовала Truffle для тестирования смарт-контрактов проекта Geisted. Мы обнаружили уязвимость типа Reentrancy (повторный вход) в функциях, связанных с обработкой транзакций и токенов. Эта уязвимость позволяла злоумышленникам выполнять повторные вызовы функций, изменяя баланс до завершения транзакции. Решение включало внедрение шаблона “проверка-эффект-взаимодействие” (Check-Effect-Interaction). Это обеспечило безопасное выполнение контрактов. Подробные результаты анализа изложены в Report on Security Assessment of ERC20, GMarketplace, and NFTCollection + GNFT.
Практическая часть — тестирование смарт-контрактов

Мы протестировали 13 популярных решений, используя репозиторий с преднамеренно уязвимыми смарт-контрактами VulnerableContracts. Этот репозиторий содержит примеры контрактов с типичными уязвимостями, часто встречающимися в реальных проектах. Нашей целью была проверка, как инструменты идентифицируют типичные уязвимости, такие как Reentrancy, ненадёжная генерация случайных чисел, переполнение чисел и некорректная арифметика, а также уязвимость самоуничтожения.
Это тестирование позволило выявить указанные проблемы, а также сформулировать рекомендации по применению инструментов в реальных блокчейн-проектах.
Ниже приведены результаты нашего тестирования каждого средства в алфавитном порядке.
Aderyn
Запускаем детальный анализ контракта:
aderyn path/VulnerableContracts/
Анализ контрактов с помощью Aderyn выявил 13 уязвимостей разной степени риска.
Структура результата сканирования
- Общая информация.
1.2. Инструмент.
1.3. Количество проанализированных файлов.
1.4. Общее количество строк кода (nSLOC).
1.5. Общее количество выявленных проблем.
- Детали анализа.
2.1. Файлы, которые анализировались.
2.2. Количество уязвимостей по категориям.
- Проблемы высокой критичности.
- Проблемы низкой критичности.
Diligence Fuzzing
Похож по функциональности на Echidna и Medusa, но отличается интеграцией с платформой ConsenSys и широкими возможностями анализа.
Как начать работу с Diligence Fuzzing?
Для начала необходимо установить Diligence Fuzzing с помощью Python3:
pip3 install diligence-fuzzing
Инструмент поддерживает различные среды разработки. В нашем примере используется Truffle. Вы можете выбрать на свое усмотрение.
Перед тестированием необходимо зарегистрироваться на официальном сайте и получить ключ API. Далее экспортируйте его в вашу систему:
export FUZZ_API_KEY=KEY.
Для активации “умного режима” (SMART_MODE), который автоматически анализирует проект, используйте:
export FUZZ_SMART_MODE=1
SMART_MODE обеспечивает автоматическую идентификацию контрактов и упрощает конфигурацию.
Перед тестированием необходимо скомпилировать и мигрировать ваши контракты в локальную сеть:
truffle migrate –network development
После выполнения подготовительных шагов запустите fuzz-тестирование с помощью команды:
fuzz run
Результаты тестирования
Результаты тестирования отображаются в веб-интерфейсе платформы Diligence Fuzzing. Как видно из примера, тестирование показало следующие данные:
- Тестов за секунду: 2593 – высокая производительность позволяет быстро находить возможные проблемы.
- Общее покрытие кода: 75% – косвенно указывает на качество проверки.
- Время выполнения: 2 минуты — даже за короткий промежуток времени был достигнут значительный прогресс.
- Остаточный риск: 0.0042% – минимальный остаточный риск, который оценивает эффективность инструмента.
График покрытия демонстрирует постепенный рост процента покрытия кода за время выполнения тестов. Это свидетельствует об относительной стабильности и надежности анализа.
Echidna
Функциональность этого инструмента похожа на Medusa, но Echidna предлагает более широкий спектр настроек для создания кастомных тестов.
Как начать работу с Echidna?
Для начала необходимо установить Echidna с помощью brew:
brew install echidna
Echidna ожидает, что в вашем смарт-контракте будут определены специальные функции, которые начинаются с префикса echidna_. Эти функции выступают как тест-кейсы для проверки различных аспектов контракта.
Используйте команду для запуска тестирования, указав имя смарт-контракта и название класса контракта:
echidna smartcontract.sol --contract smartcontract smartcontract
После запуска Echidna предоставляет детализированный вывод, отображающий результаты тестирования. Вы можете увидеть список функций, которые прошли тестирование, а также те, которые потерпели неудачу. Эта информация помогает быстро выявлять и устранять потенциальные уязвимости.
Foundry
Foundry – это инструмент, ориентированный на разработчиков, которые ищут быстрые и точные средства для тестирования смарт-контрактов, написанных на языке Solidity. Его ключевым преимуществом является то, что тесты пишутся непосредственно на Solidity, без необходимости использовать промежуточные языки (как, например, в Hardhat). Это позволяет разработчикам избежать дополнительных преобразований и работать ближе к коду смарт-контракта.
Как начать работу с Foundry?
Для начала давайте выполним команду установки Foundry:
curl -L https://foundry.paradigm.xyz | bashfoundryup
Выполним команду инициализации нового проекта:
forge init name-project
В результате структура проекта будет выглядеть так:
Переместим наш смарт-контракт в папку src/. В папке test/ создадим файл с тестами для нашего контракта. Например, для BadRandomness.sol мы написали тесты для таких функций:
- Успешное добавление участников функцией participate.
- Правильный выбор случайного пользователя pickRandomUser.
- Отказ в вызове функции participate, если не передан 1 ETH.
Выполним команду компиляции контрактов:
forge build
Если компиляция успешна, мы увидим скомпилированные файлы в папке out/
Для запуска тестов выполним:
forge test
Результаты тестирования
Мы протестировали функциональность нескольких смарт-контрактов в локальной среде Foundry. Вот краткий обзор результатов:
- 11 положительных результатов тестов:
- Успешное тестирование внесения депозитов.
- Проверка предотвращения снятия средств сверх баланса.
- Правильное управление токенами функциями buy и sell.
- Удачно протестирован механизм скрытого доступа.
- Успешная проверка выбора случайного пользователя, отклонения некорректных транзакций и т.д.
- 4 отрицательных результата тестов:
- Выявлены проблемы с управлением средствами при снятии (функция withdraw).
- Некорректная верификация данных в транзакциях.
- Проблемы с завершением контракта функцией kill.
- Ошибки в логике при недостаточной оплате токенов.
Ganache + Truffle
Truffle – один из старейших инструментов для разработки смарт-контрактов на платформе Ethereum. Truffle имеет встроенную поддержку Ganache, который позволяет легко создавать локальную блокчейн-сеть для тестирования контрактов. Одной из ключевых особенностей Truffle является возможность использования файлов миграций для автоматизированного развертывания контрактов, а также интеграция с JavaScript для написания тестов.
Как начать работу с Truffle и Ganache?
Установим truffle в локальную среду:
npm install --save-dev truffle
Далее инициализируем truffle в нашем проекте:
truffle init
В результате структура проекта должна выглядеть так:
Переместим наш смарт-контракт в папку contracts/.
Отредактируем файл truffle-config.js, настраивая локальную сеть:
Запустим Ganache для локального тестирования:
ganache-cli
Создадим файл миграции в папке migrations/
Выполним миграцию для развертывания контракта:
truffle migrate --network development
Тестирование смарт-контрактов
Создадим файл test/MyContract.test.js, для примера, нашего уязвимого смарт-контракта:
Для запуска теста нужно выполнить команду:
truffle test
Результаты тестирования
Мы провели тестирование нескольких смарт-контрактов в локальной среде Truffle. Всего было выполнено 12 успешных тестов и выявлено 3 неудачных теста и теста с отрицательными результатами:
Успешные тесты:
- Проверка внесения депозитов и снятия средств в пределах лимитов успешно завершена.
- Тестирование покупки и продажи токенов выполнено без ошибок.
- Правильно реализовано предотвращение снятия средств сверх имеющегося баланса.
- Проверка активации функций только при корректных условиях также оказалась успешной.
Неудачные тесты и тесты с отрицательными результатами:
- В контракте BadRandomness не удалось успешно выполнить функцию участия из-за отсутствия необходимых событий.
- В контракте SelfDestruct возникли ошибки при активации скрытого механизма доступа с некорректным паролем.
- Часть тестов выявила проблемы с логикой контрактов, приводящие к некорректной обработке транзакций или отсутствию необходимых событий.
Hardhat
Популярный инструмент для разработки и тестирования смарт-контрактов, который позволяет разворачивать контракты на локальные сети, писать тесты функциональности и находить потенциальные ошибки.
Как начать работу с Hardhat?
Для начала нужно создать новый проект:
npm init -y
Установим Hardhat в локальную среду:
npm install --save-dev hardhat
Далее инициализируем Hardhat в нашем проекте:
npx hardhat run scripts/deploy.js --network localhost
Добавим файлы .sol в директорию “contracts”, которая была создана при инициализации проекта.
Отредактируем файл hardhat.config.js, указав базовые настройки, такие как версия компилятора для наших смарт-контрактов:
Для развертывания контрактов на локальную тестовую сеть создадим скрипт deploy.js в директории scripts. В нем опишем функцию для развертывания контракта. Например:
Давайте выполним команду для развертывания:
npx hardhat run scripts/deploy.js --network localhost
Тестирование функциональности
Для тестирования контракта создадим отдельный тестовый файл в директории “test”. Например, наш тест для EtherStore.sol проверял следующие аспекты:
- Проверка депозитов. Правильно ли записывается баланс после внесения средств?
- Проверка снятия средств. Возвращаются ли средства владельцу, если условия выполнены?
- Проверка на ошибку при преждевременном снятии. Срабатывают ли ограничения на время снятия?
Наконец запустим тесты с помощью команды:
npx hardhat test
Структура проекта выглядит так:
Результаты тестирования
Мы протестировали функциональность смарт-контрактов на базе локальной сети Hardhat. В результате выполнения 17 тестов мы получили:
- 8 тестов с положительными результатами. Была проверена корректность депозитов, снятие средств и базовые функции.
- 9 тестов с отрицательными результатами. Выявлены ошибки, связанные с преждевременным снятием средств и ошибочными транзакциями.
Manticore
Запускаем детальный анализ контракта:
manticore /path/smart-contract.sol
Структура отчета сканирования:
- global_BadRandomness.init_asm – содержит инструкции EVM в виде ассемблерного кода, отображающие выполнение контракта.
- global.findings – содержит список найденных уязвимостей с подробными пояснениями.
- global.solver_stats – показывает статистику работы SAT-решателя, в частности, количество проверенных состояний, решенных ограничений и сгенерированных входных данных.
- global.summary – краткий отчет обо всех найденных уязвимостях, количестве сгенерированных сценариев тестирования, а также времени выполнения анализа.
- manticore.yml – конфигурация запуска Manticore.
Файл manticore.yml определяет, как именно будет выполняться анализ смарт-контракта. Этот файл, вероятно, нужно изменить в соответствии с требованиями вашего проекта, чтобы повысить точность тестирования.
В нашем случае мы использовали базовую конфигурацию файла manticore.yml, не внося никаких изменений. Из-за этого некоторые уязвимости остались незамеченными, поскольку стандартные настройки не учитывают специфику контрактов и их окружения. Это подчеркивает важность адаптации конфигурации для достижения максимальной точности при тестировании, особенно для проектов с нетипичной логикой или сложными взаимодействиями между функциями.
Medusa
Medusa является мощным инструментом для автоматизированного fuzz-тестирования смарт-контрактов.
Как начать работу с Medusa?
Для начала необходимо установить Medusa с помощью brew:
brew install medusa
Для компиляции файлов смарт-контрактов нужно установить crytic-compile:
pip3 install crytic-compile
После установки Medusa можно инициализировать проект:
medusa init
В вашей рабочей директории появится файл medusa.json. Этот файл содержит базовые настройки Medusa, которые нужно откорректировать под ваш конкретный проект. Например, для тестирования уязвимых смарт-контрактов фрагмент вашего конфигурационного файла может выглядеть так:
После настройки medusa.json нужно скомпилировать смарт-контракты:
crytic-compile /path/contracts
Для запуска процесса fuzz-тестирования выполните команду:
medusa fuzz
Для примера возьмем первый наш уязвимый смарт-контракт BadRandomness:
Mythril
Запускаем детальный анализ контракта:
myth analyze path/smart-contract.sol
Структура результата сканирования
- Общая информация об уязвимости.
- Контракт и функция.
- Описание уязвимости.
- Технические характеристики.
- Начальное состояние.
- Последовательность транзакций.
- Рекомендации.
Анализ контрактов с помощью Mythril выявил 14 уязвимостей разной степени риска.
Slither
Запускаем детальный анализ контракта:
slither path/smart-contract.sol
Структура результата сканирования
- Скрипт анализа.
- Информация от детектора.
- Ссылка на детектор.
Анализ контрактов с помощью Slither выявил 18 уязвимостей разной степени риска.
Solhint
Использование Solhint позволяет придерживаться общих правил написания кода и выявлять потенциальные проблемы, которые могут повлиять на безопасность или эффективность выполнения.
Сначала необходимо установить Solhint, используя менеджер npm:
npm install solhint --save-dev
После установки Solhint, инициализируем файл конфигурации с помощью команды:
solhint init
Эта команда создает файл .solhint.json, который содержит базовые правила проверки. Его можно настроить в соответствии с вашими потребностями.
Ознакомиться с полным списком правил можно на официальном GitHub-ресурсе Solhint:
Запуск проверки выполняется командой:
solhint 'path/*.sol'
Результаты тестирования
В ходе проверки было проанализировано несколько смарт-контрактов. Примененная базовая конфигурация Solhint обнаружила 33 предупреждения, в частности:
- Отсутствие сообщений о причине в вызовах require (правило reason-string).
- Использование устаревших методов, таких как suicide, которые не являются оптимальными.
- Отсутствие явного указания видимости переменных и функций (правило state-visibility).
- Рекомендация использовать Custom Errors для повышения эффективности вместо традиционных строковых сообщений.
Tenderly
Для начала работы необходимо войти в учетную запись на сайте Tenderly, создать новый проект и ввести адрес вашего смарт-контракта.
Для симуляции транзакций необходимо добавить кошелек с достаточным балансом. Это позволяет имитировать выполнение транзакций в реальной среде, учитывая реальные расходы на газ и другие параметры. Однако симуляция сама по себе не расходует реальных средств или газа, обеспечивая безопасное тестирование. Вы можете протестировать отдельные функции контракта и установить желаемые параметры транзакций.
В нашем примере симуляция транзакции завершилась ошибкой, поскольку функцию контракта может вызвать только владелец адреса. Это демонстрирует важность правильной настройки доступа к функциям контракта.
Tenderly позволяет получить подробный отчет о выполнении, включая трассировку стека, что помогает разработчикам лучше понять причину ошибки и найти оптимальное решение.
Tenderly поддерживает не только GUI, но и CLI (интерфейс командной строки). Это позволяет интегрировать инструмент в ваш рабочий процесс. Например, вы можете автоматизировать тестирование смарт-контрактов с помощью файла конфигурации, который легко интегрируется в ваш проект. Более подробную информацию можно найти в документации Tenderly.
Итак, Tenderly является хорошим выбором для разработчиков, которые ищут удобный и мощный инструмент для тестирования смарт-контрактов. Он позволяет быстро находить ошибки, симулировать транзакции в реальном времени и легко интегрироваться в рабочие процессы вашего проекта.
Сравнительная характеристика инструментов анализа и тестирования смарт-контрактов
Для удобства мы разделили инструменты на пять категорий по типам и методам анализа: статический анализ, локальное тестирование, фреймворки для отладки и юнит-тестирования, фаззинг-тестирование и комбинированный анализ. Данное разделение поможет понять назначение инструментов и выбрать правильное решение для конкретных случаев, задач или фаз разработки и тестирования смарт-контрактов.
- Статический анализ используется для проверки кода без его выполнения. Он помогает находить потенциальные уязвимости еще на этапе написания смарт-контрактов.
- Локальное тестирование позволяет запускать транзакции в изолированной среде, имитируя выполнение контракта без затрат газа.
- Фреймворки для отладки и юнит-тестирования облегчают процесс написания тестов и проверку функциональности смарт-контрактов.
- Фаззинг-тестирование направлено на динамическую проверку поведения контракта при непредсказуемых входных данных для выявления предельных случаев и логических ошибок.
- Комбинированный анализ сочетает статический и динамический подходы, что позволяет проверять как структуру кода, так и его поведение во время выполнения.
Ниже приведена сравнительная таблица для инструментов первых трех категорий. Она содержит информацию о методах обнаружения уязвимостей, их преимуществах и основных особенностях средств анализа. Это поможет выбрать оптимальный набор инструментов для повышения безопасности смарт-контрактов на начальных этапах отладки и тестирования.
Таблица 1. Инструменты для статического анализа, локального тестирования, отладки и юнит-тестирования.
Инструмент | Назначение | Тип анализа | Методы обнаружения уязвимостей |
Aderyn | Обнаруживает переполнение чисел, проблемы с правами доступа и т.д. | Статический анализ | Анализ логики на основе кодовой базы с помощью имеющихся детекторов или созданных собственноручно |
Ganache | Тестирует транзакции в симуляции и не предназначен для поиска уязвимостей. | Локальное тестирование | Симуляция транзакций |
Hardhat | Используется для отладки контрактов. | Локальное тестирование | Отладка и юнит-тестирование |
Slither | Обнаруживает множество уязвимостей, таких как reentrancy, переполнение чисел и другие логические ошибки благодаря более чем 90 детекторам. | Статический анализ | Статический анализ, проверка логики |
Solhint | Выявляет потенциальные проблемы в коде, связанные со стилем, а также логические ошибки. | Линнинг | Статический анализ стиля и базовой логики |
Truffle | Используется для юнит-тестирования. | Юнит-тестирование | Юнит-тесты и миграция контрактов |
Таблица ниже представляет инструменты для динамического и комбинированного тестирования. Это позволяет находить ошибки при выполнении смарт-контрактов. Основные преимущества этих инструментов и методы тестирования описаны ниже.
Таблица 2. Инструменты для фаззинг-тестирования и комбинированного анализа.
Инструмент | Назначение | Тип анализа | Методы обнаружения уязвимостей |
Diligence Fuzzing | Автоматизированное фаззинг-тестирование. | Фаззинг-тестирование | Фаззинг для DeFi-протоколов |
Echidna | Выявляет логические ошибки и предельные случаи. | Фаззинг-тестирование | Фаззирование инвариантов |
Foundry | Тестирование логики контракта, не обнаруживает уязвимости напрямую. | Фаззинг и юнит-тестирование | Выявляет недостатки функционала с помощью написания собственных тестов и автоматизированный фаззинг |
Manticore | Обнаруживает логические ошибки, переполнение, reentrancy. | Символическое исполнение и динамический анализ | Симуляция контрактов и поиск путей исполнения |
Medusa | Автоматизированное фазинг-тестирование. | Фаззинг-тестирование | Фаззинг байт-кода с поддержкой параллельных тестов |
Mythril | Обнаруживает логические ошибки, reentrancy, атаки. | Комбинированный анализ | Символическое исполнение, динамический и статический анализ |
Tenderly | Используется для моделирования и проверки поведения контрактов во время исполнения. Помогает проверять контракт в реальной и симуляционной среде. | Симуляция и отладка | Динамический анализ в реальной и симуляционной среде |
Сведем в алфавитном порядке все инструменты анализа смарт-контрактов в одну таблицу, опишем их преимущества и рекомендации по выбору для определенных обстоятельств и фаз проектов.
Таблица 3. Рекомендации по выбору инструментов.
Инструмент | Преимущества | Рекомендации |
Aderyn | Поддерживает кастомные анализаторы и любую структуру разработки (Foundry/Hardhat/Truffle и т.д.) | Используйте для проектов с высокими требованиями к безопасности, особенно когда требуется кастомизация правил анализа. |
Diligence Fuzzing | Мощный инструмент для DeFi-протоколов. | Идеально подходит для проектов DeFi, где скрытые уязвимости могут создать серьезные риски. |
Echidna | Проверка инвариантов смарт-контрактов. | Используйте для проверки протоколов с высоким уровнем риска. |
Foundry | Быстрое юнит-тестирование и интеграция со многими инструментами. | Используйте для масштабируемых проектов, требующих быстрого тестирования и разработки. |
Ganache | Локальная блокчейн-сеть без затрат газа. | Используйте для тестирования смарт-контрактов перед их развертыванием в основной сети Ethereum. |
Hardhat | Гибкая интеграция с другими инструментами. | Используйте для сложных проектов, требующих кастомизации среды разработки. |
Manticore | Символическое исполнение для проверки всех путей исполнения контракта. | Используйте для глубокого анализа сложных смарт-контрактов. |
Medusa | Мощный фаззер с параллельными тестами. | Полезен для больших проектов со многими сценариями тестирования. |
Mythril | Поддерживает символическое выполнение и динамический анализ. | Используйте для проектов, требующих глубокого анализа безопасности. |
Slither | Быстрый статический анализ с 90+ детекторами. | Идеален для проектов с регулярным мониторингом кода. |
Solhint | Линтер для Solidity, помогает придерживаться стиля написания и стандартов безопасности. | Используйте для больших команд, где важно обеспечить единство стиля кода. |
Tenderly | Симуляция транзакций в реальном времени без затрат газа. | Используйте для DeFi-проектов, где важна детализация транзакций. |
Truffle | Простой и понятный фреймворк для разработки, тестирования и развертывания контрактов. Удобная интеграция со скриптами. | Используйте для написания и выполнения юнит-тестов смарт-контрактов и проверки функционала в среде разработки перед проведением полного аудита безопасности. |
Выводы

В статье мы рассмотрели лучшие инструменты для тестирования смарт-контрактов, разделив их на категории по типам анализа и сценариям использования. Каждый из этих инструментов имеет свои преимущества и особенности, которые могут значительно облегчить работу разработчиков, тестировщиков и аудиторов безопасности. Выбор инструмента зависит от ваших потребностей: от быстрого прототипирования с фреймворками, такими как Hardhat или Foundry, до глубокого анализа безопасности с помощью инструментов статического и комбинированного анализа, таких как Slither или Mythril.
Мы подчеркиваем, что использование правильно подобранных инструментов является лишь частью комплексного процесса обеспечения безопасности смарт-контрактов. Мы всегда рекомендуем дополнительно проводить ручной аудит каждой строки кода, чтобы выявить потенциальные уязвимости, которые могли остаться незамеченными автоматизированными средствами.
Если вы не хотите тратить время даже на конфигурирование автоматических инструментов, и хотите быстро найти потенциальные уязвимости вашего смарт-контракта, приглашаем протестировать его на нашем бесплатном онлайн-анализаторе scau.pro. Это позволяет быстро получить первичный неглубокий, зато быстрый анализ безопасности.
Для более глубокого аудита мы предлагаем ручной анализ нашими экспертами. Обращайтесь к нашей команде, чтобы заказать профессиональный аудит смарт-контрактов, который поможет вам защитить ваши активы и обеспечить безопасность ваших проектов.
Наша команда экспертов уже помогла многим проектам, обеспечив им наивысший уровень безопасности. Например, на странице проектных отчетов вы найдете неконфиденциальную часть успешных кейсов, где мы обнаружили и устранили уязвимости разной степени сложности. Это позволило нашим клиентам избежать финансовых потерь и сохранить репутацию их проектов.
Отправьте форму ниже, закажите бесплатную консультацию и сделайте первый шаг к защите вашего смарт-контракта уже сегодня!
_________________________
Подпишитесь на наш канал Telegram, чтобы не пропускать наши новости и статьи блога.