Огляд сучасних засобів тестування смарт-контрактів
Вступ
В умовах стрімкого розвитку технологій блокчейн та смарт-контрактів критично важливою стає проблема їх безпеки. Статистика показує, що через вразливості в смарт-контрактах щороку втрачаються сотні мільйонів доларів.
Тестування смарт-контрактів стало невід’ємною частиною їхнього розроблення та аудиту, особливо для блокчейн-проектів із високими вимогами до безпеки. Існує безліч інструментів аналізу смарт-контрактів. Кожен із цих інструментів має унікальні функції, які допомагають забезпечити якість та безпеку.
Раніше ми проводили порівняльний аналіз інструментів 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
Додамо файли .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, щоб не пропускати наші новини та статті блогу.