오픈제플린을 이용한 토큰 생성

2019. 3. 21. 15:49BlockChain/Solidity

'처음 배우는 블록체인' 8장 실습을 참고로 구성된 예제입니다.

트러플 버전은 5.0.4에서 진행하였습니다.

버전정보

-truffle(develop)> version

-Truffle v5.0.4 (core: 5.0.4)

-Solidity v0.5.2 (solc-js)

-Node v8.10.0

-openzeppelin-solidity": "^2.2.0"

-오픈 제플린 2.2 공식 문서 참고링크

커맨드 8-23 새 프로젝트 생성


mkdir dapps-token

cd dapps-token

sudo truffle init

오픈제플린 설치


sudo npm install -g npm // npm 업데이트 한번 해주기

sudo npm init -f

sudo npm install openzeppelin-solidity

코드 8-7 토큰의 스마트 계약 (contracts/DappsToken.sol)


pragma solidity ^0.5.2; // ①



// ② StandardToken.sol은 2.2 이상의 버전에서 ERC20.sol로 명칭이 바뀜

import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";

import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";



contract DappsToken is ERC20, ERC20Detailed  { // ③

    // 선언, 초기화 방법 변경, 따라서 아래는 주석처리

    // string public name = "Whackur Token"; // 토큰 이름 설정

    // string public symbol = "WKRTKN"; // 토큰을 화폐 단위로 나타낼 때의 기호 설정

    // uint public decimals = 18; // 토큰에서 허용할 소수점 자릿수 설정



    // 생성자로 생성할 때 바로 토큰이름과 축약어, 자릿수를 삽입해준다.

    // ④

    constructor() ERC20Detailed("Whackur Token", "WKRTKN", 18) public {

    uint public initialSupply = 1000e18;



    // ④

    constructor() ERC20Detailed("Whackur Token", "WKRTKN", 18) public{

        _mint(msg.sender, initialSupply);

    }

}

코드 8-8 2_deploy_dapps_token.js

계약을 배포할 때 필요한 마이그레이션 스크립트 작성

migrations/ 디렉터리 아래에 숫자_작업 내용_계약 이름 형태로 작성


var DappsToken = artifacts.require("./DappsToken.sol"); // ①



contract('DappsToken', function(accounts) { // ②

    // ③

    it("should put 1000e18 DappsToken in the first account", function() {

        return DappsToken.deployed().then(function(instance) {

            return instance.balanceOf.call(accounts[0]);



        // ④

        }).then(function(balance) {

            assert.equal(balance.valueOf(), 1000e18, "1000e18 wasn't in the first account");

        });

    });

});

코드 8-9 DappsTokens.js

테스트 코드는 test 디렉터리 하위에 작성


var DappsToken = artifacts.require("./DappsToken.sol"); // ①



contract('DappsToken', function(accounts) { // ②

    // ③

    it("should put 1000e18 DappsToken in the first account", function() {

        return DappsToken.deployed().then(function(instance) {

            return instance.balanceOf.call(accounts[0]);



        // ④

        }).then(function(balance) {

            assert.equal(balance.valueOf(), 1000e18, "1000e18 wasn't in the first account");

        });

    });

});

0.5.2 버전(도커) 형태로 서비스를 실행

지난 포스팅을 참고하여 도커형태로 서비스 실행하도록 구성한다.

커맨드 8-25 테스트 실행

트러플을 개발자 모드로 실행한 후 instance, accounts를 설정한다.

버전 변경에 따라 let에 변수로 인스턴스 선언 후 호출한다.


sudo truffle develop

truffle(develop)> compile

truffle(develop)> test

truffle(develop)> let instance = await DappsToken.deployed()

truffle(develop)> let accounts = await web3.eth.getAccounts()


커맨드 8-27 토큰 이름 확인


instance.name()

커맨드 8-28 통화 기호와 전체 토큰 발행량 확인


instance.symbol()

instance.totalSupply()

커맨드 8-29 계정 0과 1의 토큰 발행량 확인

계정의 첫 번째는 토큰을 발행한 사람이고 모든 토큰을 소유하고 있다.


truffle(develop)> instance.balanceOf(accounts[0])

<BN: 3635c9adc5dea00000>

truffle(develop)> instance.balanceOf(accounts[1])

<BN: 0>

커맨드 8-30 100토큰 송금

accounts, accounts[1] 로 계정 리스트 확인 후 송금


truffle(develop)> instance.transfer(accounts[1], 100)

커맨드 8-31 각 계정의 토큰 수 확인


truffle(develop)> instance.balanceOf(accounts[0])

<BN: 3635c9adc5de9fff9c>

truffle(develop)> instance.balanceOf(accounts[1])

<BN: 64>

truffle(develop)> instance.balanceOf(accounts[2])

<BN: 0>