Solidity : Hardhat 도입 후기

개요

jeff lee
6 min readJan 29, 2021

이 글은 solidity, remix, erc20 등 기본적인 이더리움 개발에 대한 지식이 있는 독자를 위해, 최근에 도입한 hardhat을 소개하는 목적을 위해 작성되었다.

기존에 dApp 개발을 할 때는 Truffle을 주로 사용했다. Truffle은 solitiy 개발을 할 때 많은 부분을 도와주는 개발 도구로, 테스트 환경 구축, 배포 등 다양한 기능을 제공한다.

Truffle의 불편함

그러나 Truffle에는 아래와 같은 문제가 있었다

  1. 검증, 즉 Verify 과정이 불편하다. 검증이란 배포된 컨트랙트를 이더스캔에서 이용할 수 있도록 하는 과정을 의미한다. 앱을 개발할 때 다른 개발자들이 서버를 통하지 않고 단순하고 직관적으로 컨트랙트를 이용하기 위해서는 이더스캔을 이용하는 것이 가장 편리하다.
이더스캔에서 컨트랙트 주소를 검색해서 찾아가면, 메타마스크 등 지갑 어플리케이션을 이용하여 손쉽게 컨트랙트와 상호작용이 가능하다.

그러나 컨트랙트를 배포하고 검증 과정을 거치지 않으면 Read, Write Contract 기능이 활성화되지 않는다. Truffle은 검증 자동화를 도와주지 않기 때문에 컨트랙트 bytecode를 통해 직접 검증 작업을 거쳐야 한다. 경우에 따라 flatten, 즉 import 한 파일을 하나로 합쳐야 하기도 한다. truffle-flattener라는 패키지가 있지만, 컨트랙트 하나를 배포할 때마다 이 작업을 해야 하는 것은 상당히 번거롭다.

2. Typescript에 대한 지원이 빈약하다. 여타 다른 자바스크립트 개발도 마찬가지이지만, 특히 solidity 개발을 할 때는 type을 정의하고 체크할 수 있는 것은 매우 큰 장점이다. bigNumber, uint, keccak256 등 solidity에서 작동하는 변수의 타입과 자바스크립트에서 이를 받아들이는 방식이 약간씩 다르기 때문이다. 따라서 테스트코드 작성 및 배포 작업에서 typescript를 이용한 정적인 타이핑을 지원하지 않는 것이 불편하게 느껴졌다.

Truffle에도 좋은 도구와 기능이 많이 있고, 아직 다 사용해보진 않았지만, 구글 검색 결과 hardhat에 대해 좋게 보는 글이 많아서 도입해보았고, 이에 대한 후기를 작성한다.

hardhat도입 후기 및 느낀점

  1. hardhat 플러그인인 Typechain 및 타입스크립트 사용에 따른 편리성

Typechain은 hardhat에서 지원하는 플러그인 중 하나로, 컴파일과 동시에 .sol 파일을 타입스크립트로 된 artifact로 만들어준다.

Typescript artifact로 생성된 컨트랙트. 각 함수의 인자와 리턴값의 타입을 명시하여 나타낸다.

이렇게 만들어진 아티팩트는 다른 곳에 import 하여 아래와 같이 테스트코드에 사용할 수도 있고, Web3.js 등 프론트엔드 개발에 있어서 컨트랙트 ABI로 접근을 하지 않고도 사용할 수 있도록 도와준다.

eController 라는 컨트랙트 인스턴스의 hasRole 함수에 대한 arguments와 return 타입을 명시해준다. 기존에 자바스크립트로 테스트코드를 작성할 때 보다 훨씬 편리하다.

이러한 타입의 명시는 코드 작성 및 디버깅을 쉽고 빠르게 만들어준다.

2. Verify의 자동화

배포한 컨트랙트에 대해 배포된 주소만 입력하면 알아서 verify를 시켜줄 수 있다. etherscan api key를 설정하는 정도의 가장 간단한 절차만 거치면 이더스캔에 직접 접속하지 않아도 명령어 한 줄로 간단히 verify 작업이 가능하다.

게다가 NodeJs의 child_process를 이용하면 이 과정마저도 자동화시킬 수 있다.(배포 및 deploy 자동화 프로세스는 추후 작성 예정)

3. Console.log의 사용

.sol 파일에 console.log을 적용하여 자바스크립트 개발을 할 때 처럼 개발 할 수 있다. dApp 개발의 진입장벽을 낮추고 개발의 편의성을 올려주기 위한 hardhat팀의 아이디어가 돋보이는 기능이다.

solidity가 자바스크립트의 문법과 비슷해 보이면서도 다른 점이 많아서 코드 작성 및 테스트를 할 때 헤맬 때가 많았는데, console.log를 찍어보는 작업을 미리 할 수 있었더라면 조금 더 편리하게 개발을 할 수 있지 않았을까 싶다. 물론 지금도 편리하게 이용하고 있다.

https://hardhat.org/getting-started/#quick-start
이렇게 컨트랙트 안에 console.log를 사용할 수 있다. 문자열 formatting도 지원한다. https://hardhat.org/getting-started/#quick-start

4. Documentation이 잘 되어있다.

Compile, Deploy, test 등 여러 과정에 대해서 나타날 수 있는 오류에 대해 로그가 잘 나타나며, 에러 코드에 대한 공식 문서도 잘 나타나있다. Truffle을 이용할 때는 문서에 잘 나와있지 않아 종종 node_module를 들여다보며 에러 코드를 찾기도 했으나, hardhat을 이용한 뒤부터는 공식 문서를 통해 웬만한 문제는 해결이 가능해졌다. 이외에도 openzeppelin 등 여러 다른 팀들도 hardhat에 대한 언급을 자주 하며, 관련된 문서를 잘 제공한다.

이 외에도 빠른 테스트 환경, 손쉬운 upgrade proxy 제공, 테스트 커버리지, 테스트 환경에서의 가스 리포터, 리액트 핫 리로더 등 다양한 플러그인을 통한 장점이 있다.

앞으로의 글 작성 방향

hardhat과 vscode, typescript를 이용하여 solidity 개발 튜토리얼을 작성하고자 한다. 많은 튜토리얼이 Remix, Truffle을 기초로 하지만, hardhat을 써보니 소개하지 않을 수 없는 개발 도구이더라.

단순한 토큰 발행이 아닌, hardhat의 여러 플러그인을 소개할 수 있고 더 나아가 최근 떠오르는 chainlink price feed까지 이용할 수 있는 컨트랙트를 만들어 볼 예정이다.

--

--

jeff lee

Blockchain developer, SNU College of Pharmacy, DecipherGlobal