Hardhat vs Foundry: 올바른 이더리움 개발 도구 선택하기

Hardhat와 Foundry 중 선택할 때 고려해야 할 몇 가지 사항입니다.

5분 읽기
Hardhat vs Foundry: 올바른 이더리움 개발 도구 선택하기

Dapp 개발에 적합한 도구를 선택하는 것은 생산성에 영향을 미칠 뿐만 아니라, 스마트 컨트랙트의 테스트, 배포, 유지 관리의 효율성에도 직접적인 영향을 줍니다. 이 블로그에서는 이더리움 dapp 개발자들 사이에서 널리 사용되는 두 가지 도구인 Foundry와 Hardhat을 비교하며, 설치 요구 사항, 테스트 및 배포 워크플로우, 그리고 각 도구의 기술적 특성과 한계를 중점적으로 살펴봅니다.

Hardhat 소개

Hardhat은 스마트 컨트랙트 개발에 필요한 작업을 관리하고 자동화할 수 있도록 설계된 검증된 개발 환경입니다. 유연하고 적응력이 뛰어난 것으로 잘 알려져 있습니다. Hardhat은 개발용으로 설계된 로컬 이더리움 네트워크인 Hardhat Network를 제공하며, 이를 통해 테스트, 배포, 디버깅을 손쉽게 수행할 수 있습니다.

개발자는 인터랙티브 콘솔을 통해 Hardhat Network에 배포된 스마트 컨트랙트와 직접 상호작용할 수 있으며, 개발 작업에 최적화된 포괄적인 로컬 환경을 제공합니다. 또한 Hardhat은 강력한 플러그인 생태계를 지원하여 기능을 손쉽게 확장할 수 있습니다. 다만, 일부 사용자는 Hardhat의 초기 설정 및 구성이 복잡하게 느껴질 수 있습니다.

Foundry 소개

반면, Foundry는 속도와 안정성을 강조하는 비교적 새로운 개발 툴킷입니다. 강력한 테스트 프레임워크인 Forge를 기반으로 구축되어 있으며, 개발자가 스마트 컨트랙트를 효율적으로 작성, 컴파일, 테스트할 수 있도록 지원합니다. Foundry의 핵심 기능 중 하나는 빠른 테스트 능력으로, Forge 테스트 프레임워크는 테스트 실행 시간을 획기적으로 단축시켜 개발자가 더 빠르게 반복 작업을 수행할 수 있게 합니다.

또한 Foundry는 개발자가 환경 내에서 직접 문제를 진단하고 수정할 수 있는 네이티브 디버깅 도구를 포함하고 있습니다. 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을 사용합니다. 별도의 터미널에서 다음 명령어를 실행하여 로컬 노드를 시작하세요.

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

  • 테스트 작성: JavaScript를 사용하여 test/randomSum.js에 테스트 파일을 생성합니다:

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

테스트 중 문제가 발생하면 @nomicfoundation/hardhat-toolbox/network-helpers에서 loadFixture 함수를 추가하세요.

loadFixture 사용의 주요 이점은 다음과 같습니다:

  • 스냅샷으로 되돌려 각 테스트에 대한 깨끗한 환경을 설정합니다.

  • 각 테스트마다 컨트랙트를 재배포하는 것보다 효율적입니다.

  • 여러 테스트에 걸쳐 설정 코드를 공유할 수 있습니다.

Foundry

  • 테스트 작성: Solidity를 사용하여 test/RandomSum.t.sol에 테스트 파일을 추가합니다:

// 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에 대한 네이티브 지원은 스마트 컨트랙트 개발에 전념하는 팀의 생산성을 크게 향상시킬 수 있습니다.

궁극적으로 두 도구 모두 각자의 강점이 있으며, 올바른 선택은 프로젝트의 고유한 요구 사항과 팀의 전문성에 따라 달라집니다.

AI가 번역했습니다. 오류가 있을 수 있습니다. 항상 정보를 확인하시기 바랍니다.

번역 평가하기