이더리움 Dapp 만들기 [7. Truffle 사용법]

in #kr6 years ago

이더리움 dapp을 작성하고 사용하려면 컴파일하고 네트워크에 배포하고 배포된 컨트랙트와 연결해야하는 과정을 거치게 됩니다. 대략 solc를 사용해서 컴파일, 컴파일 된 파일에서 ABI 정보를 가져와서 geth에서 배포하고, 후에 컨트랙트 주소를 저장해두고 후에 사용할 때 주소를 통해서 접근하게 되죠. 실제로 개발을 해보면 보통 복잡한 게 아닙니다. 그래서 이러한 걸 해결해주는 프레임워크가 있습니다. 바로 트러플입니다. (https://truffleframework.com/)

트러플에서 제공하는 기능은 컨트랙트 컴파일, 배포, 디버그, 테스트를 제공합니다. 트러플을 사용해서 dapp을 개발하면 좀? 편해집니다. (과연 그럴까요?)

트러플을 사용하기 위해서는 NODE.JS가 설치되어 있어야 합니다. 노드 버전 5.0이상 설치되어 있어야 합니다. (NODE.JS 설치는 https://nodejs.org/en/ 에서 확인해보세요)

설치된 노드 버전 확인은 아래 명령어를 사용하면 됩니다.

node -v

1. 트러플 설치하기

npm install -g install

트러플이 설치 되었으면 버전을 확인해보겠습니다.

truffle version

설치된 트러플 버전과 솔리디티 컴파일 버전이 나옵니다.
설치 확인이 끝났으면 트러플 예제를 작성할 폴더를 하나 만들고 이동합니다.

mkdir truffle_exmple
cd truffle_example

2. 트러플 프로젝트 만들기

truffle init

트러플 초기화가 완료되면 contracts, test, migrations 폴더가 생성되고 truffle.js, truffle-config.js 가 생성됩니다.

contracts 폴더에는 solidity언어로 작성한 컨트랙트들을 두는 곳입니다. test폴더에는 컨트랙트를 테스트할 때 사용하는 파일을 두는 곳입니다. migration 폴더에는 컴파일 후에 컨트랙트를 배포할 때 사용하는 파일을 두는 곳입니다. truffle.js는 트러플에서 컨트랙트를 배포할 네트워크 설정, 컴파일러 언어 설정 등 트러플과 관련된 설정을 하는 파일입니다. truffle-config.js 파일은 truffle.js를 설정할 예시를 보여주는 파일입니다. 트러플 설정을 할 때는 truffle.js를 사용한 다는 것 명심!

3. 트러플 설정하기

트러플에서 배포할 때 사용할 네트워크를 설정하겠습니다. truffle.js를 엽니다

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // to customize your Truffle configuration!
  networks: {
    development: {
      host: "localhost",
      port: "8545",
      network_id: "*",
    }
  }
};

networks에서 development로 네트워크를 설정하면 트러플 컴파일 하거나 배포를 할 때 —network를 옵션으로 지정해서 사용할 수 있습니다. (—network development)

host와 port는 geth 실행 시에 설정한 rpc host와 port로 설정하면 됩니다. geth 실행 시에 지정을 하지 않았으면 기본으로 localhost, 8545로 설정됩니다.

잘 설정이 됐는지 연결이 잘 되는지 확인해보겠습니다.
트러플에서는 콘솔을 제공해서 네트워크 정보를 확인할 수 있습니다.

truffle console 

또는

truffle console —network development

로 접속을 합니다. (geth 이더리움 네트워크는 구동상태여야 합니다!)

web3.eth.coinbase

로 명령어를 쳤을 때 geth에서 설정된 coinbase 주소가 나오면 잘 연결된겁니다. 연결이 확인됐다면 .exit를 입력해서 빠져나옵니다.

4. 컨트랙트 컴파일

트러플에서 컨트랙트를 컴파일 할 때 사용하는 명령어는 아래와 같습니다

truffle compile

contracts/ 폴더 안에 들어있는 모든 파일이 컴파일이 진행됩니다. truffle init을 하고 contracts 폴더를 보면 Migration.sol 컨트랙트 파일이 있는 걸 확인할 수 있습니다. 해당 파일은 다른 컨트랙트들에 대한 배포정보를 가지고 있고 관리할 때 트러플이 사용하는 파일입니다. 절대 삭제하지 마시고 수정하지 말기를 권해드립니다.

자, 이제 컨트랙트를 컴파일 해보겠습니다. 이 전에 작성한 Simple.sol 파일을 contracts폴더에 작성합니다.

 pragma solidity ^0.4.23;

contract Simple {
        uint256 data;
        function set (uint256 _data)public {
                data = _data;

        }
        function get()public view returns(uint256){
                return data;
        }
}
truffle compile

명령어를 실행시킵니다. contracts폴더에 들어있는 파일들의 컴파일을 다 수행하고 build폴더를 만들고 해당 폴더에 컴파일이 완료된 정보가 담겨있는 파일들이 생성됩니다. (컨트랙트에 오류가 있으면 오류가 표시되고 종료됩니다.) build/contracts 폴더를 보면 json파일들이 생성된 걸 확인할 수 있습니다. json파일에는 컨트랙트의 ABI 정보, bytecode 등 배포때 필요한 정보가 들어있습니다.

5. 컨트랙트 배포하기

컨트랙트를 배포하기 위해서는 migrations폴더에 배포할 컨트랙트에 맞게 파일을 하나 작성해줘야 합니다. truffle init을 하면 migrations 폴더에 1_initial_migration.js 파일이 존재합니다.

해당 파일을 열어보면

var Migrations = artifacts.require("./Migrations.sol");

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

Migration 컨트랙트를 배포하는 파일임을 확인할 수 있습니다. 컨트랙트를 배포하기 위해서는 artifacts.require()로 배포를 원하는 컨트랙트의 정보를 획득 한 후 deployer.deploy()를 사용해서 배포를 하는 과정임을 알 수 있습니다. 해당 파일도 삭제 또는 수정하지 않는 걸 권해드립니다.

Simple.sol을 배포하기 위해서는 새로운 배포파일을 작성하면 됩니다.
migrations 폴더에 2_deploy_contracts.js 를 생성합니다. 아래와 같이 작성합니다.

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

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

자! 이제 배포해보겠습니다. (geth 실행 후에 miner.start()를 실행시켜서 마이닝을 활성화 시켜주세요!!!!)

truffle migrate

성공적으로 작업이 완료되면 아래와 같은 문구가 나타납니다.

Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x966134b845d298f18406f8cd7051f4b81010cdc5f15d9b8b251c344fa3703e45
  Migrations: 0x81a3bb2434d5064036f6fff4b3ef21a13d1cdb84
Saving successful migration to network...
  ... 0x0cd3a7043705d61e46783ff0cca339a6f1fc00f3654ddc4be22ef1c24715e35e
Saving artifacts...
Running migration: 2_deploy_contract.js
  Deploying Simple...
  ... 0x1209fd60a114e9231e838dc15e45f82c1361f4271828eb4eec02402268f8fd8d
  Simple: 0x996ba351a2cb36307c078360530ffe43655fd0b5
Saving successful migration to network...
  ... 0x88d7adb4bd53901e9db8c547982477b68a0bd8dc5697c7f565ac3bd743875e19
Saving artifacts...

혹 배포가 잘 되지 않는다면 geth를 실행시킬 때, 어카운트의 락을 풀었는지 혹은 gas limit 에 걸리지 않았는지를 살펴보세요~

6. 컨트랙트 사용하기

배포된 컨트랙를 사용해 보겠습니다. Simple 컨트랙트는 data에 수를 저장할 수 있는 set 함수와, data에 저장된 수를 반환하는 get함수가 있습니다. 트러플을 사용하지 않았을 때는 컨트랙트의 주소와 ABI를 매번 설정해줘야 하는 불편함이 있었죠. 하지만 트러플을 사용하면 그럴 필요가 없습니다. 먼저 트러플 콘솔상에서 컨트랙트를 사용해보겠습니다.

truffle console

를 입력해서 트러플 콘솔로 들어갑니다.

Simple.deployed().then((instance)=>{return instance.get.call()}).then((result) => { data = result });

를 입력해서 data 변수에 컨트랙트에 저장된 값을 저장합니다.

data.toNumber()

의 값이 0이 출력되면 성공!!!!!!

Simple.deployed() 를 호출하면 배포된 Simple 컨트랙트의 객체가 반환됩니다. 해당 객체 를 instance 변수로 받고 get함수를 호출해서 컨트랙트에 저장된 변수의 값을 가져옵니다.

이렇게 배포된 컨트랙트를 사용할 때는 컨트랙트이름.deployed()를 사용한다는 점 기억하세요.

그러면 이 번에는 set함수를 사용해서 변수에 데이터를 저장해보겠습니다.

Simple.deployed().then((instance) => { return instance.set(100) })

제대로 수행이 되면 트랜젝션 관련 정보가 출력된답니다.
그럼 정말 저장이 됐는지 get함수를 통해서 출력해볼까요?

Simple.deployed().then((instance)=>{return instance.get.call()}).then((result) => { data = result });
data.toNumber();

100이 출력 되었다면 제대로 실행된 겁니다.

어떤가요? 트러플을 사용하면 컨트랙트 관리, 배포, 사용이 편리해지셨나요? 저는 편리한 것 같습니다. (아직까지는.. ㅎㅎ)

오늘은 여기까지! 트러플에서 테스트 방법과 디버깅, 다른 패키지와의 연결은 다음에 작성해보려고 합니다. (아직 익숙지 않아서.. 헤헤)

Sort:  

Congratulations @pangol! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Do not miss the last post from @steemitboard:

SteemitBoard Ranking update - A better rich list comparator
Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Congratulations @pangol! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

Click here to view your Board

Support SteemitBoard's project! Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.26
TRX 0.13
JST 0.031
BTC 61553.99
ETH 2881.27
USDT 1.00
SBD 3.54