Hardhat으로 스마트컨트랙트 테스트 하기

Glen·2022년 9월 6일
0
post-thumbnail

Hardhat

  • https://hardhat.org/

  • 트러플과 유사한 dapp 개발도구

  • 기능 : 컨트랙트 작성, 컴파일, 테스트, 배포

  • 내부 가상 이더리움 가지고 있음. 단위테스트 가능 (가나슈 필요없음)

    • hardhat-waffle,chai
  • web3.js 대신 ethers.js를 사용함


설치 및 실행

필요사항

Node.js

설치

npm install --save-dev hardhat

실행

npx hardhat

node 에러

  • FATAL ERROR: wasm code commit Allocation failed - process out of memory

  • mac m1에서 node버전이 낮아서 발생하는 문제

  • 안전버전

npm install -g n
n stable
  • node active와 install이 맞지 않을때
ln -sf installed경로 active경로

기본 명령어

compile

  • 작성한 컨트랙트 컴파일
npx hardhat compile

  • 아티팩트
  • 컨트랙트를 배포하고 상호작용하는데 필요한 모든 정보가 포함되어있음

    • contractName
    • abi
    • bytecode
    • linkReferences
  • 컴파일할때 자동으로 생성됨.

  • 테스트, 배포 스크립트 작성할때 getContractFactory(“artifacts명”) 가 해당 파일을 참조함.

test

  • 로컬 또는 네트워크에 배포하지 않고 단위 테스트를 진행
npx hardhat test '.\test\sample-test.js'
  • it = 하단에 테스트에 대한 내용 작성하여 실패 성공 여부 확인 가능
  • expect~~.equal = 배포 후 함수 호출에 대한 결과 같을 경우에 true

node

  • 로컬 환경에서 블록체인 네트워크 실행
  • 노드 실행시 10000eth를 갖고있는 20개의 지갑 생성됨. #0~#19(지갑주소는 매번 동일)
  • 블록은 실시간으로 생성되지 않고 컨트랙트를 배포할때 마다 증가함
  • 노드 종료 시 이전 배포 결과에 대해 저장하지 않음

run

  • 작성한 script로 입력한 네트워크에 컨트랙트 배포
    • 배포시 노드에서 확인가능
    • 아래 결과에 나온 주소는 console.log로 작성해서 나오는 결과
  • 로컬 네트워크에 컨트랙트 배포

  • 배포 시 node 결과

console

  • 대화형 자바스크립트 콘솔 지원
  • 네트워크 설정 하여 자바스크립트로 컨트랙트 호출 가능

EtherStore.sol 테스트

  • await ethers.provider.getBalance(address)
  • EtherStore 컨트랙트가 가지고 있는 코인 수량
  • EtherStore deposit 호출(이더전송)
    • await k.deposit({value:10})

hardhat debugging

  • console.log를 사용하여 자유롭게 활용
  • 솔리디티 작성시 import 필요. import "hardhat/console.sol";
  • test, scripts 폴더에서 작성한 자바스크립트에는 import필요 없이 사용

컨트랙트별 배포 주소 변경하기(local network)

  • 취약한 컨트랙트와, 공격자의 컨트랙트의 배포자를 다르게 설정하여야 할때

hardhat.config.js

  • account에 privatekey 입력

배포 스크립트

  • getContractFactory(name, signer Or Options)이므로 signer를 변수로 받아 선언해주면 됨.

  • 배포 결과 확인

참고

profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글