실제로 사용해본적은 딱 한번 있었다. (NFT mint하는 프로젝트)
그 당시엔 그냥 사용했지만, 프로젝트했던 기억을 더듬어 자세히 개념정리를 하고, 방법을 단계별로 정리하고자 글을 쓴다.
🍀 Hardhat이란?
- Truffle과 유사한 이더리움 dApp개발 도구
(Smart Contract 작성, 컴파일, 테스트, 배포 도구) - Builder라는 이름으로 사용되었으나, 현재 HardHat으로 변경
- node에서 동작하며 npm,yarn 으로 설치함
- web3.js가 아닌 ethers.js를 사용함
- ⭐️ Truffle과는 다르게 내부적으로 Ganache와 같은 가상 이더리움 네트워크(즉시 실행되는 내부(in-process)가상 이더리움 네트워크)를 제공해서 단위 테스트를 실행할 때 Ganache가 필요하지 않다.
🍀 Truffle의 단점
- 검증(=Verify 과정)이 불편하다.
(* 검증이란? 배포된 컨트랙트의 source code를 etherscan에 업로드하여 컨트랙트와 상호작용 할 수 있도록 하는 과정)
개발할 때 개발자들이 서버를 통하지 않고 단순,직관적으로 컨트랙트를 이용하기 위해서 이더스캔을 이용하는 것이 가장 편리하다.
(이더스캔에서 컨트랙트 주소를 검색해서 찾아가면, 메타마스크 등 지갑 어플리케이션을 이용하여 손쉽게 컨트랙트와 상호작용이 가능하다.)
그러나 컨트랙트를 배포하고 검증 과정을 거치지 않으면 Read, Write Contract 기능이 활성화되지 않는다.
Truffle은 검증 자동화를 도와주지 않기 때문에 컨트랙트 bytecode를 통해 직접 검증 작업을 거쳐야 한다.
경우에 따라 flatten, 즉 import 한 파일을 하나로 합쳐야 하기도 한다.
truffle-flattener라는 패키지가 있지만, 컨트랙트 하나를 배포할 때마다 이 작업을 해야 하는 것은 상당히 번거롭다. - Typescript 지원을 하지않는다
bigNumber, uint, keccak256 등 solidity에서 작동하는 변수의 타입과 자바스크립트에서 이를 받아들이는 방식이 약간씩 다르기 때문이다. (type을 정의하고 체크할 수 있는 것)
따라서 테스트코드 작성 및 배포 작업에서 typescript를 이용한 정적인 타이핑을 지원하지 않는다
🍀 Hardhat의 장점
1. Verify의 자동화
Etherscan에 직접 접속하지 않아도 명령어로 verify 작업이 가능하다.
hardhat의 verify를 이용해서 스크립트를 작성하면, 연관되어 있는 컨트랙트의 deploy와 verify를 하나의 명령어로 진행 할 수도 있다.
🔅Hardhat의 Verify를 하는 방법 (추가 정리예정)
npx hardhat verify YOUR_CONTRACT_ADDRESS --network networkName
2. hardhat 플러그인인 Typechain을 이용해서 타입스크립트를 사용 가능
Typechain은 hardhat에서 지원하는 플러그인 중 하나로, 컴파일과 동시에 .sol 파일을 타입스크립트로 된 artifact로 만들어준다.
이렇게 만들어진 아티팩트는 다른 곳에 import 하여 테스트코드에 사용할 수도 있고, dApp 개발 환경에서 컨트랙트 ABI로 접근을 하지 않고도 사용할 수 있도록 도와준다.
컨트랙트 타입을 사용함으로써 코드 작성 및 디버깅을 쉽고 빠르게 만들어준다.
3. Console.log 사용 가능
솔리디티 파일에서 console.log을 사용할 수 있기 때문에 기존 자바스크립트 개발과 비슷한 환경에서 개발할 수 있다.
dApp 개발의 진입장벽을 낮추고 개발의 편의성을 올려주기 위한 hardhat팀의 아이디어가 돋보이는 기능이다.
solidity가 자바스크립트의 문법과 비슷해 보이면서도 다른 점이 많아서 코드 작성 및 테스트를 할 때 헤맬 때가 많았는데, console.log를 사용함으로써 간단하게 디버깅을 할 수 있게 되었다.
4. 잘 작성된 Documentation
Compile, Deploy, test 등 여러 과정에 에러 코드에 대한 공식 문서가 잘 작성되어 있다.
Truffle을 이용할 때는 문서에 잘 나와있지 않아 node_module를 들여다보며 에러 코드를 찾았다고 했으나, hardhat을 이용한 뒤부터는 공식 문서를 통해 웬만한 문제는 해결이 가능해졌다고 한다.
🍀 Hardhat 초기 설정
1. npm install -D hardhat을 터미널에 넣어 설치한다.
Hardhat은 프로젝트의 로컬 설치를 통해 사용됩니다. 이렇게 하면 환경을 재현할 수 있고 향후 버전 충돌을 피할 수 있습니다.
Hardhat의 로컬 설치를 사용하려면 를 사용 npx하여 실행해야 합니다 (예: npx hardhat)
(* 비쥬얼 스튜디오의 터미널 여는 단축키는(command+j))
설치가 완료되면,
2. npx hardhat을 넣어 보일러플레이트를 설치한다.
(상황에 맞게 선택사항을 선택하여 엔터 누르면 완료)
JavaScript 또는 TypeScript 프로젝트를 만들고 다음 단계를 통해 샘플 계약을 컴파일, 테스트 및 배포해 보겠습니다.
TypeScript 사용을 권장하지만 익숙하지 않은 경우 JavaScript를 선택하십시오.
contracts
- 스마트 컨트랙트 코드(.sol)을 관리하는 곳
- contracts디텍토리에 Contract 파일을 작성
- 작성한 Contract는 npx hardhat compile 명령어를 통해 compile 할 수 있으며, 이때 compile된 Contract는 artifacts/contracts/경로에 저장된다.
scripts (truffle에서 migrations 역할)
- 스마트 컨트랙트 배포를 관리합니다
test
- 테스트 코드를 관리함
.gitignore
- 추가 정리할 예정
hardhat.config.js
- 초기 설정 (solidity의 version settings , 네트워크 추가, 세팅)
- 버전 설정 및 초기 실행시 기본적으로 실행할 값들 지정 가능.
artifacts, cache
- 컴파일 결과를 관리
package.json
- 명령어로 생성한 프로젝트가 라이브러리들과 의존성을 가지는지 알 수 있다.
process.env
- 환경변수를 가져옴
- hardhat은 프로젝트 생성할때, .env를 생성한다
npx hardhat accounts 명령어를 통해 hatdhat의 내부 가상 이더리움 네트워크의 계정을 확인할 수도 있다.
🔅참고 자료
https://hardhat.org/hardhat-runner/docs/guides/project-setup
https://jbzang2000.medium.com/solidity-hardhat-%EB%8F%84%EC%9E%85-%ED%9B%84%EA%B8%B0-5a6174612a9
'5. Blockchain' 카테고리의 다른 글
[Wagmi] Connect Wallet 방법 (0) | 2022.09.11 |
---|---|
[Wagmi] 개념 및 사용방법 (0) | 2022.09.08 |
[Ethereum] EIP-1559 (0) | 2022.07.18 |