Лучшие инструменты анализа смарт-контрактов 2025 года

01.02.2025 Автор: Тарас Билокинь

Обзор современных средств тестирования смарт-контрактов

Введение

В условиях стремительного развития технологий блокчейн и смарт-контрактов критически важной становится проблема их безопасности. Статистика показывает, что из-за уязвимостей в смарт-контрактах ежегодно теряются сотни миллионов долларов.

Тестирование смарт-контрактов стало неотъемлемой частью их разработки и аудита, особенно для блокчейн-проектов с высокими требованиями к безопасности. Существует множество инструментов анализа смарт-контрактов. Каждый из этих инструментов имеет уникальные функции, которые помогают обеспечить качество и безопасность.

Ранее мы проводили сравнительный анализ инструментов Mythril, Securify и Slither, демонстрируя их возможности в поиске таких уязвимостей, как атаки повторного входа и арифметические ошибки. Также мы описывали ключевые сценарии атак и давали рекомендации по избежанию уязвимостей и ограничению доступа к критическим функциям.

Прошло несколько лет, и ситуация изменилась. Сейчас мы видим следующие основные вызовы, связанные с безопасностью смарт-контрактов:

  1. Сложность выбора инструментов тестирования из-за их большого количества и различной специфики.
  2. Отсутствие систематизированной информации о возможностях и ограничениях каждого инструмента.
  3. Потребность в практических рекомендациях по настройке и использованию инструментов.
  4. Необходимость понимания, какие типы уязвимостей обнаруживает каждый инструмент.

Поэтому сегодня мы видим для себя следующие задачи:

  1. Систематизировать информацию о самых актуальных современных инструментах тестирования смарт-контрактов.
  2. Предоставить первоочередные практические рекомендации по их использованию.
  3. Помочь разработчикам выбрать оптимальный набор инструментов и методов для своих проектов.
  4. Продемонстрировать эффективность различных инструментов на реальных примерах.

В этой статье мы описали лучшие средства анализа смарт-контрактов, а также поделились опытом нашей команды аудиторов, которая помогает проектам достигать высокого уровня безопасности. Это позволит разработчикам и специалистам по информационной безопасности выбрать лучшие инструменты для повышения безопасности своих проектов и обеспечить эффективный аудит смарт-контрактов.

Как мы выбирали инструменты анализа смарт-контрактов

Из большого количества средств аудита смарт-контрактов мы выбрали ограниченный перечень современных инструментов на основе их популярности, гибкости, эффективности и возможностей интеграции.

Популярность в сообществе

Выбранные инструменты имеют широкую поддержку в среде блокчейн-разработчиков и активно обновляются. Популярность инструментов среди разработчиков и специалистов по безопасности смарт-контрактов, а также активная поддержка со стороны сообщества и разработчиков этих инструментов обеспечивают регулярные обновления и быстрое исправление ошибок. Это делает инструменты более надежными, чем ранее. Кроме того, поддержка примеров, документации и плагинов делает эти инструменты более удобными в использовании.

  1. Hardhat и Truffle – ведущие фреймворки для разработки на Ethereum, которые предоставляют удобные средства для компиляции, тестирования и развертывания контрактов. Популярность этих фреймворков гарантирует богатую экосистему плагинов и поддержки.
  2. Slither и Mythril известны своими мощными возможностями для, соответственно, статического и динамического анализа смарт-контрактов. Такие возможности делают эти инструменты незаменимыми для аудита безопасности.

Гибкость

Инструменты из этого списка подходят для широкого спектра блокчейн-платформ, обеспечивая разработчикам необходимую гибкость.

  1. Aderyn позволяет создавать кастомные анализаторы, что делает его особенно полезным для проектов с высокими требованиями к безопасности.
  2. Foundry поддерживает мультиблокчейн-проекты, обеспечивая быструю интеграцию с различными сетями.
  3. Ganache создает частную блокчейн-сеть для тестирования смарт-контрактов, позволяя симулировать транзакции без затрат на газ.
  4. Tenderly позволяет проводить реалистичную симуляцию транзакций и отладку в реальном времени. Это делает его идеальным для проектов в области DeFi.

Эффективность нахождения уязвимостей

Данные инструменты предоставляют разнообразные подходы для проверки безопасности и подходят для чрезвычайно сложных задач. Каждый инструмент является уникальным, внося свой вклад в качество, точность и надежность тестирования. Они помогают разработчикам и аудиторам найти логические ошибки, оптимизировать код и выявить потенциальные уязвимости.

  1. Diligence Fuzzing от ConsenSys позволяет находить скрытые уязвимости с помощью автоматизированного генерирования входных данных и фаззинга. Инструмент интегрируется со Scribble, инструментом тестирования смарт-контрактов, путем проверки во время выполнения. Это позволяет разработчикам определять спецификации смарт-контрактов для более точного тестирования и выявления потенциальных проблем в логике контракта.
  2. Echidna – это фреймворк для фаззинг-тестирования смарт-контрактов на Solidity, который генерирует различные входные данные для выявления аномалий в поведении контрактов, обеспечивая высокий уровень покрытия тестирования и выявления скрытых уязвимостей.
  3. Manticore – это инструмент анализа бинарных файлов, который позволяет запускать символическое выполнение и исследовать различные варианты работы алгоритмов, выявляя потенциальные уязвимости и ошибки в смарт-контрактах.
  4. Medusa – мощный инструмент для фаззинг-тестирования, способный выполнять параллельные тесты, что значительно ускоряет процесс обнаружения ошибок. Благодаря своей способности работать с большими кодовыми базами, Medusa особенно эффективна в больших командах или для масштабных проектов.
  5. Mythril – это инструмент для анализа безопасности байт-кода EVM. Mythril использует символьное исполнение, SMT-решение и taint-анализ для выявления различных уязвимостей в смарт-контрактах, разработанных для Ethereum и других блокчейнов, совместимых с EVM.
  6. Slither – это статический анализатор кода смарт-контрактов, который не только автоматически находит уязвимости, но и выявляет возможности для оптимизации кода и визуализирует алгоритм выполнения. Это помогает аудиторам лучше понимать структуру смарт-контракта.

Интеграция

Современные блокчейн-проекты активно используют автоматизацию для обеспечения безопасности и качества кода.

  1. Solhint – линтер для кода Solidity, который обеспечивает автоматическую проверку на соответствие стандартам стиля и безопасности. Он идеально подходит для процессов CI/CD.
  2. Tenderly обеспечивает непрерывный мониторинг контрактов, интегрируясь с популярными инструментами разработки, такими как Hardhat и Foundry.

Описание инструментов анализа смарт-контрактов

Приведем немного более детальное описание самых актуальных средств тестирования смарт-контрактов в алфавитном порядке.

Aderyn

Aderyn — это статический анализатор смарт-контрактов Solidity, созданный на базе Rust. Основная цель этого инструмента — помочь разработчикам и исследователям безопасности идентифицировать уязвимости в кодовой базе. Благодаря высокой скорости работы и возможности создания кастомных детекторов, Aderyn легко интегрируется в процессы разработки.

Ключевые функции:

  1. Анализ уязвимостей смарт-контрактов Solidity.
  2. Поддержка создания кастомных детекторов для специфических задач.
  3. Быстрый интерфейс командной строки (CLI) для удобного взаимодействия.
  4. Вывод результатов в форматах Markdown и JSON.

Diligence Fuzzing

Этот инструмент от ConsenSys использует фаззинг для выявления уязвимостей в смарт-контрактах. Diligence Fuzzing генерирует случайные входные данные для проверки устойчивости контрактов к непредсказуемым сценариям.

Ключевые функции:

  1. Поддержка тестирования на основе Foundry и Scribble.
  2. Использование фаззера Harvey для анализа байт-кода EVM.
  3. Отчетность для быстрой идентификации потенциальных проблем.

Echidna

Echidna обеспечивает тестирование смарт-контрактов на основе фаззинга. Инструмент проверяет сохранение инвариантов даже при экстремальных входных данных.

Ключевые функции:

  1. Генерация входных данных, адаптированных к конкретному коду.
  2. Отчеты об использовании газа и покрытии тестами.
  3. Интерактивный интерфейс для настройки кампаний фаззинга.

Foundry

Foundry — это многофункциональный фреймворк для разработки и тестирования смарт-контрактов. Его преимущества включают поддержку мультиблокчейн-проектов и высокопроизводительное юнит-тестирование.

Ключевые функции:

  1. Поддержка тестов Solidity с автоматическим обнаружением функций тестов.
  2. Тестирование на основе свойств для проверки общего поведения.
  3. Поддержка интеграции с другими инструментами.

Ganache

Ganache создает локальную частную блокчейн-сеть для тестирования смарт-контрактов.

Ключевые функции:

  1. Имитация транзакций с точностью до блока.
  2. Форкинг основной сети Ethereum для реалистичных тестов.
  3. Быстрое создание снимков состояния и их восстановление.

Кейс-стади: В проекте Geisted команда H-X Technologies использовала Ganache для симуляции реальных транзакций. Была обнаружена уязвимость, связанная с Unchecked CALL Return Values, которая возникала из-за использования ассемблера для проверки контрактов. Это увеличивало вероятность ошибок, которые могли остаться незамеченными. Рекомендации включали избегание ассемблера и внедрение более безопасных конструкций Solidity. Подробные результаты тестирования изложены в Report on Security Assessment of ERC20, GMarketplace, and NFTCollection + GNFT.

Hardhat

Hardhat – это удобный фреймворк для разработчиков с поддержкой функций отладки и автоматизации тестирования.

Ключевые функции:

  1. Тестирование с использованием Mocha и Chai.
  2. Дополнительные функции для отладки контрактов.
  3. Интеграция с современными инструментами развертывания.

Manticore

Manticore обеспечивает символическое исполнение для анализа всех возможных путей выполнения смарт-контракта.

Ключевые функции:

  1. Автоматическое создание входных данных для тестирования.
  2. Гибкий Python API для расширенного контроля.

Medusa

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

Ключевые функции:

  1. Поддержка многопоточного фаззинга.
  2. Покрытие данных для расширенного анализа.

Mythril

Mythril использует символьное исполнение для обнаружения широкого спектра уязвимостей, таких как повторный вход и переполнение чисел.

Ключевые функции:

  1. Анализ байт-кода для EVM-совместимых блокчейнов.
  2. Отчеты о ключевых уязвимостях с высокой точностью.

Slither

Slither выполняет статический анализ кода Solidity для выявления уязвимостей с относительно низким уровнем ложных срабатываний.

Ключевые функции:

  1. Автоматизация проверок с помощью CI/CD.
  2. Генерация отчетов об улучшении эффективности.

Кейс-стади: В процессе тестирования одного из проектов мы обнаружили возможность оптимизации использования газа. Инструмент подсказал, что переменные CALLBACK_SUCCESS и PERMIT_TYPEHASH можно объявить как constant. Это уменьшило бы затраты на газ за счет вычисления значений на этапе компиляции. Рекомендации по этой оптимизации были внедрены. Это улучшило эффективность контракта без влияния на его функциональность. Подробные результаты анализа изложены в Report on Security Assessment of Milkomeda Smart Contracts for OccamX.

Solhint

Solhint помогает поддерживать стиль кода и базовую безопасность с помощью интеграции с существующими рабочими процессами. Это инструмент для линтинга кода Solidity со следующими особенностями:

  1. Настройка правил проверки в соответствии с требованиями проекта, а также поддержка общих конфигураций.
  2. Расширение функционала с помощью плагинов. Это позволяет добавлять новые правила и интеграции.
  3. Интеграция с популярными средами разработки, такими как Sublime Text, Atom, Vim, JetBrains IDEA и Visual Studio Code.
  4. Эффективный парсинг и валидация.

Tenderly

Tenderly позволяет симулировать транзакции в реальном времени для выявления потенциальных ошибок.

Ключевые функции:

  1. Интеграция с Foundry и Hardhat.
  2. Расширенные возможности отладки.

Truffle

Truffle предлагает среду для полного цикла разработки, тестирования и развертывания смарт-контрактов.

Ключевые функции:

  1. Встроенные средства компиляции и миграции.
  2. Интерактивная консоль для работы с контрактами.

Кейс-стади: Команда 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. Общая информация.

1.2. Инструмент.

1.3. Количество проанализированных файлов.

1.4. Общее количество строк кода (nSLOC).

1.5. Общее количество выявленных проблем.

  1. Детали анализа.

2.1. Файлы, которые анализировались.

2.2. Количество уязвимостей по категориям.

  1. Проблемы высокой критичности.
  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. Как видно из примера, тестирование показало следующие данные:

  1. Тестов за секунду: 2593 – высокая производительность позволяет быстро находить возможные проблемы.
  2. Общее покрытие кода: 75% – косвенно указывает на качество проверки.
  3. Время выполнения: 2 минуты — даже за короткий промежуток времени был достигнут значительный прогресс.
  4. Остаточный риск: 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. Вот краткий обзор результатов:

  1. 11  положительных результатов тестов:
  • Успешное тестирование внесения депозитов.
  • Проверка предотвращения снятия средств сверх баланса.
  • Правильное управление токенами функциями buy и sell.
  • Удачно протестирован механизм скрытого доступа.
  • Успешная проверка выбора случайного пользователя, отклонения некорректных транзакций и т.д.
  1. 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 неудачных теста и теста с отрицательными результатами:

Успешные тесты:

  1. Проверка внесения депозитов и снятия средств в пределах лимитов успешно завершена.
  2. Тестирование покупки и продажи токенов выполнено без ошибок.
  3. Правильно реализовано предотвращение снятия средств сверх имеющегося баланса.
  4. Проверка активации функций только при корректных условиях также оказалась успешной.

Неудачные тесты и тесты с отрицательными результатами:

  1. В контракте BadRandomness не удалось успешно выполнить функцию участия из-за отсутствия необходимых событий.
  2. В контракте SelfDestruct возникли ошибки при активации скрытого механизма доступа с некорректным паролем.
  3. Часть тестов выявила проблемы с логикой контрактов, приводящие к некорректной обработке транзакций или отсутствию необходимых событий.

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 проверял следующие аспекты:

  1. Проверка депозитов. Правильно ли записывается баланс после внесения средств?
  2. Проверка снятия средств. Возвращаются ли средства владельцу, если условия выполнены?
  3. Проверка на ошибку при преждевременном снятии. Срабатывают ли ограничения на время снятия?

Наконец запустим тесты с помощью команды:

npx hardhat test

Структура проекта выглядит так:

Результаты тестирования

Мы протестировали функциональность смарт-контрактов на базе локальной сети Hardhat. В результате выполнения 17 тестов мы получили:

  1. 8 тестов с положительными результатами. Была проверена корректность депозитов, снятие средств и базовые функции.
  2. 9 тестов с отрицательными результатами. Выявлены ошибки, связанные с преждевременным снятием средств и ошибочными транзакциями.

Manticore

Запускаем детальный анализ контракта:

manticore /path/smart-contract.sol

Структура отчета сканирования:

  1. global_BadRandomness.init_asm – содержит инструкции EVM в виде ассемблерного кода, отображающие выполнение контракта.
  2. global.findings – содержит список найденных уязвимостей с подробными пояснениями.
  3. global.solver_stats – показывает статистику работы SAT-решателя, в частности, количество проверенных состояний, решенных ограничений и сгенерированных входных данных.
  4. global.summary – краткий отчет обо всех найденных уязвимостях, количестве сгенерированных сценариев тестирования, а также времени выполнения анализа.
  5. 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

Структура результата сканирования

  1. Общая информация об уязвимости.
  2. Контракт и функция.
  3. Описание уязвимости.
  4. Технические характеристики.
  5. Начальное состояние.
  6. Последовательность транзакций.
  7. Рекомендации.

Анализ контрактов с помощью Mythril выявил 14 уязвимостей разной степени риска.

Slither

Запускаем детальный анализ контракта:

slither path/smart-contract.sol

Структура результата сканирования

  1. Скрипт анализа.
  2. Информация от детектора.
  3. Ссылка на детектор.

Анализ контрактов с помощью Slither выявил 18 уязвимостей разной степени риска.

Solhint

Использование Solhint позволяет придерживаться общих правил написания кода и выявлять потенциальные проблемы, которые могут повлиять на безопасность или эффективность выполнения.

Сначала необходимо установить Solhint, используя менеджер npm:

npm install solhint --save-dev

После установки Solhint, инициализируем файл конфигурации с помощью команды:

solhint init

Эта команда создает файл .solhint.json, который содержит базовые правила проверки. Его можно настроить в соответствии с вашими потребностями.

Ознакомиться с полным списком правил можно на официальном GitHub-ресурсе Solhint:

Запуск проверки выполняется командой:

solhint 'path/*.sol'

Результаты тестирования

В ходе проверки было проанализировано несколько смарт-контрактов. Примененная базовая конфигурация Solhint обнаружила 33 предупреждения, в частности:

  1. Отсутствие сообщений о причине в вызовах require (правило reason-string).
  2. Использование устаревших методов, таких как suicide, которые не являются оптимальными.
  3. Отсутствие явного указания видимости переменных и функций (правило state-visibility).
  4. Рекомендация использовать Custom Errors для повышения эффективности вместо традиционных строковых сообщений.

Tenderly

Для начала работы необходимо войти в учетную запись на сайте Tenderly, создать новый проект и ввести адрес вашего смарт-контракта.

Для симуляции транзакций необходимо добавить кошелек с достаточным балансом. Это позволяет имитировать выполнение транзакций в реальной среде, учитывая реальные расходы на газ и другие параметры. Однако симуляция сама по себе не расходует реальных средств или газа, обеспечивая безопасное тестирование. Вы можете протестировать отдельные функции контракта и установить желаемые параметры транзакций.

В нашем примере симуляция транзакции завершилась ошибкой, поскольку функцию контракта может вызвать только владелец адреса. Это демонстрирует важность правильной настройки доступа к функциям контракта.

Tenderly позволяет получить подробный отчет о выполнении, включая трассировку стека, что помогает разработчикам лучше понять причину ошибки и найти оптимальное решение.

Tenderly поддерживает не только GUI, но и CLI (интерфейс командной строки). Это позволяет интегрировать инструмент в ваш рабочий процесс. Например, вы можете автоматизировать тестирование смарт-контрактов с помощью файла конфигурации, который легко интегрируется в ваш проект. Более подробную информацию можно найти в документации Tenderly.

Итак, Tenderly является хорошим выбором для разработчиков, которые ищут удобный и мощный инструмент для тестирования смарт-контрактов. Он позволяет быстро находить ошибки, симулировать транзакции в реальном времени и легко интегрироваться в рабочие процессы вашего проекта.

Сравнительная характеристика инструментов анализа и тестирования смарт-контрактов

Для удобства мы разделили инструменты на пять категорий по типам и методам анализа: статический анализ, локальное тестирование, фреймворки для отладки и юнит-тестирования, фаззинг-тестирование и комбинированный анализ. Данное разделение поможет понять назначение инструментов и выбрать правильное решение для конкретных случаев, задач или фаз разработки и тестирования смарт-контрактов.

  1. Статический анализ используется для проверки кода без его выполнения. Он помогает находить потенциальные уязвимости еще на этапе написания смарт-контрактов.
  2. Локальное тестирование позволяет запускать транзакции в изолированной среде, имитируя выполнение контракта без затрат газа.
  3. Фреймворки для отладки и юнит-тестирования облегчают процесс написания тестов и проверку функциональности смарт-контрактов.
  4. Фаззинг-тестирование направлено на динамическую проверку поведения контракта при непредсказуемых входных данных для выявления предельных случаев и логических ошибок.
  5. Комбинированный анализ сочетает статический и динамический подходы, что позволяет проверять как структуру кода, так и его поведение во время выполнения.

Ниже приведена сравнительная таблица для инструментов первых трех категорий. Она содержит информацию о методах обнаружения уязвимостей, их преимуществах и основных особенностях средств анализа. Это поможет выбрать оптимальный набор инструментов для повышения безопасности смарт-контрактов на начальных этапах отладки и тестирования.

Таблица 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, чтобы не пропускать наши новости и статьи блога.

Другие посты

22/01/2025
Как ИИ может повысить и снизить безопасность бизнеса
30/11/2024
Безопасность искусственного интеллекта