본문 바로가기
프로그래밍/Solidity

Hardhat으로 Rinkeby 테스트넷에 스마트 컨트랙트 업로드하기

by 쿼카퀀트 2022. 1. 14.
728x90

스마트 컨트랙트 개발이 완료됐다면, 이더리움 메인넷에 업로드하기 전, 먼저 제대로 작동하는지 테스트를 해볼겁니다.

 

기존처럼 단순히 로컬 hardhat 네트워크에서 테스트하는게 아니라, 실제 내 지갑과 연결하고 스마트 컨트랙트가 작동하는 모습을 확인하고 싶다면, Rinkeby라는 테스트넷을 사용해야 합니다.

Rinkeby외에도 여러 테스트넷이 있지만, 개인적으로 가장 편리하다고 생각하는 네트워크기 때문에, 이를 기준으로 설명해보겠습니다.

 

Rinkeby 계정 만들기

이 포스트를 보시는 분들은 모두 Solidity 개발을 해보신 분들일테니, 아마 Metamask 계정은 이미 있으실겁니다.

Metamask를 켜면 아래처럼 내 계좌가 뜨는데요, 맨 위에 'Rinkeby 테스트 네트워크'라고 뜨는게 보이시나요?

지금은 아마 '이더리움 메인넷' 이라고 떠있을 텐데요, 이걸 클릭하면 아래처럼 네트워크를 선택할 수 있는 창이 뜹니다.

여기서 'Rinkeby 테스트 네트워크'를 클릭해줍니다.

그럼 Rinkeby 네트워크에 연결이 완료됐습니다!

하지만, 이더리움이 하나도 없으니 먼저 충전을 해야겠네요.

 

 

Rinkeby에 이더리움 충전하기


Rinkeby는 테스트넷이기 때문에, 실제 이더리움을 사용하지는 않습니다.

대신, faucet을 통해 테스트용 이더리움을 공급받아 사용합니다.

 

여러 faucet이 존재했지만, 지금 시점에서 정상 작동하는곳은 Chainlink Faucets 뿐인 것 같습니다.

위 링크에 접속하면 아래처럼 화면이 뜨는데, 여기에 내 metamask 주소를 입력하고, 'send request' 버튼을 눌러 이더리움을 요청합니다.

제대로 됐다면, 대략 1분 안에 0.1이더리움이 충전됩니다!

여러번 반복해도 계속 0.1이더리움씩 보내주니, 이렇게라도 부자가 된 기분을 한번 느껴보시죠.

 

이제 계좌에 이더리움이 들어왔으니, 이를 사용해 스마트 컨트랙트 업로드를 해보겠습니다.

 

 

Alchemy, Metamask, Etherscan 연결


제가 설명에서 사용하는 컴파일러는 Hardhat입니다. Hardhat 개발자 비중이 꾸준히 증가중이니, Truffle이나 Remix IDE를 쓰시는 분들도 한번 hardhat을 접해보면 좋을 것 같습니다.

1. 먼저 Hardhat에 Alchemy를 연결해줍니다. Alchemy 링크

Alchemy에 가입 후, 홈 화면에서 'Create App' 버튼을 찾아서 클릭해주세요. 그 다음은 아래 스크린샷처럼 Network 에서 Rinkeby를 찾아서 입력하고, Create App 버튼으로 생성을 완료합니다.

 

생성한 앱 정보 중, 'View Key' 버튼을 누르면 아래처럼 HTTP, WEBSOCKETS KEY가 뜹니다. 이 중 HTTP KEY를 저장해두세요.

 

2. 다음으론 메타마스크와 연결할 정보를 받아옵니다. 메타마스크에선 MNEMONIC이란 정보를 받아올건데요, 내 지갑 ID 역할을 해주는 키 값이라 생각하면 됩니다.

아래 표 순서대로 진행해주세요

오른쪽 위 내 프로필(동그란 모양) 클릭 설정 클릭 보안 및 개인정보 보호 클릭 비밀 복구 구문 공개 클릭

이렇게 '비밀 복구 구문 공개'를 클릭하고 비밀번호를 입력하면 여러분들의 MNEMONIC 단어 조합(wood sweet ~~~~ 등등)이 뜰건데요, 이것도 따로 저장해주세요.

 

3. 이제 마지막으로 Etherscan의 API만 가져오면 됩니다. 생각보다 연결해야할게 많죠..ㅎㅎ 한번 해두면 변경할 일 없으니 처음에만 조금 고생하면 됩니다.

Etherscan.io에 로그인 후, 내 프로필에서 API Keys 클릭 - API Key를 발급받습니다.

이제 저장해둔 세 링크를 활용해 Hardhat을 테스트넷과 연결해보시죠.

 

4. hardhat 폴더에 아래 그림처럼 .env 파일을 생성합니다.

생성한 .env 파일에는 아래와 같이 값을 입력해주세요.

RINKEBY_URL= 'ALCHEMY에서 복사해둔 HTTP KEY'
MNEMONIC = '복사해둔 MNEMONIC'
ETHERSCAN_API_KEY = '이더스캔 API KEY'

 

5. hardhat.config.js에 들어가, module.exports 부분을 아래처럼 바꿔주세요(solidity 버전은 꼭 0.8.10이 아니어도 됩니다).

require('dotenv').config()
const RINKEBY_URL = process.env.RINKEBY_URL
const MNEMONIC = process.env.MNEMONIC
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
module.exports = {
  defaultNetwork: "hardhat",
  networks: {
    hardhat: { },
    rinkeby: {
      url: RINKEBY_URL,
      accounts: {
        mnemonic: MNEMONIC
      },
      gas: 2100000,
      gasPrice: 8000000000,
      saveDeployments: true
    }
  },
  etherscan: {
    apiKey: ETHERSCAN_API_KEY
  },
  solidity: "0.8.10",
  namedAccounts:{
    deployer:{
      default: 0
    }
  }
};

이제 Rinkeby에 스마트 컨트랙트를 업로드할 준비가 끝났습니다.

 

 

스마트 컨트랙트 생성


이제 진짜로 스마트 컨트랙트를 한번 올려보죠.

아래처럼 업로드할 스마트 컨트랙트를 만들고, utopia.sol 이란 이름으로 저장하겠습니다.

컨트랙트 이름은 Utopia입니다.

pragma solidity ^0.8.10;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract Utopia is ERC721URIStorage, Ownable {

	constructor() ERC721("New ERC", "NE") {
    }

    function withdraw() external payable onlyOwner() {
        payable(owner()).transfer(address(this).balance);
    }

    function getContractBalance() external view onlyOwner() returns (uint) {
        return address(this).balance;
    }

    
}

 

 

스마트 컨트랙트 Deploy


위에서 만든 스마트 컨트랙트를 Rinkeby 네트워크에 업로드해 봅시다.

업로드용 코드를 만들어야 하므로, hardhat에 deploy 폴더를 만들고, 그 안에 deploy.js 파일을 만듭니다(파일명은 다른걸 써도 괜찮습니다). 그리고 아래처럼 코드를 작성해줍니다.

const hre = require("hardhat");

async function main() {
  const contractContext = await hre.ethers.getContractFactory("Utopia");
  const myContract = await contractContext.deploy();

  await myContract.deployed();

  console.log("Contract deployed to:", myContract.address);
}

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

다른 부분은 손 댈 필요 없이, async function main() 내부만 고치면 되는데요,

getContractFactory 에서 "Utopia"를 자신이 만든 스마트 컨트랙트의 이름으로(파일명이 아닌 컨트랙트 이름) 바꾸면 됩니다.

 

그리고 실행시키면 됩니다.

터미널에서 아래 명령어를 입력해주세요(hardhat-shorthand를 설치했다면 npx hardhat 대신 hh만 입력).

npx hardhat run deploy/deploy.js --network rinkeby

 

이건 deploy/deploy.js 경로의 파일을 실행시키고, 사용할 네트워크는 rinkeby라는 의미의 코드인데요,

이 코드만 실행시키면 테스트넷에 업로드가 완료됩니다!

실행 시 Contract deployed to: ~~~~~~ 라고 뜨는 해시 주소가 내 스마트 컨트랙트의 주소값입니다.

 

 

Etherscan에 업로드된 내 스마트 컨트랙트 찾기


이제 Etherscan에서 업로드된 스마트 컨트랙트를 찾아볼까요?

먼저 Etherscan에서 내 프로필 오른쪽 이더리움 로고에 마우스를 올려, Rinkeby Testnet을 선택합니다.

그리고 방금 전 deploy 단계에서 구했던 내 스마트 컨트랙트 주소를 Etherscan 검색창에 입력하면, 아래처럼 컨트랙트 정보를 확인할 수 있습니다.

 

 

스마트 컨트랙트 업로드가 완료됐습니다!

다음엔 이처럼 출시된 스마트 컨트랙트의 기능을 실행시키는 방법을 알려드리겠습니다.

 

어려운 내용이 있다면, 댓글로 알려주세요!

그럼 모두 스마트 컨트랙트 개발 화이팅입니다.

728x90

댓글