본문으로 건너뛰기

Hardhat을 사용하여 스마트 컨트랙트 배포하기

이 튜토리얼에서는 Hardhat, Hardhat Ignition 및 TypeScript를 사용하여 Status Network 테스트넷에 스마트 컨트랙트를 배포하는 과정을 안내합니다.

사전 요구사항

시작하기 전에 다음이 필요합니다:

  • Node.js와 npm: 공식 Node.js 웹사이트에서 다운로드 및 설치
  • 이더리움 지갑: Status Network 테스트넷용 개인키가 있는 MetaMask 또는 다른 지갑
  • 테스트넷 ETH: Status Network 테스트넷 ETH가 필요합니다
    • Status Network 테스트넷 ETH는 수도꼭지에서 받을 수 있습니다
  • 기본 지식: Solidity, Hardhat, 명령줄 사용 경험

달성 목표

  • TypeScript 기반 Hardhat 프로젝트 초기화
  • 기본 이더리움 스마트 컨트랙트 작성
  • Status Network 테스트넷 배포를 위한 Hardhat 구성
  • Hardhat Ignition을 사용하여 스마트 컨트랙트 배포

단계

1. Hardhat TypeScript 프로젝트 초기화

먼저 프로젝트를 생성하고 설정합니다:

mkdir my-hardhat-project && cd my-hardhat-project
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox dotenv
npx hardhat init

프롬프트가 표시되면 "Create a TypeScript project"를 선택하여 TypeScript 기반 Hardhat 프로젝트를 설정합니다.

환경 변수를 설정합니다:

# .env 파일 생성
touch .env

# 개인키 추가 (이 파일은 절대 커밋하지 마세요!)
echo "PRIVATE_KEY=your_private_key_here" >> .env

2. 스마트 컨트랙트 작성

contracts/HelloWorld.sol을 생성합니다:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract HelloWorld {
string public greet = "Hello, Status Network!";

function setGreet(string memory _greet) public {
greet = _greet;
}

function getGreet() public view returns (string memory) {
return greet;
}
}

3. Status Network를 위한 Hardhat 구성

hardhat.config.ts를 업데이트합니다:

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";

dotenv.config();

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

const config: HardhatUserConfig = {
solidity: "0.8.24",
networks: {
statusTestnet: {
url: "https://public.sepolia.rpc.status.network",
chainId: 1660990954,
accounts: [PRIVATE_KEY],
},
},
};

export default config;

4. Ignition 배포 모듈 생성

ignition/modules/HelloWorld.ts를 생성합니다:

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

export default buildModule("HelloWorld", (m) => {
const helloWorld = m.contract("HelloWorld");

return { helloWorld };
});

5. 컨트랙트 배포

npx hardhat compile
npx hardhat ignition deploy ignition/modules/HelloWorld.ts --network statusTestnet

배포는 ignition/deployments 디렉토리에 배포 결과물과 이력을 생성합니다.

7. 컨트랙트와 상호작용

scripts/interact.ts를 생성합니다:

import { ethers } from "hardhat";
import { HelloWorld } from "../typechain-types";

async function main() {
const contractAddress = "0x0d8a93870494Fa21ec39602f31Aa67C9Fed5604f";
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const contract = HelloWorld.attach(contractAddress) as HelloWorld;

// 현재 인사말 읽기
const greeting = await contract.getGreet();
console.log("Current greeting:", greeting);

// 인사말 업데이트
const tx = await contract.setGreet("Hello from Status Network!");
await tx.wait();
console.log("Greeting updated!");

// 업데이트된 인사말 읽기
const newGreeting = await contract.getGreet();
console.log("New greeting:", newGreeting);
}

main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

상호작용 스크립트를 실행합니다:

npx hardhat run scripts/interact.ts --network statusTestnet

지원

문제가 발생한 경우: