[truffle] 개발 환경 설정 및 테스트

By @blueleeky3/12/2018truffle

truffle 프레임워크는 스마트 컨트랙트(solidity) 개발시 개발, 배포 및 테스트 환경을 제공 합니다. 이 프레임워크는 node.js에서 동작을 하며 npm 으로 설치를 할수 있습니다.
작성 시점의 truffle 버전은 v4.1.3 입니다.

제 로컬환경은 MAC 이며, 사전에 npm 이 설치 되어 있어야 합니다.
사용법을 간단히 정리해 보았습니다.

설치

npm install -g truffle

요구사항

  • NodeJS 5.0 이상
  • 윈도우, 리눅스, Mac OS X
  • JSON RPC API 를 지원하는 이더리움 클라이언트

프로젝트 생성

mkdir sample
cd sample
truffle init

위 내용은 폴더를 생성한 후 해당 폴더에서 truffle init를 수행 합니다.
정상적으로 수행이 되면 다음의 폴더 구조로 생성이 됩니다.

파일/폴더명 비고
contracts solidity로 개발된 스마튼 컨트랙트 소스 파일 폴더
contracts/Migrations.sol 배포를 도와주는 solidity 파일(삭제 하지 마세요!) 확인필요!
migrations 배포를위한 스크립트 파일 폴더
migrations/1_initial_migration.js Migrations.sol 을 배포하는 스크립트
test 개발된 컨트랙트를 테스트 하기 위한 폴더
truffle.js truffle 설정 파일 (default)
truffle-config.js truffle 설정 파일 (truffle.js 파일이 없는경우 적용됨)

Migrations.sol 파일을 삭제하면 배포시 오류가 발생합니다. 배포시 내부적으로 이 컨트랙트를 사용하는듯 합니다.
truffle-config.js 파일은 윈도우 시스템인 경우 실행명령어(truffle.cmd)와 truffle.js 파일이 충돌로 제대로 실행이 되지 않을수 있어 윈도우인경우 truffle-config.js 파일을 사용합니다. 제 개인적인 생각으로는 두 파일을 구분하지 않고 처음부터 truffle-config.js 파일을 사용을 하는것이 좋을듯 합니다.

개발을 위한 이더리움 클라이언트

  • GANACHE : GUI 제공
  • TRUFFLE DEVELOP : truffle에 기본으로 제공되는 클라이언트
  • GANACHE CLI
    개발시에 사용가능한 이더리움 클라이언트로는 몇가지가 있지만 이중에서 새로 설치가 필요 없는 truffle develop 를 사용한다.

이더리움 클라이언트 실행

truffle develop

위 명령어를 프로젝트 루트폴더(sample 폴더)에서 실행하면 10개의 Accounts와 Private Keys 가 리스트업 되면서 truffle(develop)> 프롬프트가 나타나게 되며 JSON-RPC용(http://127.0.0.1:9545/) 서비스가 제공됩니다.

스마트 컨트랙트 컴파일

truffle(develop)> compile

위 명령어 실행시 프로젝트 루트 폴더에 /build 폴더가 생성이 되며 contracts 폴더 아래에 있는 solidity 파일이 json 형태로 변경되어 생성이 됩니다.

스마트 컨트랙트 배포

truffle(develop)> migrate

위 명령어 실행시 /build 폴더에 생성된 파일을 서버에 배포가 됩니다.

스마트 컨트랙트 테스트

truffle(develop)> test

위 명령어 실행시 /test 폴더에 있는 .js , .sol 파일을 실행하여 테스트를 수행한다.

주의 : soledity 파일로 테스트 파일을 생성시에 파일명은 contract 명과 일치 하게 하며, contract name은 Test~ 로 시작하고, 함수명도 test~ 로 시작 하여야 합니다.

간단한 예제를 통한 실습

  • 간단한 스마트 컨트랙트 생성
    contracts/Sample.sol 파일을 생성 하고 아래의 내용을 저장 합니다.
pragma solidity ^0.4.17;
contract SimpleStorage {
  uint val;

  function set(uint x) public {
    val = x;
  }

  function get() constant public returns (uint) {
    return val;
  }
}
  • 배포 스크립트 작성
    migrations/2_deploy_sample.js 파일을 생성합니다.
var SimpleStorage = artifacts.require("SimpleStorage");

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

위에서 보시다 시피 컨트랙트를 불러 올때는 파일명이 아닌 컨트랙트 명으로 불러 오기를 합니다. 또 배포파일을 보면 파일명 앞에 숫자가 붙어 있습니다. 기본적으로 migrations 폴더 아래에 포함된 모든 파일을 실행 하기 때문에 배포시 우선순위를 주기 위해 앞에 숫자를 붙여 줍니다.

  • 테스트 컨트랙트 작성
    test/TestSimpleStroage.sol 파일을 생성합니다.
pragma solidity ^0.4.17;

import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/Storage.sol";

contract TestSimpleStroage {
    function testSimpleStroage() public {
            SimpleStorage ss = new SimpleStorage();

            uint expected = 4;
            ss.set(expected);
            Assert.equal(ss.get(), expected, "value equal test");
            
    }
}
  • 컴파일
truffle(develop)> compile
  • 배포
truffle(develop)> migrate
  • 테스트
truffle(develop)> test
Using network 'develop'.

Compiling ./contracts/Storage.sol...
Compiling ./test/TestSimpleStroage.sol...
Compiling truffle/Assert.sol...
Compiling truffle/DeployedAddresses.sol...


  TestSimpleStroage
    ✓ testSimpleStroage (57ms)


  1 passing (589ms)

저도 부족한 부분이 많으며, 지금 까지 truffle 프레임워크를 이용하여 간단히 컴파일, 배포, 테스트를 해 보았습니다.

comments