Hardhat Integration

본 문서에서는 Nodit에서 제공하는 이더리움 노드를 Hardhat과 연동하는 방법을 소개합니다.

Hardhat은 전세계에서 가장 많은 사람들이 사용하는 이더리움 개발 프레임워크 입니다. Nodit과 Hardhat을 이용하여 여러분만의 블록체인 프로젝트를 구성해 보세요!



1. Requirements

이 튜토리얼을 원활하게 진행하기 위한 환경 설정이 필요합니다. 아래의 가이드를 참고하여 필요한 부분을 준비해주세요.


1-1. Nodit 회원가입

Nodit의 개발 환경을 사용하려면 Nodit 콘솔에 회원 가입을 해야 합니다. 아래 링크를 클릭하여 진행할 수 있습니다.

▶︎ Nodit Console Sign Up 바로가기


1-2. Nodit Console API Key

회원가입을 완료했다면 해당 계정에 첫 프로젝트가 자동으로 생성됩니다. 생성된 프로젝트의 Dashboard에서 API Key를 찾아 안전한 장소에 보관하세요!

▶︎ API Key에 대해서 알아보기

🚧

API Key 관리시 주의사항

API Key를 통해 프로젝트의 모든 기능에 접근할 수 있습니다. 반드시 API Key를 안전한 장소에 보관하세요! 또한, Security옵션을 활성화하여 보안을 강화할 수 있습니다.


1-3. NodeJS & NPM 설치

NodeJS는 자바스크립트 런타임 환경입니다. 아래의 링크에서 자신의 운영체제에 맞는 버전을 다운로드하고 설치하세요.

▶︎ NodeJS 최신 버전 다운로드 받기

🚧

NodeJS 설치 시 주의사항

꼭 LTS 최신 버전을 설치 해주세요! 일반 최신 버전은 튜토리얼 진행시 에러가 발생할 수 있습니다.

NodeJS 설치가 완료 되었다면, 설치한 버전을 확인합니다. NodeJS를 설치하면 노드 패키지를 관리하는 툴인 NPM도 함께 설치가 됩니다. NodeJS와 NPM이 설치되었는지 확인할 수 있습니다.

node -v 
npm -v          

1-4. 지갑 생성하기

지갑은 사용자의 자산을 보관하는 도구로, public key와 private key로 구성되어 있습니다. 아래의 가이드에 따라 지갑을 생성하고 private key를 확인해보세요.

  1. Metamask 설치: Metamask는 브라우저 기반의 지갑 플러그인입니다. Metamask 공식 홈페이지에서 브라우저에 맞는 버전을 설치하세요.
  2. 지갑 생성: Metamask 플러그인을 열고 "Get Started"를 클릭하여 새 지갑을 생성하세요. 지갑 생성 과정에서 제공되는 니모닉(단어들의 나열)을 안전하게 저장하세요.
  3. Private Key 얻기: Metamask에서 생성한 지갑 주소를 클릭하여 상세 정보를 확인하세요. "Account details"를 클릭하면 "Show private Key" 옵션이 보입니다.

🚧

Private Key 관리시 주의사항

Private Key는 매우 중요한 정보입니다. 절대로 타인에게 노출되지 않도록 주의하시고, 안전한 곳에 보관하세요. Private Key가 노출되면 지갑의 자산을 잃을 수 있습니다.

이제 프로젝트를 생성할 준비가 되었습니다!



1-5. 테스트 토큰 받기

아래의 Faucet 사이트에 접속하여 원하는 테스트넷을 선택하고 지갑 주소를 입력하면 일정 수량의 토큰을 받을 수 있습니다. 이번 튜토리얼에서는 Ethereum의 테스트넷인 Sepolia에서 진행됩니다.

▶︎ Google Cloud Web3 Faucet


2. Create a New Project

2-1. 프로젝트 폴더 생성 및 이동

앞으로 작업할 새로운 폴더 생성한 뒤, 생성한 폴더로 이동합니다.

mkdir nodit-hardhat
cd nodit-hardhat

2-2. 필요한 라이브러리 설치

프로젝트에 필요한 라이브러리를 설치해주세요.

  • hardhat: Ethereum 스마트 컨트랙트 개발 환경으로, 로컬 개발용 블록체인 네트워크 실행, 컴파일, 배포, 테스트 등을 도와줍니다.
  • dotenv: ".env" 파일을 통해 환경변수를 쉽게 관리할 수 있도록 도와주는 라이브러리입니다. API Key와 Private Key 같은 민감한 정보를 안전하게 프로젝트에 포함할 수 있습니다.
npm install --save-dev hardhat dotenv

2-3. Hardhat 프로젝트 생성

hardhat 설치가 완료되었다면 아래의 명령어를 실행하여 프로젝트를 생성합니다.

npx hardhat init

실행하면 터미널에 아래와 같은 화면이 나타납니다. JavaScript 혹은 TypeScript 프로젝트를 선택하고, 나머지 질문은 기본값 또는 y를 입력해 진행해 주세요.




3. Connect to Node using Nodit

환경변수를 저장할 파일(.env)을 생성합니다.

touch .env

Nodit 콘솔에서 API Key와 사용할 지갑의 private key를 ".env" 파일에 입력합니다.

API_KEY="YOUR_API_KEY"
PRIVATE_KEY="YOUR_PRIVATE_KEY"

"hardhat.config.ts" 파일에서 networks 항목을 설정하여, Nodit에서 제공하는 RPC 엔드포인트를 사용할 수 있도록 구성합니다.

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import dotenv from "dotenv";
dotenv.config();

const API_KEY = process.env.API_KEY || "";
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";

const config: HardhatUserConfig = {
	solidity: "0.8.29",
	networks: {
		nodit_ethereum_sepolia: {
			url: `https://ethereum-sepolia.nodit.io/${API_KEY}`,
			accounts: [PRIVATE_KEY],
		},
		nodit_base_sepolia: {
			url: `https://base-sepolia.nodit.io/${API_KEY}`,
			accounts: [PRIVATE_KEY],
		},
	},
};

export default config;

각 항목은 다음을 의미합니다:

  • url: Nodit에서 제공하는 RPC 주소입니다. 프로젝트별로 발급받은 API 키를 포함해야 합니다.
  • accounts: 트랜잭션 서명을 위한 지갑의 프라이빗 키입니다. ".env" 파일에서 불러옵니다.



이 설정으로 Hardhat은 Nodit 노드에 연결할 수 있습니다. 이 코드를 참고해 다른 네트워크도 쉽게 추가해보세요!


4. Write the Contract

contracts 폴더에 HelloNodit.sol 파일을 생성하고 아래의 코드를 작성합니다.

// SPDX-License-Identifier: Nodit 
pragma solidity >=0.8.0;

contract HelloNodit {
   string public message;

   constructor(string memory initMessage) { 
      message = initMessage;
   }

   function updateMessage(string memory newMessage) public {
      message = newMessage;
   }
}

이 컨트랙트는 메시지를 저장하고 업데이트할 수 있는 간단한 기능을 제공합니다.

  • message: 현재 메시지를 저장하는 상태 변수입니다.
  • constructor: 배포 시 초기 메시지를 설정합니다.
  • updateMessage(): 메시지를 새로운 값으로 업데이트합니다.

아래 명령어를 터미널에 입력하여 위에서 작성한 컨트랙트를 컴파일 합니다.

npx hardhat compile

📘

Solidity 버전이 다르면 어떻게 되나요?

성공적인 컴파일을 위해서는 hardhat.config.ts에서 설정한 Solidity의 버전과 컨트랙트 코드의 solidity 버전(e.g., pragma solidity >=0.8.0;)이 일치해야 합니다. 만약 다른 버전을 설정한 경우, 컴파일에 실패하며 에러 메세지가 반환됩니다.



5. Test the Contract

작성한 컨트랙트가 정상적으로 작동하는지 테스트해보겠습니다.

test 폴더에 HelloNodit.ts 파일을 생성하고, 아래 테스트 코드를 작성하세요.

import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers";
import { expect } from "chai";
import { ethers } from "hardhat";

describe("HelloNodit", function () {
	async function deployHelloNoditFixture() {
		const initMessage = "Hello, Nodit!";
		const HelloNodit = await ethers.getContractFactory("HelloNodit");
		const helloNodit = await HelloNodit.deploy(initMessage);

		return { helloNodit, initMessage };
	}

	describe("Deployment", function () {
		it("Should set the correct initial message", async function () {
			const { helloNodit, initMessage } = await loadFixture(deployHelloNoditFixture);
			expect(await helloNodit.message()).to.equal(initMessage);
		});
	});

	describe("Message Update", function () {
		it("Should update the message correctly", async function () {
			const { helloNodit } = await loadFixture(deployHelloNoditFixture);

			const newMessage = "Updated Nodit message";
			const tx = await helloNodit.updateMessage(newMessage);
			await tx.wait();

			expect(await helloNodit.message()).to.equal(newMessage);
		});
	});
});


터미널 창에 아래 명령어를 실행하여 테스트를 수행합니다.

npx hardhat test ./test/HelloNodit.ts

성공 시 아래와 같은 테스트 결과를 확인할 수 있습니다.


6. Deploy the Contract

Hardhat의 Ignition 기능을 사용하여 컨트랙트를 배포합니다.

ignition/modules 폴더에 HelloNodit.ts 파일을 생성하고 아래와 같이 작성하세요.

// ignition/modules/HelloNodit.ts

import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";

export default buildModule("HelloNoditModule", (m) => {
	const helloNodit = m.contract("HelloNodit", ["Hello, Nodit!"]);
	return { helloNodit };
});



아래 명령어를 통해 nodit_ethereum_sepolia 네트워크에 배포할 수 있습니다.

npx hardhat ignition deploy ignition/modules/HelloNodit.ts --network nodit_ethereum_sepolia

📘

--network 옵션

이 옵션은 hardhat.config.ts의 networks 항목에서 정의한 Nodit RPC를 사용합니다.


성공 시 아래와 같이 배포된 컨트랙트 주소를 반환합니다.


7. Interact with the Contract

배포가 완료되었으면, 실제로 컨트랙트의 상태를 확인하고 업데이트해볼 수 있습니다.
Hardhat 콘솔을 통해 컨트랙트에 직접 상호작용해보세요.


7-1. Hardhat 콘솔 실행

아래 명령어로 Nodit 네트워크에 연결된 콘솔을 실행합니다:

npx hardhat console --network nodit_ethereum_sepolia

실행 후 콘솔에서 다음 명령어를 입력해 컨트랙트 인스턴스를 불러옵니다.
배포 시 출력된 HelloNodit의 주소를 YOUR_CONTRACT_ADDRESS 자리에 입력하세요.

const HelloNodit = await ethers.getContractFactory("HelloNodit");
const helloNodit = await HelloNodit.attach("YOUR_CONTRACT_ADDRESS");

7-2. 메세지 상태 확인하기

await helloNodit.message();

7-3. 메시지 업데이트하기

const tx = await helloNodit.updateMessage("Nodit is awesome!");
await tx.wait();

7-4. 변경된 메시지 확인

await helloNodit.message();  
// → "Nodit is awesome!"

📘

tx.wait()이 필요한가요?

"tx.wait()"는 트랜잭션이 블록에 포함될 때까지 기다리는 과정입니다. 이를 생략하면 트랜잭션이 아직 처리되지 않았을 수 있습니다.


Nodit와 Hardhat을 연동하는 과정을 성공적으로 마쳤습니다!
이제 여러분은 Nodit 노드와 상호작용하는 스마트 컨트랙트를 자유롭게 개발할 수 있습니다.
Nodit을 활용해 다양한 디앱(DApp)을 직접 만들어보세요!