반응형

Token


토큰이란 우리가 생각하는 가상화폐와 같은 의미이다. 이때 프로그래머의 입장이라면 가상화폐라는 단어보다 트랜잭션을 통한 증거물이라고 생각해보는 것도 나쁘지 않아보인다.


이제 이러한 토큰 컨트랙트를 만들어보기에 앞서 토큰에 어떤게 포함되어야 하는지는 다음과 같다.

-> 토큰에는 토큰의 이름, 단위, 총 발행량, 잔고 관리, 송금기능을 기본적으로 가지고 그 외의 기능도 가져야 한다.


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
30
31
32
33
pragma solidity ^0.4.19;
contract CrocusCoin{
    // 1. 상태변수
    string public name; // 토큰 이름
    string public symbol; // 토큰 단위
    uint8 public decimals; // 소수점 이하 자릿수
    uint public totalSupply; // 토큰 총 발행량
 
    mapping(address = > uintpublic balanceOf; // 각 주소의 잔고
 
    // 2. 이벤트
    event Transfer(address indexed from, address indexed to, uint value);
 
    // 3. 생성자
    function CrocusCoin(uint _supply, string _name, string _symbol, uint8 _decimals) {
        balanceOf[msg.sender= _supply;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _supply;
    }
 
    // 4. 송금 기능
    function transfer(address _to, uint _value) {
        require(balanceOf[msg.sender>= _value);
        require(balanceOf[_to] + _value >= balanceOf[_to]);
 
        balanceOf[msg.sender-= _value;
        balanceOf[_to] += _value;
 
        Transfer(msg.sender, _to, _value);
    }
}
cs



1. 상태변수


상태변수는 위와같이 선언할 수 있다. 이때 mapping을 통해 해당 address가 가지는 토큰 잔고를 보관하자.



2. 이벤트


이벤트는 다음과 같은 기능을 한다.


이벤트는 컨트랙트가 블록체인 상에서 사용자 단의 앱에서 액션이 발생할 경우 귀를 기울이고 있는 상황을 의미한다. 


이렇게 이벤트를 설정하면 특정 이벤트가 발생하면 블록체인 상에서 행동을 취하게 된다. 


이러한 이벤트는 계약 중 발생한 처리를 추적할 수 있게 도와주는 로그를 출력해준다.



3. 생성자


생성자에서 balanceOf[msg.sender] = _supply를 통해 모든 토큰을 최초 계약을 생성한 사람의 주소로 보내주게 된다.


즉, 어떤 컨트랙트를 개발한 창시자에게 모든 토큰이 가있고 그로부터 시작된다는 의미이다.



4. 송금 기능


송금 기능에서 require를 통해 두가지를 검사한다.


1. 현재 트랜잭션을 보내려는 유저의 보유 토큰이 자신의 자신이 보내려 하는 토큰보다 크거나 같은지 체크한다.

2. 받는 사람의 토큰 보유량 + 받으려는 토큰이 받는 사람의 토큰 보유량 보다 크거나 같은지 체크한다.(오버 플로우 체크)


그리고 마지막에 이벤트를 호출하며 로그를 남기게 된다.





5. 실행 과정



코인 컨트랙트를 Create하여 배포한다. 이때 총 발행량은 10000개, CrocusCoin 단위는 Cr로 하고 소숫점은 0자리로 한다.



현재 발행한 주소를 복사하여 balanceOf " "사이에 주소를 붙여넣고 실행해보자. 쌍따옴표는 필수다.


결과적으로 10000개의 토큰을 보유하고 있음을 알 수 있다.






다른 지갑 주소를 이용하여 transfer에 입력해보고 실행해보자. 


필자의 경우에는 "0xca35b7d915458ef540ade6068dfe2f44e8fa733c", 4000로 입력하였다.




결과적으로 토큰이 4000개가 줄었음을 알 수 있다.







반응형

'Applied > Blockchain' 카테고리의 다른 글

Solidity 회원관리 예제  (0) 2018.05.14
Solidity 블랙리스트 구현  (0) 2018.05.05
Solidity 기초 예제코드 및 분석- 3  (0) 2018.05.02
Solidity 프로그래밍 기초 - 2  (0) 2018.05.02
이더리움 가스(Ethereum Gas)  (2) 2018.05.01