[Tech] Hardhat Tutorial

Tech At CHANNEL-iN
@CHANNEL-iN
Published in
10 min readJan 4, 2024

이번시간에는 솔리디티를 사용하는 사람은 누구에게나 유용한 프레임워크 Hardhat 에 대해서 빠르고 쉽게 배워봅시다.

목차

  • Hardhat 이란 무엇일까? 🤔
  • Step by Step 으로 Hardhat 정복하기

1. Hardhat 이란 무엇일까 ?

hardhat은 솔리디티로 작성한 스마트컨트랙트를 — -> Vscode ,코드에디터에서 컴파일, 배포, 디버깅을 할 수 있게 하는 프레임워크입니다.

우리는 리믹스(Remix)라는 사이트에서 컨트랙트를 작성하고 컴파일하고

배포를 했습니다 하지만 불편사항이 여럿 존재했습니다.

굳이 불편하게 웹사이트에서 컨트랙트를 작성하지말고

우리가 친숙하게 사용하는 Vscode에서 사용해보면 어떨까?

그렇게 해서 hardhat이 탄생하게 되었고 Vscode에서 자유롭게 컨트랙트를 작성할 수 있고 디버깅을하고 배포를 할 수 있게 됐습니다.

또한 (웹사이트와 ← — -> 블록체인)을 연결할 상황이 있을때 같은 에디터안에 코드들이 있음으로 훨씬 용이하게 코드파일들을 관리 할 수 있는 장점도 있습니다

그럼 한번 이 hardhat을 함께 파헤쳐봅시다.

2. Hardhat Step by Step

  1. 빈 폴더 만들기

먼저 hardhat을 연습하기 위한 빈 폴더를 생성해주세요.

2. Hardhat 설치하기

npm install --save-dev hardhat

3. Hardhat 기본 셋팅하기

npx hardhat init

What do you want to do ?

프로젝트 성격상 어떤 언어를 선택할지를 묻습니다.

▶ Hardhat project root :

hardhat의 경로를 어디에 설치할건지를 묻습니다.

▶ Do you want to add . gitignire? :

깃에 올리지 않는 파일을 추가할건지를 묻습니다.

▶ Hardhat project root :

Hardhat project root : hardhat의 경로를 어디다가 설치할건지를 묻습니다.

▶ hardhat-toolbox :

hardhat을 이용하면서 필요한 의존성 툴들이 모아져있는 박스를 의미합니다.

이렇게 다운을 받게되면 여러분의 폴더구조에는 이렇게 나올겁니다.

여기서 집중적으로 봐야할 세가지 폴더를 봐 봅시다.

▶ contracts :

컨트랙트를 작성할 수 있는 폴더입니다.

▶ scripts :

컨트랙트를 배포를 할 수 있는 파일입니다.

▶ test :

컨트랙트를 테스트를 할 수 있는 파일입니다.

▶ hardhat.config.js :

hardhat 환경설정을 할 수 있는 파일입니다 (밑에서 자세히 설명)

4. Contracts 파일 만들기

여러분의 contracts폴더 안에 파일은 Lock.sol로 되어있을겁니다.

모두 지운 후 제가 만든 아주 간단한 contract 예시코드가 있으니

제가 만든 아주 간단한 contract 예시코드가 있으니

여러분은 코드를 먼저 이해해봅시다.

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
import "hardhat/console.sol";


contract BuyHouse {


string public ownerHome;


constructor() {
ownerHome = "Tae_YANG";
console.log("House Owner : ", ownerHome);
}


function buyHome(string memory _ownerHome) public {
console.log(" House Owner changed '%s' -> '%s' " , ownerHome, _ownerHome);
ownerHome = _ownerHome;
}




}

컨트랙트를 배포하면 집 주인이 바뀌는 간단한 컨트랙트입니다.

constructor 생성자를 통해 처음 배포시 집주인을 설정해줍니다.

그 다음 buyhome함수를 통해 집을 구매한 사람이 집 주인이 되는

컨트랙트입니다.

5. Compile

컨트랙트를 만들었으니 배포를 하면 되겠죠?

No! ❌

Remix에서도 컴파일을 했듯이 Hardhat에서도 컴파일을 해야 됩니다.

npx hardhat compile

컴파일을 하게 되면 여러분은 두 개의 폴더를 보게 됩니다.

▶ artifacts:

컨트랙트의 정보가 담겨있는 곳

artifacts -> build info → 컨트랙트가 난수로 json 형식으로 되어있습니다.

artifacts -> contracts -> 컨트랙트에 대한 ABI 가 들어있습니다 < < 핵심

ABI는 프런트와 상호작용하기 위해 꼭 필요한 파일이라 어디에 저장되어 있는지 아는 건 중요하겠죠?

이제 컴파일이 되어 우리 컨트랙트가 사용할 수 있게 됐으니

테스트를 하러 가봅시다 🏃

6. test

test폴더는 우리가 작성한 컨트랙트를 배포하기 전에

미리 테스트할 수 있는 폴더입니다.

테스트 폴더를 열어보면 Lock.js 파일이 있는데 모두 지워줍니다

제가 작성한 코드로 덮어씌워줍시다.

describe("BuyHouse", function () {
  it("change house owner", async function () {
const BuyHouse = await ethers.getContractFactory("BuyHouse");
const buyhouse = await BuyHouse.deploy();
const setBuyHouseTx = await buyhouse.buyHome("Moon");
await setBuyHouseTx.wait();
});});

전체적인 코드의 흐름을 하나씩 뜯어봅시다.

▶ 테스트코드를 실행했을 때 제목을 정해줍니다.

describe("BuyHouse")

▶ 부제목입니다.

it("change house owner", async function () { }

▶ 우리가 작성한 BuyHouse 컨트랙트를 가져옵니다.

const BuyHouse = await ethers.getContractFactory("BuyHouse");

▶ 테스트코드에서 배포를 시킵니다. (실제 배포는 아닙니다)

만약 해당 컨트랙트에 생성자(constructor)가 있다면

deploy(“do SomeThing”) 파라미터를 던져줄 수 있습니다.

const buyhouse = await BuyHouse.deploy();

▶ 저희가 작성한 함수 즉 트랜잭션을 발생시킵니다.

const setBuyHouseTx = await buyhouse.buyHome("Moon");

▶ 트랜잭션이 끝날 때까지 기다립니다.

await setBuyHouseTx.wait();

▶ 테스트하기

npx hardhat test

처음에 HousOwner가 Tae_Yang으로 정해지고

그다음 집을 구매한 사람 Moon으로 집주인이 바뀐 걸 확인해 볼 수 있습니다.

테스트가 끝났으니 실제로 배포를 한번 해봅시다.

7. deploy

scripts 폴더 안에 deploy.js를 확인해 봅시다

마찬가지로 모두 지우고 우리가 만든 예시코드 통해 배워봅시다.

const hre = require("hardhat");
async function main() {
const buyHouse = await hre.ethers.deployContract("BuyHouse");
await buyHouse.waitForDeployment();
console.log(`deployed to ${buyHouse.target}`);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

▶ 배포할 컨트랙트 선택

const buyHouse = await hre.ethers.deployContract("BuyHouse");

▶ 배포가 될 때까지 기다리기

await buyHouse.waitForDeployment();

▶ consol.log를 통해 배포된 컨트랙트 주소 확인하기

console.log(`deployed to ${buyHouse.target}`);

이제 모든 준비가 끝났으니 배포를 해봅시다

npx hardhat run scripts/deploy.js

파일이름이 바뀌면 그에 따라 scripts/[changeFileName] 로 바꿔주는 것도

잊지 맙시다!

주소가 잘 나온 걸 확인해 볼 수 있습니다.

하지만 이런 질문을 가지고 있을 수 있겠네요.

어떤 네트워크에 배포를 했는데?

8. deploy with Network

지금부터는 우리가 작성한 컨트랙트를 네트워크에 배포하는 법을

알아봅시다.

▶ hardhat.config.js

위에서 잠깐 언급했었죠? 이 파일은 hardhat에 관련된 정보

즉 기본적인 환경설정을 해줄 수 있는 파일입니다

예를 들어 hardhat에 네트워크를 추가하거나 ex) Goerli,Sepolia

혹은 필요한 PlugIn들을 적용시킬 수 있습니다.

바로 예제코드를 보면서 익혀봅시다.

require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.19",
networks: {
sepolia: {
url: "https://eth-sepolia.g.alchemy.com/v2/[여러분 API키 입력]",
accounts: ["지갑 개인키"]
},
},
};

▶ 배포할 컨트랙트 버전

module.exports = {
solidity: "0.8.19",
}

▶ 네트워크 추가하기

networks: {
sepolia: {
url: "https://eth-sepolia.g.alchemy.com/v2/[여러분 API키 입력]",
accounts: ["지갑 프라이빗키"]
},
}

API키 입력과 지갑 프라이빗키 얻는 법은 이 튜토리얼에서 자세히 다루지는 않겠습니다.

축하합니다! 이제 여러분이 설정한 네트워크에 컨트랙트를 배포할 수 있게 됐습니다. 그럼 바로 배포를 한번 하러 가봅시다.

▶ 컨트랙트 네트워크에 배포하기

npx hardhat run scripts/deploy.js — network sepolia

기존에 배포했던 방식에서 뒤에 네트워크만 입력해 주시면 됩니다.

아주 간단하죠?

저는 세폴리아 테스트넷에 배포했기 때문에 세폴리아 이더스캔에 가서

우리 컨트랙트가 잘 배포되었는지 확인해 볼까요?

수고하셨습니다! 이렇게 여러분은 Remix(리믹스)가 아닌 Hardhat을 통해서

컨트랙트를 vscode에서 작성하고 테스트하고 배포까지 해봤습니다.

유익한 글이 되셨으면 좋겠습니다 감사합니다.

--

--