본문 바로가기
Blockchain

[Blockchain] Truffle(트러플) 프레임워크 사용법(개발 배포 테스트)

by 개발자 염상진 2022. 7. 15.

Truffle framework는 솔리디티로 스마트 컨트랙트 개발시 배포/테스트 환경을 제공합니다. node.js 위에서 작동하며 NPM으로 설치합니다. Truffle을 사용하기 위해서는 NodeJS Version 5.0이상이 필요하며, JSON RPC API를 지원하는 이더리움 클라이언트가 필요합니다.

 

 

 

 

 

Truffle 설치방법

Truffle은 npm으로 설치합니다. 전역으로 설치해줍니다. 

$ npm install -g truffle

 

 

Truffle 프로젝트 생성하기

먼저 Simple Project를 생성합니다. truffle init은 프로젝트 기본 틀을 구성합니다.

$ mkdir simple
$ cd simple
$ truffle init

 

  • contracts : 솔리디티로 개발된 스마트 컨트랙트 소스 파일입니다.
  • contracts/Migrations.sol : 배포를 지원하는 Soliditiy 파일입니다.
  • migrations : 컨트랙트 배포를 위한 스크립트 파일을 담은 디렉토리입니다.
  • migrations/1_initial_migrations.js : Migrations.sol을 배포하는 스크립트 파일입니다.
  • test : 개발 진행중인 컨트랙트를 테스트하기 위한 폴더입니다.
  • truffle-config.js : truffle 설정 파일입니다.

 

Truffle Develop

Truffle Develop은 truffle에서 제공하는 이더리움 클라이언트입니다. Truffle Develop을 실행합니다. 아래 명령어는 root 디렉토리에서 실행합니다. 실행 후 10개의 가상 계정이 생성되고 JSON-RPC 용 서비스가 console 모드로 실행됩니다. 

$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0x7c21d996e69207a08a581911b7bb4df2870144d0
(1) 0xe4d2f38f58e34f6a0990491281fc1ba858289141
(2) 0x7d4319324e5a2e81ecd76e08fa0a180739de7f38
(3) 0x4632fc6f990fdebd63b61b18cdcd46314414a31f
(4) 0x780a75460f4eec3df35642420053a2c462ca0eb8
(5) 0xec44a30707bd60df81432924c6f7d76104b78d64
(6) 0x49c667c33b5d310bb3492c330ad1c9ef8c971528
(7) 0x879eb2c9156fb514c4415b10c1d4e588b69d733d
(8) 0x8e45cdbcd513b520c611b9ec55983b59c34ec2cf
(9) 0x0892a362c4767945fb8f3c486612b4e90d0d0daa

Private Keys:
(0) 2144a6bbda660667fd703c96424bbf0b7475b57d9944225a382750eeb98a1b12
(1) 30024471ed3ccf78957a5baed6e72cab7b7d8416ead21be4ca860c905fa424c4
(2) 86516d48e1ec7fd44db0528300040b6c4b6ea52964737f1ebf818ea3b95babba
(3) c273b56234fd8ed1bd6ff7ff9eccdb30d47ee5f7962f765d5fb628a6089c24ce
(4) f6a3c090a6a86c3760cacc4e725b7dc42eb53f347a020b113fde0dbddd448600
(5) b905d8d4e338d41fd1cf7a5829387c78b0b6672015a24d9d6f6b672ac78979c4
(6) b0332eab7c07e760c28923a4ba3d62483d0a9339099a53eeaa647204633c63f7
(7) f94011001096af21f4fb5e44758777f57bcbe1cbbd25780254abe3afd49e35e0
(8) 5158099b8d7f192e0ab3f10861b573097a3244bb22d9951b00d2b9e57d515e34
(9) 4c75a71928957fd02f051fbebed7c772756344cdd3186f1e5ccb9c40e87416e8

Mnemonic: aisle taxi happy tattoo ten tail behind pluck universe tongue group olive

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

truffle(develop)>

 

 

Truffle Develop이 실행되면 MetaMask에 해당 클리언트를 추가합니다. Truffle Develop Network를 추가하는 과정은 Ganache 네트워크를 추가하는 과정과 동일합니다.

 

 

[Blockchain] 가나슈(Ganache) 로컬 테스트 환경 구축하기(설치방법 사용법 메타마스크 연동)

가나슈(Ganache)는 가상 이더리움 네트워크를 구축하여 스마트 컨트랙트를 테스트할 수 있는 툴입니다. Ganache를 통해 생성된 가상 환경을 TestRPC라고 부릅니다. 일반적으로 스마트 컨트랙트를 개발

about-tech.tistory.com

 

Truffle Develop 개발 / 배포 / 테스트 진행

① 스마트 컨트랙트 작성

간단한 스마트 컨트랙트 코드를 작성합니다. contracts/Simpole.sol 파일을 생성하고 아래 코드를 작성합니다.

pragma solidity ^0.8.10;

contract SimpleStorage{
	uint val;
    
    function set(uint x) public{
        val = x;
    }
    
    function get() public view returns(uint){
        return val;
    }
}

 

② 배포 스크립트 작성

migrations/2_deploy_simple.js 파일을 생성하고 아래 코드를 작성합니다. 주의할 점은 컨트랙트를 호출할 때 파일명으로 불러오는 것이 아닌 컨트랙트명으로 불러오게 됩니다. 배포시 migrations 디렉토리의 모든 파일이 실행되므로, 우선순위를 결정하기 위해 파일명 앞에 숫자를 부여합니다.

var SimpleStorage = artifacts.require("SimpleStorage");

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

 

③ 테스트 스크립트 작성

test/TestSimpleStorage.sol 파일을 생성하고 아래 코드를 작성합니다. test 디렉토리 내 sol 파일은 테스트 대상 컨트랙트 명에 Test를 붙인 이름을 지정합니다.

pragma solidity ^0.8.10;

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

contract TestSimpleStorage{
    function testSimpleStorage() public {
        SimpleStorage ss = new SimpleStorage();
        
        uint expected = 4;
        ss.set(expected);
        Assert.equal(ss.get(), expected, "value equal test");
    }
}

 

④ 스마트 컨트랙트 컴파일

스마트 컨트랙트를 컴파일 합니다. 컴파일 수행 시 ./build 디렉토리가 생성되며 SimpleStorage.json 파일이 생성됩니다. contracts/Simple.sol 에서 작성한 컨트랙트에 대한 정보를 담고 있습니다.

truffle(develop) > compile
├── build
│   └── contracts
│       ├── Migrations.json
│       └── SimpleStorage.json
├── contracts
│   ├── Migrations.sol
│   └── Simple.sol
├── migrations
│   ├── 1_initial_migration.js
│   └── 2_deploy_simple.js
├── test
└── truffle-config.js

5 directories, 7 files

 

 

⑤ 컨트랙트 배포

스마트 컨트랙트를 배포합니다. ./build 디렉토리내 존재하는 json파일을 서버에 배포합니다. 

truffle(develop)> compile

Compiling your contracts...
===========================
> Compiling ./contracts/Simple.sol
> Compilation warnings encountered:

    Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Simple.sol


> Artifacts written to /home/ys/project/BEB_05/21_Contract_Library/simple/build/contracts
> Compiled successfully using:
   - solc: 0.8.15+commit.e14f2714.Emscripten.clang
truffle(develop)> migrate

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'develop'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)


2_deploy_simple.js
==================

   Deploying 'SimpleStorage'
   -------------------------
   > transaction hash:    0x8ab0456691c3aa454af755ba2e83cd7134cefe7d2b7dc6a2c2d7403b3f1080a4
   > Blocks: 0            Seconds: 0
   > contract address:    0x7CF955c4eC02daE819abacEbBF8E5F5211B4ebAc
   > block number:        5
   > block timestamp:     1657868251
   > account:             0x7C21d996E69207a08A581911B7BB4DF2870144d0
   > balance:             99.997687799937050644
   > gas used:            125653 (0x1ead5)
   > gas price:           3.025920799 gwei
   > value sent:          0 ETH
   > total cost:          0.000380216026156747 ETH

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

Summary
=======
> Total deployments:   1
> Final cost:          0.000380216026156747 ETH

 

⑥ 스마트 컨트랙트 테스트

스마트 컨트랙트 테스트를 진행합니다. ./test 디렉토리 내 존재하는 js파일과 sol 파일을 실행합니다. 솔리디티 파일로 테스 파일을 작성할 경우 파일명은 컨트랙트 명과 동일하게 작성되어야 합니다. 또한 contract name은 "Test"로 시작하고, 함수명도 "test"로 시작해야 합니다.

truffle(develop)> test
Using network 'develop'.


Compiling your contracts...
===========================
> Compiling ./test/TestSimpleStorage.sol
> Compilation warnings encountered:

    Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/Simple.sol

,Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/test/TestSimpleStorage.sol


> Artifacts written to /tmp/test--24214-Hi1sYUV6YOmy
> Compiled successfully using:
   - solc: 0.8.15+commit.e14f2714.Emscripten.clang


  TestSimpleStorage
    ✔ testSimpleStorage (1126ms)


  1 passing (30s)

 

 

Truffle Ganache 연동하기

Truffle과 Ganache을 연동해 개발을 진행할 수 있습니다. Truffle 설정파일 truffle-config.js 파일을 수정합니다. networks.development 네트워크에 Ganache 네트워크 정보를 입력합니다.

module.exports = {
    networks : {
        development : {
            host : "127.0.0.1",
            port : 7545,
            networkd_id : "5777",
        }
    }
}

 

Truffle Networks를 확인합니다. development 네트워크가 기본으로 등록되고 truffle develop으로 배포를 한경우 해당 네트워크가 출력됩니다.

truffle(develop)> truffle networks

Network: develop (id: 5777)
  Migrations: 0xBc56585247A22f3E9de23b2b02aBFfB8F2C4f85E
  SimpleStorage: 0xBE3eA2a78555dC4B72231d6ea878000659D68D05

Network: development (id: 5777)
  No contracts deployed.

 

 

Ganache 네트워크는 development 네트워크에 연결되어 있으므로, 해당 네트워크에 작성된 컨트랙트를 배포합니다. 만약 migrate가 정상적으로 안되면 truffle develop을 재시작하면 됩니다.

truffle(develop)> truffle migrate --network development
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


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


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

   Replacing 'Migrations'
   ----------------------
   > transaction hash:    0x6798903d1e4c4fdc58bac037bc6212e608c9586efe79229ff5b5b6fdd650ddf5
   > Blocks: 0            Seconds: 0
   > contract address:    0xe559cA68317ca9F2b369C151Ebdf3C7F5cBe5f40
   > block number:        1
   > block timestamp:     1657869391
   > account:             0xa88528DA35A07963F9C644F067a2b2F921190050
   > balance:             99.99502292
   > gas used:            248854 (0x3cc16)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00497708 ETH

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


2_deploy_simple.js
==================

   Replacing 'SimpleStorage'
   -------------------------
   > transaction hash:    0x6edca601db2143eeee97de70fbad8e049e2329bb488f23aecb48d9bb1d911a8a
   > Blocks: 0            Seconds: 0
   > contract address:    0x883e3fa049BB5548b69626B33dd423893591cA80
   > block number:        3
   > block timestamp:     1657869392
   > account:             0xa88528DA35A07963F9C644F067a2b2F921190050
   > balance:             99.9916596
   > gas used:            125653 (0x1ead5)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.00251306 ETH

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

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

 

 Ganache 네트워크에 컨트랙트 배포가 완료되었습니다. Ganache 네트워크에 새로운 블록이 생성된 것을 확인할 수 있습니다. 세부 트랜잭션들을 보면 truffle devleop 에서 출력한 Tx와 동일한 Tx가 출력되고 있음을 확인할 수 있습니다.

 

 

 

 

[Blockchain] 가나슈(Ganache) 로컬 테스트 환경 구축하기(설치방법 사용법 메타마스크 연동)

가나슈(Ganache)는 가상 이더리움 네트워크를 구축하여 스마트 컨트랙트를 테스트할 수 있는 툴입니다. Ganache를 통해 생성된 가상 환경을 TestRPC라고 부릅니다. 일반적으로 스마트 컨트랙트를 개발

about-tech.tistory.com

 

 

[Blockchain] 이더리움 토큰 발행하기 (ERC-20 라이브러리 사용)

이더리움 블록체인에서 자신만의 토큰을 발행하고, 다른 토큰과 교환하거나 이더(ETH)와 교환해 현금화할 수 있습니다. 토큰을 발행하기 위해서는 ERC-20 표준 스펙을 준수하는 스마트 컨트랙트를

about-tech.tistory.com

 

 

[Blockchain] 가위바위보 스마트 컨트랙트 개선하기

가위바위보 스마트 컨트랙트 게임을 배포하고 난 후 문제점이 발견됩니다. 새로운 방을 생성한 방장이 입력한 조건값이 트랜잭션에 그대로 노출된다는 점입니다. 스마트 컨트랙트에서 발생한

about-tech.tistory.com

 

댓글