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 프레임워크를 이용하여 간단히 컴파일, 배포, 테스트를 해 보았습니다.