무지개곰
article thumbnail
반응형

목차

hardhat이란?

scan 사이트 verify란?

etherscan 플러그

verify 방법


hardhat이란?

hardhat은 smart contract를 개발하기 위한 도구로 다양한 기능을 제공해 줍니다. 자세한 설명은 이전에 작성한 글을 확인해 주세요.

 

[BlockChain] hardhat이란? (설치, 컴파일, 테스트, 배포 방법)

contract를 배포하는 방법으로 remix를 사용하기도 하고 truffle을 사용하기도 합니다. 다양한 방법이 있지만 개발 환경 설정, 테스트 지원, 배포 및 자동화, 개발자 경험 등 다양한 측면에서 hardhat이

rainbow96bear.tistory.com


scan 사이트 verify란?

배포한 contract를 scan 사이트에 contract address를 통하여 확인할 수 있으며 transaction 등 다양한 정보를 알 수 있습니다. verify는 smart contract를 scan 사이트에 업로드하여 사용자가 contract의 자세한 내용을 확인하고 contract를 실행할 수 있도록 투명성을 제공합니다.

 

scan 사이트에서 verify 되지 않은 contract의 경우 contract 카테고리에 체크표시도 없으며 아래와 같은 내용만 나옵니다.

verify되지 않은 contract 예시

verify를 진행하게 되면 아래와 같이 contract 카테고리에 체크표시가 생기며 확인할 수 있는 contract 코드를 직접 확인할 수 있습니다.

verify된 contract 예시

verify는 scan 사이트에서 직접 할 수도 있습니다. verify 하지 않은 contract의 경우 contract 카테고리에서  verify and publish를 클릭하여 진행할 수 있지만 이 방벙에 대하여는 이번 글에서는 다루지 않겠습니다.


etherscan 플러그인

verify를 실행하기 위하여 hardhat.config.ts 혹은 hardhat.config.js에 추가적인 설정이 필요합니다.

API Key 얻기

mumbai의 경우 API키를 polygon scan 사이트에서 받을 수 있습니다. polygon mainnet과 API를 공유합니다.

polygon scan사이트에 로그인 후 mypage에서 API Key를 얻어줍니다.

 

Polygon (MATIC) Blockchain Explorer

PolygonScan allows you to explore and search the Polygon blockchain for transactions, addresses, tokens, prices and other activities taking place on Polygon (MATIC)

polygonscan.com

hardhat.config.ts 작성

우선 verify를 위한 package를 install 해줍니다.

npm i @nomicfoundation/hardhat-verify

install이 완료되었다면 hardhat에 대한 설정을 하는 hardhat.config.ts에 import 해주고 scan을 위하여 plugin을 설정해 줍니다. 이때 API Key가 필요합니다.

import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-verify";

const config: HardhatUserConfig = {
  // network, compile, path 등 설정
  etherscan: {
    apiKey: {
      polygonMumbai: POLYGONSCAN_API_KEY,
    },
  },
};

export default config;

verify 방법

verify를 하는 방법은 두 가지로 명령어로 verify 하는 방법과 script를 통하여 verify 하는 방법이 있습니다. 각각의 방법에 대하여 알아보겠습니다.

명령어

npx hardhat verify --network <network> <contract-address> <contract constructor parameter>

명령어는 위와 같이 npx hardhat verify를 이용하며 어떠한 네트워크에 배포된 contract인지 network를 설정하고 검증할 contract address를 입력합니다. 만약 contract 배포 시 constructor에 parameter가 있었다면 배포 시에 입력하였던 parameter를 추가적으로 작성하여야 합니다.

만약 constructor의 parameter가 단순하지 않은 경우 ts 혹은 js로 모듈을 작성하여 입력할 수 있습니다.

struct Point {
  uint x;
  uint y;
}

contract Foo {
  constructor (uint x, string s, Point memory point, bytes b) { ... }
}

 이와 같은 constructor를 가진 contract를 검증하고자 할 때를 예시로 보이겠습니다.

arguments.js 

module.exports = [
  50,
  "a string argument",
  {
    x: 10,
    y: 5,
  },
  // bytes have to be 0x-prefixed
  "0xabcdef",
];

이와 같은 내용을 arguments.js라는 파일에 작성을 하였다고 한다면 명령어는 아래와 같습니다.

npx hardhat verify --network <network> --constructor-args arguments.js <contract-address>

--constructor-args라는 옵션을 통하여 어떠한 파일의 값을 읽어올지 설정하게 됩니다.

script

script를 작성하여 deploy를 하였던 것처럼 script를 작성하여 verify 하는 방법도 있습니다.

await hre.run("verify:verify", {
  address: contractAddress,
  constructorArguments: [
    50,
    "a string argument",
    {
      x: 10,
      y: 5,
    },
    "0xabcdef",
  ],
});

hre는 Hardhat Runtime Environment의 약자로 hardhat 프레임워크에서 제공하는 환경변수로 hre를 사용하여 verify 합니다. 따라서 아래와 같은 import문 혹은 require문을 작성해주어야 합니다.

import hre from "hardhat";

이렇게 script를 통하여 verify 하는 경우 deploy 하는 script 내용 아래에 verify 하는 script를 작성한다면 contract 배포와 동시에 검증을 할 수 있는 장점이 있습니다. 아래는 script 예시입니다.

const hre = require("hardhat");

async function main() {
  // 스마트 컨트랙트 배포를 위한 계정 가져오기
  const [deployer] = await hre.ethers.getSigners();

  // 스마트 컨트랙트 인스턴스 생성
  const MyContract = await hre.ethers.getContractFactory("MyContract");
  const myContract = await MyContract.deploy();

  // 스마트 컨트랙트 배포
  await myContract.deployed();
  console.log("MyContract deployed at:", myContract.address);

  // 스마트 컨트랙트 검증
  await hre.run("verify:verify", {
    address: myContract.address,
    constructorArguments: [], // 생성자 인수 (필요한 경우 설정)
  });

  console.log("Verification successful!");
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!