이제 어느정도 Solidity나 Smart contract에 대해서 익숙해진 상황이기 때문에, 실질적으로 ICO를 준비하면서 정말로 활용할 수 있는, 그리고 시중에 유통되고 있는 ERC20 코인들을 만들어보고 싶었습니다.
이런 ERC20 코인들의 특징 중의 하나는 https://etherscan.io/tokens와 같은 공식 사이트에서 공개적으로 거래 내역 및 잔액을 확인할 수 있고, 또 코인을 사고 파는 것을 연계시킬 수 있다는 점입니다! 그리고 만약 제가 ICO를 하게 된다면 그 코인 또한 이렇게 공개적으로 등록이 되어야 하는 것이겠죠.
그렇기 위해서 필요한 것이 바로 ERC20Interface
를 구현하는 것입니다. Java로 치면 Interface를 구현하는 것과 같은 것인데요, 그 골격을 살펴보면 아래와 같습니다.
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);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
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);
}
이 ERC20Interface
는 총 6개의 함수와 2개의 event로 구성되어 있습니다. 각 함수는 customizable합니다. 따라서 여기에서 제시된 것을 참고하시어 맞는 코드를 구성하시면 되겠습니다. 크게 고칠 것은 없지만, 저는 유효 거래를 필터링 하는 부분이 제 기준에 맞지 않아 좀 고쳤습니다.
https://theethereum.wiki/w/index.php/ERC20_Token_Standard#Sample_Fixed_Supply_Token_Contract
어쨌든 이렇게 ERC20Interface
가 구현된 코인을 만들고 그것을 Ropsten 테스트넷에 deploy시켜보겠습니다.
contract ZipToken is ERC20Interface, Owned {
...
우리가 만들 코인 계약은 ERC20Interface
와 Owned
계약을 상속받아 만들어졌습니다. ERC20Interface
에서 선언되어 있는 함수들은 ZipToken
계약 안에서 구체적으로 구현됩니다.
가장 중요한 부분이 계약의 생성자 부분인데요,
function ZipToken() public {
symbol = "ZIP";
name = "ZIP Token from Z-BSI";
decimals = 0;
_totalSupply = 1000000 * 10**uint(decimals);
balances[owner] = _totalSupply;
Transfer(address(0), owner, _totalSupply);
}
일단 연습으로 만들어 볼 코인은 깔끔하게 100만 코인만 만들고 소수점은 없습니다. 코인의 심볼은 “ZIP”이고 코인의 이름은 일단 “ZIP Token from Z-BSI”로 정했습니다. 이 계약을 deploy하게 되면 Ropsten Etherscan에서 해당 코인을 검색하실 수 있게됩니다! https://ropsten.etherscan.io/token/0x9179d7c197fa5a7500a4740ca96b1dde73baf8b2
드디어 테스트넷이긴 하지만 퍼블릭한 최초의 코인을 만들었습니다!! 🙂 이제 이 코인을 실제로 유통할 수 있는지 확인해 보겠습니다. 여기서 제 TREZOR지갑을 사용해보려고 하는데요, 가장 검증된 안전한 하드웨어 지갑입니다 🙂 http://mysafecoin.net/mysafecoin.php
Trezor지갑의 한 주소로 1000코인을 보냅니다. ERC20Interface를 구현한 덕분에 모든 transaction을 모니터할 수 있습니다!
그리고 그 결과 Trezor지갑에서 토큰을 받았음을 확인할 수 있습니다! 여기서는 이더리움 공식 월렛인 https://www.myetherwallet.com를 통해 확인하실 수 있습니다.
왼쪽 아래에 1000 ZIP 코인을 받았음을 확인하실 수 있죠? 🙂
마지막으로 Trezor지갑을 사용하여 이 코인을 다른사람한테 보낼 수 있는지 체크해 보겠습니다.
MyEtherWallet에서 손쉽게 ERC20 코인을 주고받을 수 있습니다.
사이트에서 송금을 신청할 수 있고, (물론 충분한 가스비를 해당 지갑이 가지고 있어야 합니다!) 그것을 하드웨어 지갑인 Trezor에서 최종 승인할 수 있습니다.
이로써 테스트넷이긴 하지만 완벽하게 실제 사용 가능한 코인을 만들었습니다!! 🙂