Truffle로 SmartContract 배포하기

taeheeyoon·2022년 8월 19일
2

Blockchain 실습

목록 보기
5/8
post-thumbnail

시작하며

간단한 스마트 컨트랙트를 작성하고 Truffle을 사용하여 컴파일한 다음 Ropsten 네트워크에 배포하는 방법을 다뤄보겠습니다.

시작하기 앞서 3가지가 준비되어 있어야합니다.

단계

1. 트러플(Truffle) 설치

트러플은 블록체인 네트워크를 위한 스마트 계약 개발 도구이자 테스트 프레임워크입니다.
Node.js 패키지 매니저를 사용하여 Truffle을 전역으로 설치합니다.

npm install -g truffle

2. 이더리움 지갑에 잔고 추가

배포를 위해서는 약간의 가스비가 필요합니다. 따라서 Ropsten 네트워크의 이더리움 계정에 테스트넷 ETH를 추가합니다.

https://faucet.dimensions.network
https://faucet.egorfine.com

3. 프로젝트 폴더 생성

프로젝트의 폴더를 생성합니다. 다음의 명령어로 생성 할 수 있습니다.

mkdir truffleProject

생성한 폴더로 이동합니다.

cd truffleProject

4. Dotenv 설치

.env 파일을 사용하여 로컬에서 환경변수를 설정하기 위해 설치해줍니다.

npm install dotenv

여기에서는 .env파일을 이용하여 지갑의 니모닉과 Infura API URL을 저장할 예정입니다.

5. Truffle 프로젝트 생성

계약을 테스트하고 배포하는 데 필요한 디렉터리 구조가 잡혀있는 Truffle 프로젝트를 생성합니다.

truffle init

위의 명령어를 입력하게 되면 아래와 같은 폴더 구조를 가진 프로젝트가 생성됩니다.

  • contracts/: Solidity contracts를 위한 폴더 입니다.
  • migrations/: 배포 스크립트 파일을 위한 폴더입니다.
  • test/: 앱과 컨트랙트의 테스트 파일을 위한 폴더입니다.
  • truffle-config.js: Truffle 설정 파일입니다.

6. hdwallet-provider 설치

hdwallet-package는 12단어 또는 24단어 니모닉에서 파생된 주소에 대한 트랜잭션을 서명할 수 있는 별도의 패키지입니다.

자세한 내용은 Truffle hdwallet-provider을 참조해주세요.

아래의 명령어로 hdwallet-provider를 설치합니다.

npm install @truffle/hdwallet-provider

7. .env 파일 생성

프로젝트 폴더에 .env 파일을 생성하여 프로젝트 및 이더리움 계정의 세부 정보를 저장합니다.
여기에서는 MetaMask 비밀 복구 구문을 포함합니다. 비밀 복구 문구를 표시하는 방법은 MetaMask 지침을 참조해주세요.

INFURA_API_KEY = "https://ropsten.infura.io/v3/<Your-API-Key>"
MNEMONIC = "<Your-MetaMask-Secret-Recovery-Phrase>"
  • Your-API-Key : Infura의 이더리움 프로젝트 API key.
  • Your-MetaMask-Secret-Recovery-Phrase : MetaMask 지갑의 니모닉. hdwallet-provider의 거래에 사용됩니다.

비밀 복구 구문이 외부에 노출되지 않도록 주의해 주세요. 비밀 복구 구문이 노출되면 누구나 해당 지갑의 자산에 접근할 수 있습니다.

8. smart contract 작성

여기에서는 배포만을 위한 간단한 컨트랙트를 작성하겠습니다. contracts 폴더 안에 Demo.sol 파일을 생성해주세요.

// SPDX-License-Identifier: MIT
pragma solidity >=0.5.8;

contract Demo {
    event Echo(string message);

    function echo(string calldata message) external {
        emit Echo(message);
    }
}

9. Truffle 설정

HDWalletProvider를 이용해 Ropsten 네트워크에 배포를 하기 위한 설정을 해주겠습니다.
truffle-config.js파일에서 아래와 같이 설정을 해줍니다.

require('dotenv').config();
const HDWalletProvider = require('@truffle/hdwallet-provider');
const { INFURA_API_KEY, MNEMONIC } = process.env;

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*"
    },
    ropsten: {
      provider: () => new HDWalletProvider(MNEMONIC, INFURA_API_KEY),
      network_id: 3,
      gas: 5500000
    }
  }
};

보다 자세한 설정을 위해서는 여기를 확인해주세요.

10. smart contract 컴파일

smart contract 컴파일을 위해서 아래의 명령어를 입력해주세요.

truffle compile

컴파일에 성공하게 되면 아래와 유사한 출력이 콘솔에 표시됩니다.

Compiling your contracts...
===========================
> Compiling ./contracts/Demo.sol
> Compiling ./contracts/Migrations.sol
> Artifacts written to /Users/user/truffleProject/build/contracts
> Compiled successfully using:
   - solc: 0.5.16+commit.9c3226ce.Emscripten.clang

build/contracts/ 폴더에 컴파일된 ABI가 json으로 저장됩니다.

11. 배포 스크립트 작성

배포를 위해서는 migrations/폴더에서 스크립트를 생성해야합니다. migrations/폴더에서는 번호가 매겨져있으며 migrations/폴더에서 2_deploy_contract.js와 같은 이름을 가진 파일을 생성합니다.

2_deploy_contract.js파일에 다음과 같이 작성합니다.

const Demo_Contract = artifacts.require("Demo");

module.exports = function(deployer) {
  deployer.deploy(Demo_Contract);
};

12. smart contract 배포

스마트 컨트랙트를 이더리움 네트워크에 배포하려면 마이그레이션 명령을 실행해야 합니다.

계약을 배포하려면 다음 명령을 실행합니다.

truffle migrate --network ropsten

배포에 성공하게 되면 아래와 유사한 출력이 콘솔에 표시됩니다.

Starting migrations...
======================
> Network name:    'ropsten'
> Network id:      3
> Block gas limit: 30000000 (0x1c9c380)


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xd437e9d1595e31228dcead9397caa1526ebe5ae8f7ec06a176b7aeed53916202
   > Blocks: 4            Seconds: 53
   > contract address:    0xBe72Ed0EB8Af6d52c0Be64Ca908f81E0100390C2
   > block number:        12818214
   > block timestamp:     1660875012
   > account:             0x5A2609D698DE041B1Ba77139A4229c8a161dDd9e
   > balance:             19.999374644998249006
   > gas used:            250142 (0x3d11e)
   > gas price:           2.500000007 gwei
   > value sent:          0 ETH
   > total cost:          0.000625355001750994 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:     0.000625355001750994 ETH


2_deploy_contract.js
====================

   Deploying 'Demo'
   ----------------
   > transaction hash:    0xbed1f55b5be802ac40e408d3ac517de67795afc1762aaa7450dd652921a557bd
   > Blocks: 2            Seconds: 29
   > contract address:    0xD06F174f4A41884AAf0958C72EEc49Ec386e03b3
   > block number:        12818218
   > block timestamp:     1660875060
   > account:             0x5A2609D698DE041B1Ba77139A4229c8a161dDd9e
   > balance:             19.998852204996786174
   > gas used:            163063 (0x27cf7)
   > gas price:           2.500000007 gwei
   > value sent:          0 ETH
   > total cost:          0.000407657501141441 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:     0.000407657501141441 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.001033012502892435 ETH

Etherscan과 같은 블록 탐색기를 사용하여 트랜잭션 세부 정보를 볼 수 있습니다.
예를 들어 transaction hash 또는 contract address를 사용하여 세부 정보를 볼 수 있습니다.

profile
생각하는 대로 살지 않으면, 사는 대로 생각하게 된다.

0개의 댓글