# Mintable Token 이란? ( Feat.zeppelin-solidity )

## 들어가며
안녕하세요 dongsamb 입니다.
저번 글 [개발자가 마이닝, 구매 없이 이더리움을 얻는 방법들](https://steemit.com/kr/@dongsamb/7jfp1w) 을 통해
처음으로 많은 팔로우와 보팅을 받게되어 개인적으로 큰 원동력이 되었습니다.
많은 개발/비개발자 분들이 이더리움을 통한 개발에 관심을 가지고 계시단 사실도 알게되었고,
여러 곳에서 좋은 기회를 제안해주셨습니다.
이에 보답드리고자 `Ethereum Solidity Smart Contract 분석` 시리즈 **연재를 시작**하고자 합니다.
아직 국내에 실무 solidity 개발에 참고할만한 자료가 활성화되지 않아서
많은 분들이 접근하는데 장벽이 있을거라 생각합니다.
제가 개인적으로 이해하는데 오래걸리고 시행착오를 겪었던 내용 위주로 정리해서 올려보려 합니다.
그 첫번째 주제는 `Mintable Token 이란? ( Feat.zeppelin-solidity )` 입니다! 👏🏻
## Mintable Token 이 뭐지?
ICO 에 관심을 가지고 ICO들의 smart contract 를 유심히 들여다 본 사람이라면
Mintable Token 이란 Contact 명이나 관련 함수, 변수들을 보셨을 겁니다.

위 사진은 [Etherscan](https://etherscan.io/address/0xd26114cd6EE289AccF82350c8d8487fedB8A0C07#code) 에서 OmiseGo Token 의 Smart contract 중
Main 이라 할 수 있는 OMGToken 의 선언부 입니다.
`contract OMGToken is PausableToken, MintableToken{` 로 시작하는데요,
나중에 따로 문법 설명 관련한 연재도 자세히 하겠지만, 간략히 설명하면
OMGToken 이라는 contract 를 선언하는 구문입니다.
이때 `is` 라는 solidity 에서 contract 상속을 할 때 사용하는 지시자를 통해
PausableToken 과 MintableToken 라는 이미 어딘가에 선언된 Contract 를 다중상속 받는 구분입니다.
~~( 우리의 기특한 Solidity 는 무려 다중상속을 지원합니다 )~~
여기서 PausableToken 는 대략 이름에서 유추가능하듯이
Contract 내 특정 기능을 외부 입력에 따라 정지시킬 수 있는 Token 입니다.
그런 특징을 상속받아 OMG에서도 그대로 쓰겠다는 것이겠지요.
그렇다면 Mintable 은..? Mint 하면 가장 먼저 떠오르는 것은
말그대로 민트, 페퍼민트, 민트초코 할때의 그 박하향의 민트일 것입니다. 민트할수있는 토큰이라..

사전 이리저리 뒤져 다른 뜻을 찾아보면
화폐 등을 주조, 발행, 새로 만들어내는 뜻을 가지고 있는것을 발견할 수 있습니다.
뜻에서 알 수 있듯이 토큰을 추가적으로 발행, 주조해내는것이 가능한 Token 이란 뜻 입니다.
그런데 잠깐, 여기서 많은 분들은 ICO가 끝난 Token 이 추가적으로 발행 가능하다는 사실이 의아하실겁니다.
마이닝 같이 채굴과정이 있는것도 아닌데 토큰을 추가발행 할 수 있다면,
총 통화량이 증가하여 토큰의 가치가 하락하게 될테니 말입니다.
하지만 Ethereum smart contract 에 구현된 ERC20 를 따르는 Token 의 경우,
간단하게 보면 사실 총 발행량 `(totalSupply)` 변수와
어느 Account address 가 얼만큼 가지고 있는가 하는 `balances[address]` 리스트로 표현되는 자료구조에 불과합니다.
따라서 총 발행량 `(totalSupply)` 을 증가시키면서 그 증가시킨 Token 양 만큼을
특정 address 에 잔액 값만 증가시키면 토큰이 추가 발행 됐다고 볼 수 있는것 입니다.
생각보다 간단하지 않나요?
대부분의 ICO 등은 Hardcap 까지 Funding 을 받고, 투자자들의 Token 가치를 보존해주기 위해
함부로 Mint 하진 않을 것 입니다. 그러나 Airdrop 과 같은 이벤트을 위해서라던가
기타 추가 발행되어야만 하는 특징을 가진 Token 들도 존재할 수 있습니다.
그럼 실제로 MintableToken 이 어떻게 구현되어있는지 코드로 살펴보겠습니다.
## zeppelin-solidity
MintableToken 코드를 살펴보기 앞서 갑자기 zeppelin-solidity 는 무엇인가 하실 수 있습니다.
[OpenZeppelin/zeppelin-solidity](https://github.com/OpenZeppelin/zeppelin-solidity) 란 smart contract 에 보안 취약점이 있는지 Auditing 서비스를 제공하는
zeppelin 이란 회사에서 오픈소스로 공개한 프로젝트입니다.

여기에는 solidity 로 contract 을 작성함에 있어서 보다 안전하게 작성할 수 있는 Library 나
Template, Example 등이 포함되어있습니다. ( MintableToken 도 그중 하나입니다. )
여러 ICO 의 contract 이나 solidity 로 짜여진 여러 smart contract 의 코드를 보면
대다수는 `SafeMath` 가 포함된 걸 보실 수 있을겁니다. 이 또한 zeppelin-solidity 에서 제공되는 코드입니다.
이처럼 수많은 ICO, contract 에서 가져다쓰고, 조 단위의 ICO Token 들이
문제없이 거래되고 있다는 점에서 이미 검증된 안전한 코드로 볼 수 있습니다.
## MintableToken Code 분석
그럼 드디어 zeppelin-solidity 에서 제공되는 기본 MintableToken 코드를 분석 해보겠습니다.

*Steem 및 Gist 가 solidity code 에 대해 syntax highlighting 을 지원하지 않아 부득이하게 이미지로 대신합니다.*
*코드 원본은 [github](https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/MintableToken.sol) 에서 확인 하실 수 있습니다. 한글 주석 추가된 버전은 [이곳에서](https://gist.github.com/dongsam/6460ad121885323bf3ab49666f14adf9) 확인 가능합니다.*
## MintableToken Demo
<iframe width="560" height="315" src="https://www.youtube.com/embed/HbSBx_lIMOM" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
## 마치며
zeppelin-solidity 에는 MintableToken 외에 이름에서 어느정도 기능을 유추할 수 있는
BurnableToken, CappedToken 등 외에도 다양한 좋은 예제 들을 포함하고 있습니다.
그 중 MintableToken 을 먼저 연재한 이유는 최근 저 또한 개인 혹은 팀에 소속되어 ICO 를 준비하고 있습니다.
ICO 는 Smart contract 에 의해 진행되는 만큼 투자 계약서나 마찬가지인 contract 코드는
투명하게 공개되어 Token 의 발행 구조, 조건, 기능들이 투자자들에게 명확히 설명되어야 한다고 생각합니다.
몇몇 ICO 들은 contract 코드 공개 및 설명 없이 무분별하게 ICO 를 진행하고,
심지어 그런 ICO 들이 수십, 수백억씩 funding 하고있는 실정입니다.
이에 제가 개발에 참여하는 ICO 만이라도 최대한 투명하게 진행하고자 하는 마음에
그 ICO 에 사용될 코드의 일부 원리를 먼저 연재하게 되었습니다 :)
생각을 정리해서 글로 설명하고 데모까지 진행하려니
포스팅 하나 완성하는데 꽤 큰 노력과 시간이 소비되는것 같습니다.
그만큼 많은 도움이 됐으면 좋겠습니다, 댓글 및 Follow, Voting 이 다음 연재에 큰 힘이 됩니다! 👍
앞으로의 연재에서 더 재밌는 예제 및 분석 내용으로 찾아뵙도록 하겠습니다.