엘리시아가 스마트 컨트랙트 개발 프레임워크를 Truffle 에서 hardhat 으로 옮긴 후기다. Truffle 의 불편함 두 가지를 먼저 짚고, hardhat 이 그것을 어떻게 해결하는지와 Typechain 플러그인으로 TypeScript 를 쓰는 방법으로 이어진다.
핵심 포인트- Truffle 의 불편함 ①: 검증(Verify)이 번거롭다. 배포한 컨트랙트를 etherscan 에 올려야 Read/Write Contract 기능이 활성화되는데, Truffle 은 이를 돕지 않아 직접 소스를 업로드해야 한다.
- 경우에 따라 import 한 파일을 하나로 합치는 flatten 도 필요하다. `truffle-flattener` 가 있지만 컨트랙트를 배포할 때마다 반복하는 것은 부담이다.
- Truffle 의 불편함 ②: TypeScript 지원이 빈약하다. bigNumber·uint·keccak256 같은 solidity 타입을 자바스크립트가 받아들이는 방식이 조금씩 달라 정적 타이핑이 아쉬웠다.
- hardhat 의 이점 ①: Verify 자동화. 명령어 한 줄로 검증되고, 스크립트를 쓰면 연관된 여러 컨트랙트의 deploy 와 verify 를 한 번에 진행할 수 있다.
- hardhat 의 이점 ②: Typechain 플러그인이 컴파일과 동시에 `.sol` 을 TypeScript artifact 로 만들어 준다.
상세 정리- 글 앞에 수정 공지가 붙어 있다. `hardhat-typechain` 대신 `@typechain/hardhat` 을 써야 하며, 전자를 쓰면 module 을 찾을 수 없다는 에러가 날 수 있다. hardhat 공식 문서에는 아직 반영되지 않은 사항이다.
- 검증의 의미를 예시로 설명한다. uniswap 의 wBTC-Eth pair 컨트랙트처럼 검증된 컨트랙트는 웹 앱 없이 etherscan 에서 직접 쓸 수 있다.
- hardhat 은 compile·deploy·test 를 모두 진행할 수 있는 이더리움 개발 프레임워크로 node 에서 동작하며 npm 으로 설치한다.
- Typechain 산출물의 쓰임: 테스트 코드에 import 해 쓸 수 있고, dApp 개발 환경에서 컨트랙트 ABI 로 접근하지 않고도 쓸 수 있어 작성과 디버깅이 빨라진다.
- 이점 ③ `console.log`: solidity 파일에서 쓸 수 있어 자바스크립트 개발과 비슷한 환경이 된다. 진입 장벽을 낮추려는 hardhat 팀의 의도가 보이는 기능이라고 평가한다.
- 저자는 solidity 가 자바스크립트 문법과 비슷해 보이면서도 다른 점이 많아 헤맸는데 이 기능으로 간단히 디버깅하게 됐다고 밝힌다.
- 이점 ④ 문서화: compile·deploy·test 과정의 오류 로그가 잘 나오고 에러 코드 공식 문서도 정리돼 있다. Truffle 때는 문서에 없어 `node_modules` 를 뒤져 에러 코드를 찾기도 했다.
- OpenZeppelin 등 다른 팀들도 hardhat 을 자주 언급하며 관련 문서를 잘 제공한다는 점도 생태계 이점으로 든다.
- 그 밖의 지원으로 빠른 테스트 환경, 손쉬운 upgrade proxy, 테스트 커버리지, 테스트 환경 가스 리포터, 리액트 핫 리로더 플러그인을 나열한다.
- 도입 동기도 솔직하다. Truffle 에도 좋은 도구가 많고 다 써 본 것은 아니지만, 검색 결과 hardhat 을 좋게 보는 글이 많아 도입해 봤다고 밝힌다.
왜 읽나Truffle 로 컨트랙트를 개발하며 검증과 타입 지원에 불편을 느낀 개발자에게, hardhat 으로 옮겼을 때 실제로 무엇이 달라지는지 항목별로 알려준다.