관리 메뉴

올해는 머신러닝이다.

[DAPP] ERC20 토큰을 만들어서 배포까지 본문

스터디/DAPP

[DAPP] ERC20 토큰을 만들어서 배포까지

리엑티브한 행복한 수지아빠 2018.03.21 21:06

광고한번 눌러주시면 크게 힘이 됩니다. 


이번 포스팅은 제 딸들 코인인 수지토큰 을 발행해보겠습니다.

우선 토큰과 코인은 차이가 있습니다. 






그럼 시작해보겠습니다. 


우선 결과물은 다음과 같습니다.

이더리움에 올릴수 있는 토큰은 ERC20 규격으로 만들수 있다. 이 토큰을 가지고 ICO에 올려서 서로간의 거래를 할 수 있습니다. 

그럼 시작해보자. 

ERC20 위키바로가기

규격 인터페이스 형태는 다음과 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
contract ERC20Interface {
    //총 갯수
    function totalSupply() public constant returns (uint);
    //주어진 토큰오너에 대한 잔액조회
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    //소유자가 승인 할 수 는 토큰 양을 반환합니다. 
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    //to 에게 토큰을 전송한다. 
    function transfer(address to, uint tokens) public returns (bool success);
    //트큰을 원래주인으로부터 다른사람에게 전송함을 승인한다. 
    function approve(address spender, uint tokens) public returns (bool success);
    //from -> to 을 토큰을 전송 : 성공/실패
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
 
    //전송 이벤트
    event Transfer(address indexed from, address indexed to, uint tokens);
    //승인 이벤트
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
cs

필요한 지식은 다음과 같다.. 

  • DAPP
  • Truffle
  • Node
  • MetaMask
  • MyEtherWallet
  • Javascript

여기에선 Truffle 이더리움 프레임워크를 이용해서 쉽게 만들어볼것이다. 

우선 설치를 해보자. 

npm install -g truffle

그리고 원하는 위치에 폴더를 만들고 초기화를 진행한다. 

1
2
3
mkdir sugi-coin
cd sugi-coin
truffle init
cs



처음 트리 구조는 위와 같다.

그리고 오픈재플린( OpenZepplin ) 을 라이버러리를 설치를 해보자. 

유용한 계약들을 손쉽게 쓸수 있도록 제공해주는 DAPP 개발시 필수 라이버러리이다. 

토큰 규약 말고도 여러가지가 미리 포함되어 있다. 

1
npm install zeppelin-solidity -save
cs

그럼 contract 를 작성해보자.

contract 폴더내에 sujicoin.sol 을 작성한다. StandardToken 을 상속받는다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
 
contract Sujicoin is StandardToken {
    string public name = "Sujicoin"
    string public symbol = "SUJI"//통화단위
    uint public decimals = 2//자리수
    uint public INITIAL_SUPPLY = 10000 * (10 ** decimals); //초기 공급량
 
    //생성자
    function Sujicoin() public {
        balances[msg.sender] = INITIAL_SUPPLY;
    }
}
cs

그리고 배포를 위해 migrations 폴더에 파일을 새로 만든다. 

1
2_deploy_sujicoin.js
cs

소스는 아래와 같이 작성한다.

1
2
3
4
5
var SujiCoin = artifacts.require("./Sujicoin.sol");
 
module.exports = function(deployer) {
    deployer.deploy(SujiCoin);
};
cs

그리고 루트 폴더에 보면 truffle.js 파일이 있을 것이다. 아래와 같은 소스를 넣어준다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
require('dotenv').config();
const Web3 = require("web3");
const web3 = new Web3();
const WalletProvider = require("truffle-wallet-provider");
const Wallet = require('ethereumjs-wallet');

var rinkebyPrivateKey = new Buffer("private key", "hex")
var rinkebyWallet = Wallet.fromPrivateKey(rinkebyPrivateKey);
var rinkebyProvider = new WalletProvider(rinkebyWallet, "https://rinkeby.infura.io/");


module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // Match any network id
},
rinkeby: {
provider: rinkebyProvider,
gas: 4600000,
gasPrice: web3.toWei("20", "gwei"),
network_id: "3",
}
}
};
cs


[ RINKEBY_PRIVATE_KEY ] 에 지갑에서 private key를 넣어주자. 

여기에서는 Metamask 를 이용한다.

Private key 추출은 Metamask 를 통해서 할수 있다. 



서버는 Rinkeby 테스트 서버를 이용한다. 

그리고 배포를 진행해본다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>> truffle deploy --network rinkeby
Compiling .\contracts\SujiCoin.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol...
Compiling zeppelin-solidity\contracts\math\SafeMath.sol...
Compiling zeppelin-solidity\contracts\token\ERC20\BasicToken.sol...
Compiling zeppelin-solidity\contracts\token\ERC20\ERC20.sol...
Compiling zeppelin-solidity\contracts\token\ERC20\ERC20Basic.sol...
Writing artifacts to .\build\contracts
 
Using network 'rinkeby'.
 
Running migration: 1_initial_migration.js
  Replacing Migrations...
  ... 0x2ce47755f6112ab384a14910656eddb18fa94061cc1dc0349f7b899fb3ba9f84
  Migrations: 0x5903b751a054c281f12a354a8d9bb2304a584447
Saving successful migration to network...
  ... 0x6a7b74a8d897593042da8b7f349a39e5238f5ed2dce302965ef50ccc58b0260c
Saving artifacts...
Running migration: 2_deploy_hamburgercoin.js
  Deploying SujiCoin...
  ... 0x1d52f1e2805d04640d70a8f109f07292bdde2469dd377ac3315964956563ef53
  SujiCoin: 0x2e7b9c9c7c74bac74d069e57128dc66898ff41a9
Saving artifacts...
cs

최종적으로 나온 SujiCoin: 0x2e7b9c9c7c74bac74d069e57128dc66898ff41a9

0x.... 이 부분이 현재 올라간 계약 부분이다. 그럼 잘 올라갔는지 확인해보자. 

여기에서는 Rinkeby test net을 기본으로 한다. 

https://rinkeby.etherscan.io/address/0x2e7b9c9c7c74bac74d069e57128dc66898ff41a9

이 주소로 가서 테스트 서버에 정상적으로 올라갔는지 확인 해본다. 

성공적으로 올라간 것을 볼 수 있다. 그러면 이걸 다시 제대로 등록 되는 지 확인해보자. 

Address( 0x2e7b9c9c7c74bac74d069e57128dc66898ff41a9 ) 을 복사를 해서 Metamask 토큰에 넣어보자.


토큰 등록하기

주소 입력하기

위와 같이 SUJI 토큰이 등록된 걸 볼 수 있다.

그럼 전송을 서로간에 해보자.

우선 https://www.myetherwallet.com/ 으로 가보자.

오른쪽에 보면 Metamask 연동하는 부분이 보인다. 클릭하자.



계정을 바꾸는 방법은 오른쪽 상단 클릭시 변경가능하다. 

이렇게 해서 수지토큰 이 탄생되었다. 



5 Comments
댓글쓰기 폼