본문 바로가기
시작/TIL(Today I Learned)

230728 - Hardhat

by 백씨네 2023. 7. 28.

 


오늘 내가 배운 것

1. Hardhat

Hardhat이란?

하드햇이란 트리플과 비슷한 역할을 하는 Ethereum smartcontract를 개발, 컴파일, 테스트, 디버깅을 하기 위한 도구이자 프레임워크이다.

1. 설치

# hardhat 기본설치
$ npm init
$ npm install --save-dev hardhat

2. 사용하기

$ npx hardhat

npx를 이용하여 프로젝트를 생성할 수 있다.

JS뿐 아니라 TS에 대한 기본적인 설정이 되어 있는 프로젝트를 생성할 수 있다.

설치가 완료되면 아래와 같은 디렉토리가 생긴다.

 

3. 명령어 확인하기

설치가 완료된 후

$ npx hardhat

명령어를 다시 사용하게 되면 하드햇에서 제공하는 명령어나 옵션을 확인할 수 있다.

사진!!!!!

총 13가지의 명령어가 있고 각 명령어는 아래와 같이 사용한다.

# 초기화
$ npx hardhat clean
$ npx hardhat [명령어]

4. 각 명령어의 역할

  • check : 사용자 정의 확인 작업을 수행한다. hardhat.config 파일에 지정되어 있는 로직을 이용해서 검사할 수 있다.
  • clean : Hardhat의 캐시를 지우고 모든 컴파일된 스마트 컨트랙트를 삭제한다. 프로젝트를 깨끗한 상태로 재설정하는 데 사용한다.
  • compile : 프로젝트의 모든 스마트 컨트랙트를 컴파일한다. 컴파일 과정에서는 스마트 컨트랙트의 소스코드를 EVM 바이트코드로 변환한다.
  • console : Hardhat의 콘솔을 연다. 스마트 컨트랙트와 직접 상호 작용할 수 있다.
  • coverage: 테스트에 대한 코드 커버리지 보고서를 생성한다. 어떤 코드가 테스트 코드에 포함되었는지, 누락되었는지 확인할 수 있다.
  • flatten: 스마트 컨트랙트와 그 종속성을 평면화하여 출력한다. 여러 소스 파일에 걸쳐 분산된 스마트 컨트랙트를 단일 파일 합치는 과정이 있다.
  • gas-reporter:merge : 트랜잭션의 가스사용량을 추적하고 보고하는 도구이다. merge를 통해서 여러 가스보고서를 병합한다.
  • help : 도움말을 출력해 준다. 특정 명령어에 대한 도움말은 "npx hardhat help [명령어]"를 이용한다.
  • node: Hardhat Network위에 JSON-RPC 서버를 시작한다. 이를 이용해서 로컬에서 블록체인 시뮬레이션을 실행할 수 있다.
  • run : 프로젝트를 컴파일한 후 사용자 정의 스크립트를 실행한다.
  • test : test 디렉토리에 지정되어 있는 파일을 이용하여 Mocha테스트를 진행한다.
  • typechain : 컴파일된 스마트 컨트랙트에 대한 Typechain 타이핑을 생성한다. TypeScript에서 타입 안전성을 확보할 수 있다.
  • verify : Etherscan에서 컨트랙트를 점증한다. 컨트랙트가 소스코드와 일치하는지 확인하는 과정이다.

5. 각 옵션의 역할

  • --config : 사용할 Hardhat config 파일을 지정한다. Default로 현재 작업 디렉토리의 hardhat.config를 이용한다.
  • --emoji : hardhat 로그메시지에서 이모티콘을 사용하도록 설정한다.
  • --flamegraph : hardhat작업의 CPU 프로필을 수집하고, 그 결과를 flamegraph 형태로 출력한다.
  • --help : 도움말 메시지를 보여준다.
  • --max-memory : hardhat이 사용할 수 있는 최대 메모리 양을 MB eksdnlfh tjfwjdgksek.
  • --network : 이 옵션은 연결할 Ethereum 네트워크를 설정한다. config 파일에 정의된 네트워크를 이용해야 한다.
  • --show-stack-traces : 에러가 발생했을 때 스택 추적을 보여주도록 설정한다.
  • --tsconfig: 사용할 TypeScript config를 지정한다.
  • --typecheck : script, test의 TS 타입 검사를 활성화한다.
  • --verbose : Hardhat의 상세 로그를 활성화한다.
  • --version : 현재 사용 중인 hardhat의 버전을 출력한다.

6. Hardhat 네트워크 지정하기

// hardhat.config.ts

import { HardhatUserConfig } from "hardhat/config"
import "@nomicfoundation/hardhat-toolbox"

const config: HardhatUserConfig = {
    solidity: "0.8.18",
    networks: {
        ganache: {
            url: "http://127.0.0.1:8545", // Ganache URL
            chainId: 1337,
            accounts: require("./accounts.json").privateKey,
        },
        arbitrum: {
            url: "", // arbitrum-goerli 네트워크 infura
            chainId: 421613,
            accounts: require("./accounts.json").privateKey,
        },
        goerli: {
            url: "", // ethereum-goerli 네트워크 infura
            chainId: 5,
            accounts: require("./accounts.json").privateKey,
        },
    },
}

export default config

hardhat network를 설정하기 위해서 위에 같이 config를 이용하여 네트워크를 관리할 수 있다.

7. Hardhat Scripts

Hardhat에 scripts 디렉토리의 scripts 파일을 이용하여 Ethereum 네트워크와 상호작용을 하거나 컨트렉트 배포와 같은 복잡한 작업을 자동화할 수 있다.

//scripts/deploy.ts

import { ethers } from "hardhat"

async function main() {
    const currentTimestampInSeconds = Math.round(Date.now() / 1000)
    const unlockTime = currentTimestampInSeconds + 60

    const lockedAmount = ethers.parseEther("0.001")

    const lock = await ethers.deployContract("Lock", [unlockTime], {
        value: lockedAmount,
    })

    await lock.waitForDeployment()

    console.log(
        `Lock with ${ethers.formatEther(lockedAmount)}ETH and unlock timestamp ${unlockTime} deployed to ${lock.target}`
    )
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
    console.error(error)
    process.exitCode = 1
})

기본 프로젝트 설치 시 예시로 있는 scripts 파일이다.
배포를 위한 추가적인 scripts를 작성하여 배포를 진행할 수 있다.

8. 배포하기

배포하기 위해서는 run 명령어가 필요하다.

$ npx hardhat run --network goerli scripts/[스크립트파일이름]

#예시
$ npx hardhat run --network goerli scripts/deploy.ts

이러한 과정을 통해서 hardhat을 이용하여 지정해 놓은 goerli 네트워크에 배포를 진행할 수 있게 된다.

댓글