ERC20 토큰 개발을 통한 Truffle를 이용한 스마트 컨트랙트 개발/테스트/배포 실습

Seungwon Go
ReturnValues
Published in
27 min readSep 16, 2018

Truffle Framework(https://truffleframework.com/)는 스마트컨트랙트(Solidity)에 대한 개발/테스트/빌드까지의 전과정을 쉽고 빠르게 할 수 있도록 해주는 프레임워크입니다.

제가 생각하는 가장 큰 장점 중 하나는 실제 테스트넷 혹은 메인넷에 배포하지 않고도 로컬에서 다양한 테스트케이스를 작성해서 빠르게 테스트가 가능하다는 것입니다. 만약에 Truffle 같은 프레임워크가 없다면, 개발된 스마트컨트랙트를 테스트 하기 위해서 DApp을 개발해야 하고, 메타마스크를 통해 테스트 케이스를 하나 하나 실행해야 하는 엄청난 수고가 필요하게 됩니다. 그리고 이 수고는 개발이 완료되는 시점까지 계속 반복적으로 수행을 해야 합니다.

자 그럼 Truffle Framework 기반으로 개발하기 위한 환경설정을 해보도록 하겠습니다.

스마트컨트랙트 개발환경 설정하기

Node.js는 설치가 되었다고 가정하겠습니다. 혹시 안되셨다면 이곳(https://nodejs.org/en/)에서 자신에 맞는 버전을 설치하세요.

터미널을 열어서 아래의 명령어를 통해 Truffle를 설치하세요.

npm install -g truffle

스마트컨트랙트 개발을 진행하기 위해 프로젝트 폴더를 하나 만들도록 하겠습니다. 원하는 위치에 폴더를 하나 만드세요. 저는 truffle-demo 라는 이름으로 폴더를 생성하였습니다.

터미널에서 앞서 생성한 폴더로 이동한 후에 아래의 명령어를 실행하세요.

truffle init

위에 명령어를 실행하면 아래와 같이 비어 있던 폴더 안에 새로운 폴더/파일들이 자동으로 생성이 됩니다.

truffle init 명령어를 통해 생성된 폴더 및 파일에 대해서 간략히 설명을 드리도록 하겠습니다.

  • contracts(폴더) : solidity로 개발된 스마트컨트랙트 파일을 저장하는 폴더입니다.
  • Migrations.sol(파일) : 우리가 개발한 스마트컨트랙트 프로그램을 배포를 해야하는데, 이 파일은 배포를 위한 solidity 파일로써 삭제하시면 안됩니다.
  • migrations(폴더) : 배포를 위한 스크립트 파일 폴더입니다. 스마트컨트랙트 프로그램을 하나 개발할때마다 migration 파일도 이에 대응되서 하나씩 추가되는것을 나중에 확인할 수 있습니다. 그리고 각 파일은 순서를 가지고 있습니다.
  • 1_initial_migration.js(파일) : Migrations.sol을 배포하기 위한 스크립트 파일입니다.
  • test(폴더) : 개발된 스마트컨트랙트를 테스트 하기 위한 폴더 입니다. 해당 폴더에 테스트 케이스를 작성하고, truffle test 는 명령어를 통해 개발된 스마트컨트랙트를 테스트 해 볼 수 있습니다.
  • truffle.js(파일) : truffle 설정 파일입니다. 개발을 위한 host, port, network ID 등을 설정해 놓고 사용하게 됩니다.
  • truffle-config.js(파일) : 이 파일 역시 truffle 설정 파일이며, truffe.js 파일이 없는 경우에 적용되는 파일입니다.

ERC20 토큰 개발에 앞서 ERC20이 무엇인지 간략하게 알아보도록 하겠습니다.

이더리움에서는 표준을 제안하기 위해 개발자는 EIP (Ethereum Improvement Proposal 이더리움 개선 제안서)를 제출합니다. 그리고 이것이 승인을 받게되면 ERC(Ethereum Request for Comments)가 되는 것입니다. 20은 제안서를 구분하기 위한 숫자라고 생각하면 됩니다.
토큰 생성을 위해서 제안된 ERC는 ERC20말고도 있지만, 거의 대부분 여러분이 알고 있는 EOS, Filecoin, Bancor, Qash, Bankex 토큰 모두가 ERC20 기반으로 만들어진 토큰입니다. 물론 EOS 같은 경우는 현재는 이더리움에서 나와서 토큰이 아닌 코인으로써 별도의 블록체인 플랫폼을 제공하고 있습니다.

현재 진행되고 있는 거의 모든 ICO에서 사용되고 있는 토큰은 모두 ERC20 기준으로 생성된 토큰이라고 생각하시면 됩니다. 그만큼 토큰생성시 기준이 되는 표준이라고 보시면 됩니다.

자 이제 ERC20 토큰 스마트컨트랙트를 개발해 보도록 하겠습니다.
다행히 openzeppelin이라는 오픈소스가 있는데, 토큰 및 crowdsale 관련 기본적인 스마트컨트랙트를 제공합니다. 이를 이용하면 원하는 기능의 토큰을 아주 쉽게 개발해 볼 수 있습니다.

그럼 openzeppelin를 아래의 명령어를 이용해서 설치해 보도록 하겠습니다.

npm install openzeppelin-solidity --save

node_modules 폴더 밑으로 openzeppelin-solidity 폴더가 생성된것을 확인 할 수 있습니다.

스마트컨트랙트 개발하기

저는 개발 에디터로 Visual Studio Code를 사용하도록 하겠습니다. contracts 폴더에 SampleToken.sol 이라는 파일을 생성하세요.
그리고 아래 코드를 일단 복사해서 넣으세요.

pragma solidity ^0.4.24;contract SampleToken {}

첫줄에 있는 pragam solidity ^0.4.24; 는 현재 개발하고 있는 solidity 프로그램을 컴파일 할때 어떤 버전으로 할것인지를 정의해 놓게 됩니다. 이렇게 하는 이유는 현재 soildity 프로그램은 계속 업그레이드 중이고, 각 버전별로 제공하는 프로그램 코드가 상의하기 때문에 개발 시점에 버전을 정의 한 후 나중에 실제 동작할때도 동일한 버전으로 동작하게 하기 위함입니다.

우리는 앞서 오픈소스인 openzeppelin를 설치를 했습니다. openzeppelin에서 제공하는 코드 중 openzeppelin-solidity / contracts / token / ERC20 폴더 안에 있는 이미 개발되어진 solidity 프로그램을 상속 받아서 사용할 것입니다.

ERC20 폴더에 있는 solidity 프로그램 중 우리가 상속을 받아서 사용하게 될 프로그램을 먼저 살펴보도록 하겠습니다.

에디터에서 DetailedERC20.sol 파일을 열어보도록 하겠습니다.

ERC20Detailed

ERC20Detailed.sol 스마트컨트랙트는 기본적으로 ERC20 프로그램을 상속받고, 토큰이름(name), 토큰심볼(symbol), 토큰 소주점 단위(decimals)를 선언할 수 있도록 되어 있습니다. 즉 자신의 원하는 토큰 이름과 심볼, decimals를 선언해서 새로운 토큰을 만들수 있도록 해줍니다.

여기서 꼭 알고 넘어가야 할 변수는 decimals 입니다. 우리는 일반적으로 소수점이라고 1.36과 같이 점(.)을 기준으로 1보다 작고 0보다 큰수를 의미합니다.
만약에 우리가 소수점 이하 2자리 까지만 우리가 발행한 토큰을 사용하고 싶다면 decimals에 2라고 정의를 하면 됩니다. 보통 이더리움(ETH)는 decimals를 18자리로 정의해서 사용하고 있으므로, 이더리움 기반으로 발행되는 우리 토큰 역시 decimals를 18로 정의하는 것이 좋습니다.

그런데 이더리움에서는 실제 숫자를 다룰때 소수점을 사용하지 않습니다. 그래서 토큰의 decimals 역시 정수로 정의를 하게 되고, 나중에 선언하게 될 토큰 총발행양을 정확히 이해하기 위해서는 decimals를 정확히 이해해야 합니다.

예를 들어, 토큰 총 발행양(total supply)을 100,000개로 선언하고 decimals를 3으로 선언했다면 실제 토큰은 100.000가 되게 됩니다. 이 부분을 혼동해서는 안됩니다.

그럼, ERC20Detailed 컨트랙트를 상속받아서 우리가 발행한 신규 토큰을 정의해 보도록 하겠습니다.

pragma solidity ^0.4.24;import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";contract SampleToken is ERC20Detailed {    constructor(string name, string symbol, uint8 decimals)    ERC20Detailed(name, symbol, decimals)    public {    }}

ERC20Detailed.sol을 우리가 개발하고 있는 프로그램에서 사용하기 위해서 import를 합니다.

그리고 우리가 정의한 contract에서 ERC20Detailed을 상속받습니다.

ERC20Detailed을 상속받습니다.

우리가 개발할 신규 토큰 컨트랙트가 완성이 되면, 이더리움 테스트넷 혹은 메인넷으로 해당 컨트랙트를 deploy 할 것이고, 이때 contract를 생성할 파라미터에 변수를 선언하게 될 것입니다.

컨트랙트 생성시 토큰 생성을 위해 필요한 변수를 선업합니다

우리가 상속받은 ERC20Detailed.sol의 경우 인터페이스만 선언되어 있으므로, 이를 좀 더 구체적으로 완성하기 위해서는 우리는 하나의 컨트랙트를 추가적으로 상속 받도록 하겠습니다.

openzeppelin-solidity / contracts / token / ERC20 폴더에 있는 ERC20.sol을 열어보시면 ERC20에서 정의된 인터페이서에 대한 구체적인 코드가 완성되어져 있습니다.

그럼 우리 코드를 ERC20.sol 파일을 상속 받도록 수정하도록 하겠습니다.

pragma solidity ^0.4.24;import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";import "openzeppelin-solidity/contracts/ownership/Ownable.sol";contract SampleToken is ERC20Detailed, ERC20, Ownable {constructor(string name, string symbol, uint8 decimals, uint256 totalSupply)ERC20Detailed(name, symbol, decimals)public {_mint(owner(), totalSupply * 10**uint(decimals));}}

ERC20Detailed, ERC20을 상속받음으로써 기본기능을 갖는 토큰이 완성되었습니다. 우리는 앞으로 기능 몇개를 더 추가할 것이지만, 이쯤에서 개발된 프로그램을 테스트하고 deploy 하는 것을 먼저 진행해 보도록 하겠습니다.

스마트컨트랙트 Compile하기

먼저 지금까지 개발된 프로그램을 compile 해보도록 하겠습니다.
터미널에서 아래 명령어를 실행하세요.

truffle compile

개발된 프로그램에 이상이 없다면 아래와 같은 출력 메시지를 확인할 수 있을것입니다.

프로그램에서 import 받고 있는 모든 파일을 찾아서 컴파일을 진행하게 됩니다. 그리고 컴파일이 정상적으로 진행이 되면, 프로젝트 폴더 밑에 build라는 폴더와 컴파일된 Solidity 프로그램과 1:1로 대응되는 json 파일이 build 폴더 밑에 생성된것을 아래처럼 확인할 수 있습니다.

마이그레이션 파일 생성하기

migrations 폴더에 2_contract_migration.js 파일을 생성한 후 아래의 코드를 복사해 넣습니다.

var SampleToken = artifacts.require("./SampleToken.sol");const _name = "TestToken";
const _symbol = "TTK";
const _decimals = 18;
const _total_supply = 1000000;
module.exports = function(deployer) { deployer.deploy(SampleToken, _name, _symbol, _decimals, _total_supply);};

테스트케이스 작성하기

테스트넷에 deploy하기 앞서 우리가 작성한 스마트컨트랙트가 제대로 동작하는지 테스트 케이스를 작성한 후 테스트 해보도록 하겠습니다.

테이스 케이스를 작성할때 사용해야 할 다양한 기능을 다행히도 open-zeppelin에서 개발해 놓은것이 있어서 우리는 그것을 사용하도록 하겠습니다. 아래 주소에서 helpers 폴더를 다운로드 받아서 프로젝트 폴더에 저장하도록 하겠습니다.

test 폴더에 SmapleToken.test.js 파일을 생성한 후 아래 코드를 복사해 넣겠습니다.

const { expectThrow } = require("../helpers/expectThrow");const { EVMRevert } = require("../helpers/EVMRevert");const SampleToken = artifacts.require("SampleToken");const BigNumber = web3.BigNumber;require("chai").use(require("chai-bignumber")(BigNumber)).should();contract("SampleToken", function([_, owner, investor]) {    let token;    const _name = "SampleToken";    const _symbol = "STK";    const _decimals = 18;    const _total_supply = new BigNumber(1000000);    const _over_total_supply = new BigNumber(1100000000000000000000000);    beforeEach(async function() {        token = await SampleToken.new(_name, _symbol, _decimals, _total_supply, {from: owner        });    });    it("has a name", async function() {        (await token.name()).should.eq(_name);    });it("has a symbol", async function() {(await token.symbol()).should.eq(_symbol);});it("has 18 decimals", async function() {(await token.decimals()).should.be.bignumber.equal(_decimals);});it("has " + String(1000000000000000000000000) + " total supply",async function() {(await token.totalSupply()).should.be.bignumber.equal(1000000000000000000000000);});it("assigns the initial total supply to the creator", async function() {const totalSupply = await token.totalSupply();const ownerBalance = await token.balanceOf(owner);ownerBalance.should.be.bignumber.equal(totalSupply);});it("transfer token to the investor", async function() {await token.transfer(investor, 1000, { from: owner });const investorBalance = await token.balanceOf(investor);investorBalance.should.be.bignumber.equal(1000);});it("transfer token to the investor", async function() {await token.transfer(investor, 1000, { from: owner });const investorBalance = await token.balanceOf(investor);investorBalance.should.be.bignumber.equal(1000);});it("should reject transfer token(more than has) to the investor", async function() {await expectThrow(token.transfer(investor, _over_total_supply, { from: owner }),EVMRevert);});});

위의 테스트 코드는 총 8개를 테스트 하도록 작성이 되었습니다.

  1. 생성된 토큰의 이름이 변수로 지정한 이름과 동일한지 체크
  2. 생성된 토큰의 심볼이 변수로 지정한 심볼과 동일한지 체크
  3. 생성된 토큰의 decimals이 변수로 지정한 decimal과 동일한지 체크
  4. 생성된 토큰의 총발행양이 변수로 지정한 총발행양과 동일한지 체크
  5. 토큰 생성자의 address로 발행된 모든 토큰이 transfer 되었는지 체크
  6. 토큰 owner가 특정 address로 원하는 만큼의 토큰을 전송할 수 있는지 체크
  7. 남아 있는 토큰양 보다 더 많은 토큰을 전송하려고 할때 정상적으로 revert가 되는지 체크

테스트/배포 환경 설정하기

프로젝트 폴더를 보시면 truffle.js, truffle-config.js 파일이 있습니다. truffle.js 파일을 열어서 아래와 같이 환경설정을 합니다.

module.exports = {networks: {development: {host: "localhost",port: 7545,network_id: "*"}}};

다음으로는 로컬환경에서 테스트용 account를 사용하기 위해서 Ganache을 설치합니다. Ganache는 https://truffleframework.com/ganache 에서 다운로드 후 설치하세요.

Ganache을 실행하신 후 오른쪽 상단의 설정 아이콘을 클릭하여 설정화면으로 이동합니다. 그리고 port number를 우리가 truffle.js 파일에 설정한 7545로 맞추어 줍니다.

자 이제 테스트할 환경 준비는 모두 끝나고, 앞서 작성한 스마트컨트랙트를 터미널에서 아래의 명령어를 통해 테스트를 실행하도록 하겠습니다.

truffle test ./test/SampleToken.test.js

아마 아래와 같이 터미널에 에러메시지가 출력이 될것입니다.

테스트를 하기 위해서는 web3 모듈이 있어야 합니다. 이 외에도 테스트케이스를 작성하기 위해 복사해서 넣었던 helpers 폴더에 있는 여러 function을 사용하기 위해서는 web3 외에도 몇개의 모듈이 더 필요합니다.

아래 명령어를 하나씩 실행해서 필요한 모듈을 모두 설치하도록 하겠습니다.

npm i web3 --save
npm i chai --save
npm i chai-bignumber --save

이제 다시한번 테스트 명령어를 통해 테스트를 진행해 보도록 하겠습니다.

truffle test ./test/SampleToken.test.js

작성된 테스트케이스에 따라 테스트가 진행이 되며, 각 케이스별 결과가 터미널에 아래와 같이 출력이 됩니다.

위에서 보는 것 처럼 8가지 테스트 케이스가 모두 정상적으로 수행이 됐음을 알수 있습니다.

테스트넷에 배포하기

테스트넷 혹은 메인넷에 배포하기 위해서는 truffle.js에 배포하기 위한 설정을 아래와 같이 추가를 해야 합니다.

require("dotenv").config();const HDWalletProvider = require("truffle-hdwallet-provider-privkey");const privateKeys = [process.env.PRIVATEKEY];module.exports = {networks: {development: {host: "localhost",port: 7545,network_id: "*" // eslint-disable-line camelcase},ropsten: {provider: () =>new HDWalletProvider(privateKeys,"https://ropsten.infura.io/" + process.env.INFURA_API_KEY),network_id: 3,gas: 4700000}}};

dotenv와 truffle-hdwallet-provider-privkey를 이용하기 위해서 아래 명령어를 통해 모듈을 차례대로 설치하도록 하겠습니다.

npm i dotenv --save
npm i truffle-hdwallet-provider-privkey --save

dotenv는 필요한 키값을 저장한 후 실행환경에서 가져다가 사용할 수 있도록 해주는 모듈입니다.

테스트넷에 스마트컨트랙트를 배포하기 위해서 컨트랙트의 owner가 될 account를 https://www.myetherwallet.com/ 에서 account를 생성하고, https://infura.io/ 에서 앞서 생성한 account를 기반으로 INFURA API KEY를 생성해야 합니다.
관련 내용은 이 포스팅에서는 다루지 않겠습니다. 검색하시면 아주 많은 곳에서 관련 내용을 다루고 있으니, 다른 포스팅을 통해 위의 두 작업을 진행하세요.

프로젝트 루트 폴더에 .env 파일을 생성하세요.
.env 파일에 아래와 같이 위에서 생성한 account의 PRIVATEKEY와 INFURA_API_KEY를 저장하세요.

PRIVATEKEY=INFURA_API_KEY=

자 이제 테스트넷에 개발된 컨트랙트를 배포하도록 하겠습니다.

저는 ropsten 테스트넷으로 배포할것이고, 아래의 명령어를 통해 배포를 할 수 있습니다.

truffle migrate --reset --network ropsten

컨트랙트가 정상적으로 배포가 되었다면 터미널에서 아래와 같은 메시지를 출력해 줄것입니다.

https://ropsten.etherscan.io/ 사이트를 열어서 생성된 토큰 컨트랙트 주소로 검색을 해보도록 하겠습니다. 아래와 같이 정상적으로 토큰이 생성된 것을 확인할 수 있습니다.

스마트컨트랙트 Verify And Publish하기

Code 탭을 열고 Verify And Publish를 클릭하면, 배포된 스마트컨트랙트에 대한 코드를 verify 할수 있는 화면으로 이동을 하게 됩니다.

배포된 스마트컨트랙트를 Verify 하기 위해서는 프로그램내에서 import 되고 있는 코드 전부가 필요합니다.
truffle-flattener 모듈은 solidity내에서 참조하고 있는 모든 파일을 가져와 하나의 파일로 만들어주는 모듈입니다.

아래의 명령어를 통해 truffle-flattener 설치하도록 하겠습니다.

npm i truffle-flattener --save

설치가 완료되었다면, truffle-flattner를 통해 참조되고 있는 모든 코드를 포함한 하나의 파일을 만들어 보도록 하겠습니다.
우선 프로젝트 루트에 flat 이라는 이름으로폴더를 생성하세요.

터미널에서 아래의 명령어를 실행하세요.

truffle-flattener ./contracts/SampleToken.sol > ./flat/SampleToken_flat.sol

명령어가 실행이 되면, 터미널에 SampleToken.sol에서 import하여 사용하는 컨트랙트 뿐만 아니라, import한 컨트랙트 파일 내에서 참조하고 있는 모든 컨트랙트 코드를 찾아와서 하나로 합친 후 flat 폴더에 SampleToken_flat.sol를 생성해 줍니다.

SampleToken_flat.sol 파일을 열어서 전체 코드를 복사한 후 https://ropsten.etherscan.io/ 에 배포된 SampleToken 컨트랙트의 Code 탭 / Verify And Publish에 아래와 같이 붙여넣기 해줍니다.

Contract Name에는 SampleToken, Compiler를 선택하고, Optimazation은 No을 선택한 후 하단의 Verify And Publish 버튼을 클릭합니다.

정상적으로 컨트랙트가 Verify가 되었다면 아래와 같은 성공 화면을 볼수 있을 것입니다.

Successfully generated ByteCode and ABI for Contract Address를 클릭하면 우리가 배포한 컨트랙트인 SampleToken 화면으로 이동을 하게 되고, 코드를 Verify하기 전과 달리 아래의 이미지 처럼 Code 탭에는 truffle-flattener로 생성한 전체 컨트랙트 코드가 보이고, Read Contract, Write Contract와 같은 새로운 탭이 활성화가 됩니다.

Read Contract 탭을 클릭하면 아래와 같이 토큰 생성 정보를 상세히 확인할 수 있습니다.

Write Contract 탭을 클릭하면 메타마스크와 연결하여 우리가 생성한 토큰 컨트랙트에서 제공하는 function을 바로 실행해 볼 수 있습니다.

여러분은 방금 ERC20토큰을 구현하여 테스트넷에 정상적으로 배포하였습니다. 메인넷에 배포하는 방법 역시 이와 동일합니다.

truffle.js에 메인넷 배포 환경 아래와 같이 설정하고 migrate 실행 시 메인넷을 선택만 해주면 메인넷으로 배포가 되게 됩니다.

require("dotenv").config();const HDWalletProvider = require("truffle-hdwallet-provider-privkey");const privateKeys = [process.env.PRIVATEKEY];module.exports = {networks: {development: {host: "localhost",port: 7545,network_id: "*"},ropsten: {provider: () =>new HDWalletProvider(privateKeys,"https://ropsten.infura.io/" + process.env.INFURA_API_KEY),network_id: 3,gas: 4700000},main: {provider: () =>new HDWalletProvider(privateKeys,"https://mainnet.infura.io/" + process.env.INFURA_API_KEY),network_id: 1,gas: 4700000}}};

토큰 기능 확장하기

MintableToken, PausableToken, BurnableToken을 상속 받아서 토큰 기능을 확장해 보도록 하겠습니다.

  • MintableToken : 토큰을 추가적으로 발행할 수 있도록 해줍니다.
  • PausableToken : 특정 상황에서 토큰을 Pause 시켜서, transfer, approval 등 토큰 기능을 정지 시킵니다.
  • BurnableToken : 남아 있는 토큰을 소각시킬 수 있습니다.
pragma solidity ^0.4.24;import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";import "openzeppelin-solidity/contracts/token/ERC20/ERC20Pausable.sol";import "openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";import "openzeppelin-solidity/contracts/ownership/Ownable.sol";contract SampleToken is ERC20Detailed, ERC20, ERC20Mintable, ERC20Pausable, ERC20Burnable, Ownable {constructor(string name, string symbol, uint8 decimals, uint256 totalSupply)ERC20Detailed(name, symbol, decimals)public {_mint(owner(), totalSupply * 10**uint(decimals));}}

위에서 진행한 테스트 및 배포 과정을 통해 추가된 기능이 포함된 스마트컨트랙트를 배포해 보세요.

우리는 오픈소스인 openzeppelin를 통해 손쉽게 ERC20 토큰을 생성할 수 있었습니다. 우리가 생성한 토큰은 가장 일반적인 기능을 가지고 있는 컨트랙트입니다. 좀 더 발전된 형태의 토큰 컨트랙트를 생성하기 위해서 openzeppelin 내의 컨트랙트 코드를 꼭 분석해 보시길을 권합니다.

실습을 끝내며

여기까지 잘 따라왔다면, 여러분은 이미 Truffle Framework를 이용하여 스마트컨트랙트를 생성하고 테스트하여 배포하는것에 대한 충분한 실습이 되었을 것이라 생각합니다.

다음 포스팅에서는 이번시간을 통해서 만들어진 스마트컨트랙트를 웹을 통해 원하는 토큰을 발행하는 DApp을 개발하는 실습을 진행해 보도록 하겠습니다.

블록체인 기술 성공하기 위해서는 훌륭한 서비스 DApp이 많이 나와야 합니다. 당연히 블록체인의 코어를 이해하는 연구가 있어야 겠지만, 이와 더불어 DApp을 개발하는 데 필요한 다양한 기술 역시 많이 공유가 되어야 할것 같습니다.

위에서 진행된 코드는 모두 github에 올려놨으니, 아래 주소를 통해 다운받으실 수 있습니다.

https://github.com/returnvalues/truffle-tutorial-token.git

--

--