본문 바로가기
Programing/Solidity

[Solidity] 트러플(Truffle) 설치 및 컨트렉트(Contract) 배포

by AustinProd 2022. 3. 16.

이번 포스트에서는 트러플(Truffle) 설치 및 트러플 콘솔을 이용한 스마트 컨트렉트 배포에 대해서 다루고자 한다. 트러플의 개념과 설치법, DApp 프로젝트에서 트러플 설정에 대해 알아본 뒤, 터미널에서 트러플 콘솔을 통해 컨트렉트 컴파일과 배포 과정을 공유한다.

 

트러플(Truffle)이란?

트러플(Truffle)은 이더리움 기반 DApp 개발에 유틸리티 기능을 제공받을 수 있는 일종의 블록체인 프레임워크이다. 작성된 스마트 컨트렉트 코드에 대한 컴파일(Compile), 배포(Deploy), 테스트(Test) 기능을 지원받을 수 있다. 해당 서비스에 대해 공식 문서에서는 "이더리움 가상머신(EVM)을 사용하여 블록체인 개발에 다양한 개발 환경, 테스트, 자산 파이프 라인 기능을 제공한다."고 명시되어 있다.

 

트러플이 제공하는 기능에 대해 나열하면 아래와 같다.

 

  • 스마트 컨트렉트의 컴파일, 연결, 배포 및 바이너리 관리
  • 자동화된 컨트렉트 테스트
  • 컨트렉트 배포에 대한 네트워크 관리
  • 콘솔을 통한 컨트렉트 관리
  • 사용자 설정을 통한 파이프라인 구축
  • ERC-190을 기준으로한 패키지 관리 시스템

 

트러플(Truffle) 설치

패키지 설치는 매우 간단하다. npm 이 설치되어 있다면, 이 패키지 관리자를 통해 설치가 가능하다. 설치가 완료되면 아래 버전 확인 명령어로 제대로 설치되었는지 확인하자.

 

// -g 플래그로 설치할 것
npm install -g truffle

// 버전 확인
truffle version
> Truffle v5.5.4 (core: 5.5.4)

 

트러플 설정(truffle-config.js)

설치가 끝나면 다음으로 컨트렉트를 배포할 DApp 프로젝트에 트러플 관련 설정 스크립트를 추가해야 한다. 경로는 프로젝트 디렉토리 루트로 지정하고, 파일명은 truffle-config.js로 생성한다. 소스코드 형식은 아래와 같다.

 

참고 : 소스코드는 React 프로젝트를 기준으로 작성하였다. 덧붙여, npm install 을 통해 필요 모듈을 미리 다운받아 놓도록 하자.

 

require("babel-register");
require("babel-polyfill");

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*", // Match any network id
    },
  },
  contracts_directory: "./src/contracts/",
  contracts_build_directory: "./src/truffle_abis/",
  compilers: {
    solc: {
      version: ">= 0.7.0 < 0.9.0",
      optimizer: {
        enabled: true,
        runs: 200,
      },
    },
  },
};

 

설정 파일에는 블록체인 네트워크 정보, 컨트렉트 파일(.sol) 경로, 컨트렉트 컴파일 시 생성될 abi 파일(.json) 저장 경로, 마지막으로 컴파일러 설정값 등이 포함되어야 한다.

 

따로 설정이 필요한 항목들은 아래와 같다.

  • host : 블록체인 네트워크 IP
  • port : 블록체인 네트워크 Port
  • contracts_directory : 컨트렉트 파일(.sol)이 저장되는 디렉토리 경로
  • contracts_build_directory : 컨트렉트 파일(.sol)이 컴파일되었을 때, 생성될 abi 파일(.json) 경로
  • version: 컨트렉트 컴파일 버전

 

컨트렉트 컴파일(Compile) 및 배포(Migrate)

트러플 설치 및 설정이 끝났으면, 트러플 콘솔(truffle console)을 통해 컨트렉트의 컴파일(compile)배포(migrate)를 진행해보자.

 

컴파일은 터미널에서 아래와 같이 실행한다.

 

# 컴파일
truffle compile

# 실행 결과
Compiling your contracts...
===========================
✔ Fetching solc version list from solc-bin. Attempt #1
✔ Fetching solc version list from solc-bin. Attempt #1
> Compiling ./src/contracts/DecentralBank.sol
> Compiling ./src/contracts/Migrations.sol
> Compiling ./src/contracts/RWD.sol
> Compiling ./src/contracts/Tether.sol

> Artifacts written to /Users/yang-euijin/development/blockchain/dApp/defi-staking/src/truffle_abis
> Compiled successfully using:
   - solc: 0.8.12+commit.f00d7308.Emscripten.clang

 

컴파일이 잘 되었다면, 배포 역시 터미널에서 진행한다.

 

# 배포
truffle migrate [--reset]

# 실행 결과
Starting migrations...
======================
> Network name:    'development'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)


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

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xa532d83d64584c28580872fced4bab261198e3ef1c4c1bbf1d7421e4dc19d190
   > Blocks: 0            Seconds: 0
   > contract address:    0x989E30Cd68bd930C2C578e1A31460b29D754eA96
   > block number:        3
   > block timestamp:     1647410707
   > account:             0x71D44288391C348B3415d647EBF7572Af71603Dc
   > balance:             99.9887085
   > gas used:            273220 (0x42b44)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0054644 ETH

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


2_deploy_contracts.js
=====================

   Deploying 'Tether'
   ------------------
   > transaction hash:    0x33a85c0b15445aad386660d4dcaece1a1fa9084164215de6815a63de3dd6e7e5
   > Blocks: 0            Seconds: 0
   > contract address:    0x906b2f8876e233c8DA3810D57Cb208bd329c24A8
   > block number:        5
   > block timestamp:     1647410708
   > account:             0x71D44288391C348B3415d647EBF7572Af71603Dc
   > balance:             99.98088356
   > gas used:            348709 (0x55225)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00697418 ETH

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

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

 

컨트렉트가 성공적으로 배포되면 배포된 컨트렉트 수(Total deployments)와 소비된 가스비(Final cost)가 로깅된다. 연결된 블록체인 계정 잔고(balance)를 확인하면 해당 가스비만큼 차감되어있을 것이다.

 

참고 : 배포(migrate)는 솔리디티 파일(.sol) 파일을 직접 참조하지 않는다. migragtions 라는 디렉토리를 생성한 뒤, 솔리디티 파일을 참조하는 스크립트 코드(.js)가 작성되어 있어야 한다. DApp 디렉토리 구조는 하단 이미지를 첨부해두었다. 관련 소스 작성법은 다음 포스트에서 다루도록 하겠다.

 

DApp 프로젝트 구조

아래 이미지에서 마킹된 영역에만 살펴보면 된다. 관련된 코드나 세부적인 내용에 대해서는 다른 포스트에서 다루도록 하겠다. 그리고, 해당 프로젝트는 React 라이브러리로 작성 구성된 프로젝트임을 다시 한번 밝힌다.

 

migrations 디렉토리

이 폴더는 트러플(Truffle)이 컨트렉트를 배포(migrate)할 때, 컨트렉트 소스코드(.sol)를 읽는 곳이다. 파일 이름은 정수 표기로 1, 2, 3 등으로 배포 순서에 따라 표기된다.

 

contracts 디렉토리

솔리디티 코드들을 모아두는 곳이다. 앞서 truffle-config.js 파일에서 해당 경로를 설정한바 있다. Remix 등에서 작업한 컨트렉트 코드들을 이곳에 보관하면 된다.

 

truffle_abis

컨트렉트가 컴파일될 때, EVM에서 반환되는 ABI 파일이 저장되는 디렉토리다. 역시 truffle-config.js 파일에서 경로를 지정해두었었다. 개발자가 직접 작성한 코드가 아닌, ABI 관련 코드가 가상머신을 통해 JSON 형태로 생성된다.

 

truffle-config.js

해당 DApp에서 트러플 관련 설정을 입력한 파일이다. 프로젝트 루트 경로(./)에 위치한다.

 

 

지금까지 트러플 프레임워크를 통해 스마트 컨트렉트의 DApp 컴파일 및 배포를 알아보았다. 관련된 세부적인 내용과 소스코드는 이어서 다룰 예정이다.

'Programing > Solidity' 카테고리의 다른 글

[Solidity] Storage와 Memory  (0) 2022.03.15
[Solidity] payable 옵션  (0) 2022.03.15
[Solidity] receive 함수  (0) 2022.03.12
[Solidity] fallback 함수  (0) 2022.03.12
[Solidity] 솔리디티 코드 연습 - 크립토 좀비  (1) 2022.03.11

댓글