[KR][ERC20 토큰 만들어 보기] YouRyuCoin 제작
어느 날 부자가 위험에 처했다. 그는 현금도 카드도 없었고, 지나가는 일반인 A가 부자를 도와주었다.
부자는 A에게 꼭 사례를 하겠다고 특별한 명함을 건내주었다. 언제든 필요할 때 명함에 적혀있는 곳으로 찾아오라고 했고, 시간이 지나 A는 명함의 주소로 찾아갔다. 부자가 부재중이였음에도 불구하고, 그 명함으로 A는 엄청난 대우를 받을 수 있었다.
언제였는지 기억은 나지 않지만 어디선가 듣고 보았던 이야기가
토큰을 발행하려고 소스코드를 작성하다가 문득 떠올랐다.
'꼭 토큰, 코인은 가치를 가지고 있어야할까?' 1토큰 당 nBTC or nKRW
어쩌면 토큰이 누군가에겐 명함의 역할을 할 수도 있겠다라고 생각하고
곧 3주년을 앞둔 우리 커플을 위해 토큰을 발행해보기로 했다.
ERC20 표준 함수
https://theethereum.wiki/w/index.php/ERC20_Token_Standard
해당 링크에 들어가면 ERC20 표준 함수들을 볼 수 있다.
5 contract ERC20Interface {
6 function totalSupply() public constant returns (uint);
7 function balanceOf(address tokenOwner) public constant returns (uint balance);
8 function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
9 function transfer(address to, uint tokens) public returns (bool success);
10 function approve(address spender, uint tokens) public returns (bool success);
11 function transferFrom(address from, address to, uint tokens) public returns (bool success);
12
13 event Transfer(address indexed from, address indexed to, uint tokens);
14 event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
15 }
표준 함수는 필수로 적어야 한다. 대부분의 ERC20 토큰 소스코드들이 대부분 비슷한데.
ERC20의 요구사항 그리고 딱히 추가해야할 소스가 없기 때문인 것같다..
가끔 토큰마다 볼 수 있는 함수들은 Lock (일정 조건 동안 해당 토큰에 대한 송금을 금지 시킨다.)
토큰 소각, 추가 발행 소스들이다.
처음에는 '굳이 토큰 소각 소스를 넣어야 되나? '라는 의문이 들었다.
투자자일 때
토큰 소각이란 이상한 주소값을 입력하여 그 곳에 토큰을 보내는 것
으로 이해했기 때문이였다.
하지만 소스 코드에서는 totalSupply 라는 uint 변수의 개수를 직접 변경하므로 etherscan, coinmarketcap 과 같은 사이트에서 표현되는 총 발행량을 조정할 수 있도록 설계 되어있었다.
추가발행의 경우 토큰 소각 소스를 역이용하면 가능했다.
의문이 들었던 Contract Source는 selfdestrcut(계약파기 함수)가 추가 되어있었던 것이였는데..
유류 코인의 경우 해당 기능은 넣지 않았다. 또한, 중요한 admin 만 접근이 가능한 소각, 추가발행의 경우 첫 계약자만 접근이 가능한 modifier를 추가 하였다.
이렇게 기본적인 기능들을 갖춘 ERC20 Base YouRyuCoin 소스가 완성 되었다.
https://github.com/RyuChain/RyuChain/tree/master/YouRyuCoin
메인 넷에 컨트랙트 올리기!
사실 YRC 이전에 RZZ(류짱 코인)을 만들다 실패를 하여.. 가스비를 꽤나 날렸다.
Decimal에 대한 오해가 있었기 때문이다.
Decimal는 소수점으로 ETH의 wei,Gwei와 같이 해당 코인의 최소 단위를 설정하는 것인데.
보통 Decimal 18을 입력한다. 물론 토큰에 따라 8, 12 등 다양하지만 대부분이 18 단위이다.
TotalSupply = 1000 Decimals = 18 를 입력하여 류짱코인을 만들었는데.
Etherscan에서 나오는 TotalSupply는 0.00000000000001000 이였다.
처음에는 이 문제를 해결하기 위해서 생성자에서 직접 10의 decimals 을 곱했다.
_totalSupply = 1000000 * 10**uint(decimals);
이렇게 된다면 인자값에 1000을 입력하면 totalsupply가 그대로 1,000개가 되기 때문이다.
// ------------------------------------------------------------------------
114 // Constructor
115 // ------------------------------------------------------------------------
116 function FixedSupplyToken() public {
117 symbol = "FIXED";
118 name = "Example Fixed Supply Token";
119 decimals = 18;
120 _totalSupply = 1000000 * 10**uint(decimals);
121 balances[owner] = _totalSupply;
122 Transfer(address(0), owner, _totalSupply);
123 }
하지만 또 다른 문제가 나타났다.
// ------------------------------------------------------------------------
143 // Transfer the balance from token owner's account to `to` account
144 // - Owner's account must have sufficient balance to transfer
145 // - 0 value transfers are allowed
146 // ------------------------------------------------------------------------
147 function transfer(address to, uint tokens) public returns (bool success) {
148 balances[msg.sender] = balances[msg.sender].sub(tokens);
149 balances[to] = balances[to].add(tokens);
150 Transfer(msg.sender, to, tokens);
151 return true;
152 }
ERC20 표준에 따른 transfer 함수에는 10의 decimal승을 곱해주는 소스코드가 없기 때문에 500개를 송금한다고 하면, 이전과 마찬가지로 0.000000000~~~~~500개만 송금이 되는 문제가 발생 되었다.
표준 함수를 수정하거나, transfer 함수에 0 18개를 붙여서 송금을 하느냐의 문제가 생겼는데.
표준 함수는 함부로 수정해서는 안된다라는 조건이 있었기에 0 18개를 붙이기로 했다.
여러가지를 알아보니, MyEtherWallet , Exchange 등에서는 transfer의 amounts를 해당 플랫폼들이 유저들이 편하게 이용할 수 있도록 decimals를 곱하여 해당 컨트랙트에 보내는 것을 알아냈다.
즉, 개발자가 테스트를 하기 위해 직접 컨트랙트를 사용할 때는 10의 decimal 승을 직접 곱해야하지만 일반 유저들이 사용하는 플랫폼에서는 그것을 자동적으로 해결해 준다.
그렇게 난 Mainnet에 유류코인을 등록했다.
https://etherscan.io/token/0xffa5e772565712cd35b5a897faf49348be8900a8
이렇게 유류코인이 생성 되었다. 해당 컨트랙트 소스코드 공개 및 etherscan에서 제공해주는 link를 등록하는 것은 추후 포스팅!!
채굴하는거랑 무엇이 다른가여
ERC20 의 경우, 이더리움 플랫폼 위에서 존재 하기 때문에 자체적인 블록체인이 없습니다.
그렇기 때문에 채굴이 없습니다.
흔히 저희가 알고 있는 ico의 경우 대부분 ERC20 (ETH) , QRC20 (Qtum) 등으로 만든 후, 자체 블록체인이 필요한 경우에 한하여, 토큰 스왑등을 해주는 형태입니다!
ㅎㅎ좋네요..
저도 조만간에 코인을 발행해봐야겠어요ㅋㅋ
가즈아아앙
요새 이더 오픈소스활용하기 공부중인데 참 흥미롭더라고요:) 이해잘되게
설명해주셔서 감사합니닷 - 팔로우해요^^
감사합니다 :)