광고한번 눌러주시면 크게 힘이 됩니다.
이번 포스팅은 제 딸들 코인인 수지토큰 을 발행해보겠습니다.
이더리움에 올릴수 있는 토큰은 ERC20 규격으로 만들수 있다. 이 토큰을 가지고 ICO에 올려서 서로간의 거래를 할 수 있습니다.
그럼 시작해보자.
규격 인터페이스 형태는 다음과 같다.
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 연동하는 부분이 보인다. 클릭하자.
계정을 바꾸는 방법은 오른쪽 상단 클릭시 변경가능하다.
이렇게 해서 수지토큰 이 탄생되었다.
'스터디 > DAPP' 카테고리의 다른 글
Geth를 이용한 dapp 개발 #1 (1) | 2018.04.17 |
---|---|
[DAPP] truffle을 활용한 Pet-Shop 튜터리얼 분석해보자. (0) | 2018.04.01 |
[DAPP] Truffle로 스마트 계약을 테스팅하고 디버깅해보자. (0) | 2018.03.31 |
[DAPP] 크립토좀비 요약 내용[1 ~ 6장] (2) | 2018.03.25 |
[DAPP]예제로 배우는 DAPP 개발편 - 복권편 (3) | 2018.03.19 |