Hardhat vs Foundry: Escolhendo a Ferramenta Certa para Desenvolvimento Ethereum

Aqui estão algumas coisas a considerar ao escolher entre Hardhat e Foundry.

5 min de leitura
Hardhat vs Foundry: Escolhendo a Ferramenta Certa para Desenvolvimento Ethereum

A escolha das ferramentas certas para o desenvolvimento do seu dapp não afeta apenas a produtividade, mas também impacta a eficácia dos testes, da implantação e da manutenção de smart contracts. Neste blog, comparamos duas opções populares entre os desenvolvedores de dapps Ethereum: Foundry e Hardhat, com foco nos requisitos de instalação, fluxos de trabalho de teste e implantação, além de aspectos técnicos específicos e limitações.

Sobre o Hardhat

O Hardhat é um ambiente de desenvolvimento consolidado, projetado para ajudar desenvolvedores a gerenciar e automatizar tarefas envolvidas no desenvolvimento de smart contracts. É conhecido pela sua natureza flexível e adaptável. O Hardhat conta com a Hardhat Network, uma rede Ethereum local desenvolvida para fins de desenvolvimento, que também facilita testes, implantação e depuração.

Os desenvolvedores podem interagir diretamente com smart contracts implantados na Hardhat Network por meio de um console interativo, oferecendo um ambiente local abrangente e adaptado para tarefas de desenvolvimento. O Hardhat também oferece suporte a um robusto ecossistema de plugins, permitindo que os desenvolvedores ampliem suas capacidades com facilidade. No entanto, alguns usuários podem achar a configuração inicial do Hardhat complexa.

Sobre o Foundry

Por outro lado, o Foundry é um toolkit de desenvolvimento relativamente novo que prioriza velocidade e confiabilidade. Ele é construído sobre o Forge, um poderoso framework de testes que permite aos desenvolvedores escrever, compilar e testar smart contracts de forma eficiente. Um dos principais diferenciais do Foundry são suas capacidades de teste rápido, já que o framework de testes Forge acelera significativamente os tempos de execução dos testes, permitindo que os desenvolvedores iterem com mais agilidade.

Além disso, o Foundry inclui ferramentas nativas de depuração que ajudam os desenvolvedores a diagnosticar e corrigir problemas diretamente no ambiente. O Foundry também se integra perfeitamente a outras ferramentas do ecossistema Ethereum, facilitando um processo de desenvolvimento mais fluido. No entanto, por ser relativamente novo, o Foundry pode não contar com o mesmo suporte comunitário extenso disponível para ferramentas mais consolidadas.

Comparação técnica entre Hardhat e Foundry

Para esta seção, utilizaremos um smart contract básico de soma aleatória. Esse smart contract será o mesmo para o Hardhat e o Foundry; no entanto, a configuração do projeto diferirá ligeiramente entre os dois frameworks.

// 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;
    }
}
Copiar

Instalação:

Hardhat:

Para começar a usar o Hardhat, você precisa ter o Node.js instalado na sua máquina. Com isso configurado, você pode criar um novo projeto Hardhat seguindo estas etapas:

  1. Inicialize um novo projeto Node.js:

mkdir randomsum
cd randomsum
npm init -y
Copiar
  1. Instale o Hardhat:

npm install --save-dev hardhat
  1. Crie um projeto Hardhat:

npx hardhat
  1. Siga as instruções para criar um projeto básico. Selecione "Create an empty hardhat.config.js" para uma configuração mínima. Escolha criar um projeto de exemplo. Isso configura um ambiente Hardhat com todas as configurações necessárias.

Contrato: Coloque seu contrato RandomSum na pasta contracts.

Foundry

O Foundry usa Rust, portanto você precisará ter o Rust instalado no seu sistema. Com o Rust pronto, você pode instalar o Foundry executando:

  1. Instale o Foundry:

curl -L <https://foundry.paradigm.xyz> | bash
foundryup
Copiar
  1. Inicialize um novo projeto Foundry:

forge init randomsum-foundry
cd randomsum-foundry
Copiar

Contrato: Coloque seu contrato RandomSum no diretório src.

Implantação em blockchain local

Hardhat

  • Blockchain local: Use a Hardhat Network, que é executada automaticamente quando você realiza tarefas como testes ou implantação de contratos.

  • Script de implantação: Crie um script em 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);
});
Copiar
  • Executar a implantação: Execute a implantação usando:

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

Foundry

  • Blockchain local: O Foundry usa o anvil, um nó Ethereum local. Execute-o em um terminal separado para iniciar seu nó local.

anvil
  • Script de implantação: Use o comando forge create diretamente:

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

Implantação em testnet ativa

Hardhat

  • Configuração de rede: Configure a rede desejada no hardhat.config.js, adicionando uma seção para as configurações de rede (ex.: 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}`]
    }
  }
};
Copiar
  • Implantação: Execute o mesmo script de implantação com a opção de rede alterada para Sepolia.

Foundry

  • Configuração de rede: Nenhum arquivo de configuração adicional é necessário; especifique a rede diretamente no comando.

  • Implantação: use:

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

Testes de Smart Contract

Hardhat

  • Escreva os testes: Crie um arquivo de teste em test/randomSum.js usando 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');
  });
});
Copiar
  • Execute os testes: Execute usando:

npx hardhat test

Se você encontrar problemas com os testes, basta adicionar a função loadFixture de @nomicfoundation/hardhat-toolbox/network-helpers.

Os principais benefícios de usar o loadFixture são:

  • Ele configura um ambiente limpo para cada teste revertendo para um snapshot.

  • É mais eficiente do que reimplantar contratos para cada teste.

  • Permite compartilhar o código de configuração entre múltiplos testes.

Foundry

  • Escreva os testes: Adicione um arquivo de teste em test/RandomSum.t.sol usando 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
  }
}
Copiar
  • Execute os testes: Use:

forge test

Conclusão

A escolha entre Hardhat e Foundry geralmente depende das habilidades da equipe e das necessidades específicas do projeto. Se a equipe tem proficiência em JavaScript e precisa de ampla integração com tecnologias web, o Hardhat pode ser a melhor escolha. Seu robusto ecossistema de plugins e ambiente flexível o tornam ideal para projetos que exigem um alto grau de personalização e interação com diversas tecnologias web.

Por outro lado, se o projeto demanda ciclos de desenvolvimento rápidos com foco exclusivo em smart contracts, o Foundry oferece uma opção atraente e eficiente que mantém tudo dentro do ecossistema Solidity. Sua velocidade e suporte nativo ao Solidity podem aumentar significativamente a produtividade de equipes dedicadas ao desenvolvimento de smart contracts.

Em última análise, ambas as ferramentas têm seus pontos fortes, e a escolha certa depende dos requisitos únicos do seu projeto e da expertise da sua equipe.

Traduzido por IA. Pode conter erros. Por favor, verifique sempre as informações.

Avalie a tradução