Hardhat vs Foundry: выбор подходящего инструмента для разработки на Ethereum

Вот некоторые факторы, которые стоит учесть при выборе между Hardhat и Foundry.

5 мин чтения
Hardhat vs Foundry: выбор подходящего инструмента для разработки на Ethereum

Выбор правильных инструментов для разработки dapp влияет не только на производительность, но и на эффективность тестирования, развёртывания и сопровождения смарт-контрактов. В этом блоге мы сравниваем два популярных инструмента среди разработчиков Ethereum dapp: Foundry и Hardhat, уделяя особое внимание требованиям к установке, рабочим процессам тестирования и развёртывания, а также конкретным техническим аспектам и ограничениям.

О Hardhat

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

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

О Foundry

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

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

Техническое сравнение Hardhat и Foundry

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract RandomSum {
    // Function to generate a pseudo-random number based on input
    function random(uint seed) private view returns (uint) {
        return uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % 100;
    }

    // Function to generate two random numbers and return their sum
    function generateSum() public view returns (uint sum) {
        uint num1 = random(1);
        uint num2 = random(2);
        sum = num1 + num2;
    }
}
Копировать

Установка:

Hardhat:

Чтобы начать использовать Hardhat, на вашем компьютере должен быть установлен Node.js. После его настройки вы можете создать новый проект Hardhat, выполнив следующие шаги:

  1. Инициализируйте новый проект Node.js:

mkdir randomsum
cd randomsum
npm init -y
Копировать
  1. Установите Hardhat:

npm install --save-dev hardhat
  1. Создайте проект Hardhat:

npx hardhat
  1. Следуйте подсказкам для создания базового проекта. Выберите «Create an empty hardhat.config.js» для минимальной настройки. Выберите создание примера проекта. Это настроит среду Hardhat со всеми необходимыми конфигурациями.

Контракт: поместите ваш контракт RandomSum в папку contracts.

Foundry

Foundry использует Rust, поэтому на вашей системе должен быть установлен Rust. После установки Rust вы можете установить Foundry, выполнив:

  1. Установите Foundry:

curl -L <https://foundry.paradigm.xyz> | bash
foundryup
Копировать
  1. Инициализируйте новый проект Foundry:

forge init randomsum-foundry
cd randomsum-foundry
Копировать

Контракт: поместите ваш контракт RandomSum в директорию src.

Развёртывание в локальном блокчейне

Hardhat

  • Локальный блокчейн: используйте Hardhat Network, которая запускается автоматически при выполнении таких задач, как тестирование или развёртывание контрактов.

  • Скрипт развёртывания: создайте скрипт в scripts/deploy.js:

async function main() {
    const RandomSum = await ethers.getContractFactory("RandomSum");
    const randomSum = await RandomSum.deploy();
    await randomSum.deployed();
    console.log("RandomSum deployed successfully:");
}

main().catch((error) => {
    console.error(error);
    process.exit(1);
});
Копировать
  • Запуск развёртывания: выполните развёртывание с помощью:

npx hardhat run scripts/deploy.js --network localhost

Foundry

  • Локальный блокчейн: Foundry использует anvil — локальный узел Ethereum. Запустите его в отдельном терминале для старта локального узла.

anvil
  • Скрипт развёртывания: используйте команду forge create напрямую:

forge create RandomSum --private-key YOUR_PRIVATE_KEY --rpc-url

Развёртывание в живой тестовой сети

Hardhat

  • Конфигурация сети: настройте нужную сеть в hardhat.config.js, добавив раздел с параметрами сети (например, Sepolia).

module.exports = {
  solidity: "0.8.0",
  networks: {
    sepolia: {
      url: "https://linea-sepolia.infura.io/v3/YOUR_INFURA_KEY",
      accounts: [`0x${process.env.PRIVATE_KEY}`]
    }
  }
};
Копировать
  • Развёртывание: запустите тот же скрипт развёртывания, изменив параметр сети на Sepolia.

Foundry

  • Конфигурация сети: дополнительный файл конфигурации не требуется; укажите сеть в команде.

  • Развёртывание: используйте:

forge create RandomSum --private-key YOUR_PRIVATE_KEY --rpc-url

Тестирование смарт-контрактов

Hardhat

  • Написание тестов: создайте файл тестов в test/randomSum.js на JavaScript:

const { expect } = require("chai");

describe("RandomSum", function() {
  it("Should return the sum of two random numbers", async function() {
    const RandomSum = await ethers.getContractFactory("RandomSum");
    const randomSum = await RandomSum.deploy();
    await randomSum.deployed();

    const sum = await randomSum.generateSum();
    expect(sum).to.be.a('number');
  });
});
Копировать
  • Запуск тестов: выполните с помощью:

npx hardhat test

Если у вас возникнут проблемы с тестированием, просто добавьте функцию loadFixture из @nomicfoundation/hardhat-toolbox/network-helpers.

Основные преимущества использования loadFixture:

  • Создаёт чистую среду для каждого теста, откатываясь к снимку состояния.

  • Эффективнее повторного развёртывания контрактов для каждого теста.

  • Позволяет использовать общий код настройки в нескольких тестах.

Foundry

  • Написание тестов: добавьте файл тестов в test/RandomSum.t.sol на Solidity:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "ds-test/test.sol";
import "../src/RandomSum.sol";

contract RandomSumTest is DSTest {
  RandomSum randomSum;

  function setUp() public {
    randomSum = new RandomSum();
  }

  function testGenerateSum() public {
    uint sum = randomSum.generateSum();
    assertTrue(sum >= 0 && sum <= 198); // since each random number is <100
  }
}
Копировать
  • Запуск тестов: используйте:

forge test

Заключение

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

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

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

Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.

Оцените перевод