
Вступ
Коли я почав розробляти на Solidity, я швидко відмовився від онлайн-IDE і перейшов на Hardhat як свою нову основну платформу. Через кілька місяців роботи над проектами та створенням робочого процесу я відчув себе комфортно з її мережевою структурою, стратегією тестування та організацією проектів.
Однак, коли хтось сказав, що переваги Foundry в плані продуктивності вражають, я зацікавився настільки, що вирішив провести належне порівняння двох популярних фреймворків для розробки смарт-контрактів.
Щоб зробити об'єктивну оцінку, я створив однакові проекти за допомогою обох інструментів і застосував однаковий контракт MiniBank та подальші налаштування тестування. Цей практичний досвід продемонстрував, що продуктивність, досвід розробників та робочий процес цих двох інструментів суттєво відрізняються, і це варто врахувати кожному, хто обирає між ними.
Архітектура та налаштування проекту
Початковий досвід налаштування цих двох фреймворків досить різний. Foundry створює конфігураційний файл foundry.toml на основі пар ключ-значення, що аналогічно файлу hardhat.config.js у Hardhat. Обидва також підтримують налаштування папок джерел, каталогів виводу компіляції тощо.
Стандартна структура папок у Foundry дещо відрізняється, однак у файлі конфігурації неможливо безпосередньо налаштувати кілька мереж, оскільки Hardhat чудово справляється з підтримкою декількох мереж. Решта параметрів у foundry.toml пов'язані з опціями тестування, включаючи детальність або налаштування облікового запису та опції ціни газу.
Функція перепризначення Foundry є особливо цікавою, оскільки вона пропонує ефективний підхід до імпорту залежностей. Ви можете значно спростити імпорт контрактів, створивши ярлики в конфігурації.
Наприклад, замість написання довгих шляхів імпорту, ви можете написати короткі відповідності, які допоможуть зробити ваш код більш читабельним і зручним для обслуговування.
Підходи до управління залежностями
Фреймворки радикально відрізняються за способом управління залежностями:
- •Hardhat використовує усталену екосистему npm, яка відразу ж відкрита для розробників JavaScript
- •Встановлення контрактів OpenZeppelin — це просто команда npm install
- •Foundry покладається на управління залежностями за допомогою субмодуля Git через інструмент forge CLI
- •Залежності зберігаються в папці lib/ і додаються до файлу .gitmodules, на відміну від package.json
Цей метод приймає будь-яке сховище GitHub, яке включає смарт-контракти як залежність, і дозволяє бути більш гнучким у виборі бібліотек.
Ви можете вказати організацію GitHub та назву репозиторію, а також, за бажанням, вказати гілку або тег для встановлення. Після встановлення forge можна скористатися командою forge remapping, щоб переглянути стандартні шляхи імпорту, які буде використовувати Foundry, а потім налаштувати їх за допомогою файлів конфігурації.
Інструменти розробки та налагодження
Однією з областей, в якій Hardhat виділяється, є досвід налагодження. Фреймворк також пропонує використання console.log за замовчуванням, що нагадує очікуваний стиль налагодження в розробці JavaScript. Ця функціональність активно рекламується як перевага і може бути легко відстежена розробниками, щоб зрозуміти, як було виконано виконання і що не так.
Foundry потребує альтернативного методу реєстрації контрактів. Хоча можна вручну встановити та імпортувати Hardhat і встановити контракт консолі, найкращим способом буде скопіювати спеціалізований контракт консолі у ваш проект.
Особливо у випадку тестових файлів, контракт DSTest, що входить до складу, включає події журналу, такі як logstring, logint та logaddress, які можуть бути виведені без будь-яких додаткових залежностей.
Методики тестування
Досвід тестування є, мабуть, найпомітнішою відмінністю між цими двома фреймворками.
Підхід до тестування Hardhat
Hardhat базується на стандартних шаблонах тестування JavaScript:
- •Використовує блоки describe та it разом із Mocha як бібліотекою тверджень за замовчуванням
- •Тестові файли можуть нагадувати цей більш природний стиль розробників, які знайомі з веб-розробкою
- •Пропонує описові назви тестів, які чітко вказують на їх призначення
- •Звичні асинхронні шаблони
- •Крива навчання мінімальна для тих, хто вже знайомий із сучасною веб-розробкою
Підхід до тестування Foundry
Foundry працює зовсім по-іншому:
- •Тести розробляються як смарт-контракти Solidity, які успадковують DSTest
- •Усі тести мають префікс test або testFail
- •Усі твердження робляться через успадкований контракт DSTest
- •Тестові файли — це справжні смарт-контракти, які використовуються для тестування
Опануйте тестування смарт-контрактів
Порівняйте фреймворки та виберіть найкращий підхід до тестування для вашого проєкту.
Метод Foundry має ряд наслідків:
- •Тестові контракти повинні бути інстанційовані в процедурі setUp(), аналогічній beforeEach в JavaScript-клієнтах
- •Розподіл методів контракту ETH передбачає певний синтаксис із параметрами значень, укладеними в фігурні дужки
- •Початкова крута крива навчання може бути компенсована тим, що не потрібно обробляти асинхронні операції
Функції тестування Learning Foundry
Foundry вводить поняття, відоме як чіт-коди, які пропонують потужні утиліти для тестування. Це спеціальні функції за визначеною адресою контракту, які дозволяють отримати доступ до стану в блокчейні під час тестування.
Ви можете:
- •Змінити поточний номер блоку
- •Не видавайте себе за інші облікові записи
- •Заявляйте про певну поведінку контракту
Щоб використовувати чіт-коди, ви повинні визначити інтерфейс і створити його як змінну стану для спеціальної адреси чіту. Після налаштування можна використовувати такі функції, як:
- •vm.prank(), щоб встановити наступний виклик контракту іншому одержувачу
- •vm.roll() для просування блокчейну до певної точки
Одним з найцікавіших чіт-кодів є vm.expectRevert(), який потрібно викликати перед транзакцією, яку ви хочете зірвати. Це інвертування стандартних шаблонів тверджень може бути неінтуїтивним, але воно дає чіткий контроль над ймовірними умовами збою.
Результати порівняння продуктивності
Різниця в продуктивності між фреймворками є значною і відразу помітною. На однакових контрактах і тестових сценаріях я отримав показові результати щодо часу компіляції та виконання тестів:
Результати порівняння продуктивності
| Сценарій | Foundry | Каска |
|---|---|---|
| Очистіть проекти (без кешу) | 1,44 секунди | 5,17 секунди |
| З увімкненим кешуванням | 0,45 секунди | 3,98 секунди |
| 26 проектів смарт-контрактів | 8,53 секунди | 14,56 секунди |
Ці відмінності в продуктивності стають більш вираженими при збільшенні складності проекту.
Тестування Foundry: переваги та недоліки
Переваги та недоліки тестування Foundry
| Переваги | Мінуси |
|---|---|
| Не використовуйте асинхронні/очікувані складні оператори | Назви тестів не є такими описовими, як у тестах JavaScript |
| Тести виконуються дуже швидко | Очікування твердження Revert є неінтуїтивним. |
| Автоматично згенерований звіт про газ | Крива навчання для чіт-кодів |
| Все, що написано в Solidity | Інструменти розгортання все ще розробляються |
Переваги продуктивності важко заперечити, а назви тестів Solidity не можуть бути такими ж описовими, як назви тестів JavaScript, що може ускладнити розуміння мети тесту. Система чіт-кодів, хоч і є потужною, вимагає початкових витрат на навчання.
Стратегії розгортання контрактів
Розгортання — це одна з областей, де Hardhat на даний момент має кращий досвід розробки. Фреймворк підтримує:
- •Скрипти розгортання на основі JavaScript
- •З'єднання з різними мережами
- •Завантажуйте конфігурацію через змінні середовища
- •Вміло вирішуйте складні ситуації, пов'язані з розгортанням
Наразі в Foundry потрібні скрипти розгортання на основі JavaScript, але вони можуть бути громіздкими, коли конструктори повинні мати свої аргументи. Пропоноване рішення полягає в розробці скриптів розгортання bash для обробки складності розгортань, але команда розробників зараз працює над розробкою більш просунутих рішень для розгортання.
Це одна з найсерйозніших сучасних слабких сторін Foundry порівняно з Hardhat, який має розвинену екосистему розгортання.
Інструменти командного рядка
Foundry має інструмент CLI cast для взаємодії з блокчейном і запитування смарт-контрактів. Це потужна утиліта, яка дозволяє:
- •Викликайте функції контракту
- •Запит стану блокчейну
- •Виконуйте ряд дій з блокчейном у командному рядку
Хоча cast забезпечує повну функціональність взаємодії з блокчейном, для виконання складних операцій необхідна складна конструкція командного рядка. Як і в разі розгортання, для цього може знадобитися скрипт bash, щоб уникнути багаторазового введення довгих команд.
Підсумок порівняння фреймворків
Порівняння функцій фреймворків
| Особливість | Foundry | Каска |
|---|---|---|
| Встановлення | За допомогою команди CLI curl | Не потрібно з npx або через npm |
| Інструменти CLI | forge для управління проектом, cast для взаємодії з контрактами | hardhat управляйте проектом (створюйте/компілюйте/запускайте скрипти) |
| Створіть і протестуйте продуктивність | Виняткова швидкість | Помірна продуктивність |
| Залежності | Підмодулі Git | пакети npm |
| Конфігурація | foundry.toml | hardhat.config.js |
| Ізоляція тесту | Так, за допомогою -match-test -match-contract | Так, тільки через або пропустити в тестових файлах |
| Розгортання контрактів | За допомогою інструменту Cast CLI | Скрипти на основі JavaScript |
Зробити правильний вибір
Foundry демонструє величезний потенціал завдяки своїй видатній продуктивності, активній спільноті та креативному методу тестування смарт-контрактів. Структура чудово підходить для швидкого циклу розробки і має чудові утиліти для тестування, які можуть значно прискорити розробку після того, як ви зрозумієте, як ними користуватися.
Тим не менш, Foundry все ще розвивається, особливо в області інструментів розгортання та вдосконалення досвіду розробників. Foundry має кілька цікавих переваг для тих розробників, які віддають перевагу гібридній моделі з:
- •Foundry для розробки та тестування контрактів
- •Hardhat для розгортання та скриптів
Користувачі, які більше звикли до стандартних інструментів JavaScript та усталених практик розгортання, можуть бути більш продуктивними з Hardhat зараз, хоча рішення знову залежить від вашого досвіду та здатності освоїти нові інструменти.
Обидві архітектури все ще швидко змінюються, а екосистема розробки смарт-контрактів має безліч життєздатних альтернатив, що задовольняють потреби різних розробників і випадків застосування.


