본문 바로가기
aaa
블록체인

이더리움 기반 ERC20 토큰 만들기

이더리움 기반 ERC20 토큰 만들기

 

[요약]

Remix에서 ERC20 토큰 생성 & 전송.

이를 통해 코인과 토큰이 차이를 알아보자.

 

 

 


토큰 생성하기

 

  • 리믹스 접속.

https://remix.ethereum.org/

 

Remix - Ethereum IDE

 

remix.ethereum.org

 

 

  • 스마트 컨트랙트 작성
  • '더보기'로 코드 내용확인가능.
  • 더보기
    pragma solidity >=0.4.22 <0.6.0;
    
    contract ERC20Basic {
    
        string public constant name = "Maximus";
        string public constant symbol = "Maxi";
        uint8 public constant decimals = 0; 
        // 토큰 명칭, 심볼, 소수점
    
    
        event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
        event Transfer(address indexed from, address indexed to, uint tokens);
     	// 이벤트 Approval, Transfer가 받는 파라미터
    
        mapping(address => uint256) balances;
    
        mapping(address => mapping (address => uint256)) allowed;
        // 맵핑
        
        uint256 totalSupply_;
        // totalSupply 숫자 변수.
    
        using SafeMath for uint256;
    
    
       constructor(uint256 total) public {  
    		totalSupply_ = total;
    		balances[msg.sender] = totalSupply_;
        }  
        // constructor 토큰 생성시 호출되는 함수
        // uint256 total : 생성할 토큰의 총량
        // msg.sender: 배포자의 주소
        // 배포자의 주소의 잔고를 생성할 토큰의 총량 만큼 대입시킴.
        //=> 총 발행량을 발행하는 사람이 정할 수 있으며 배포 시 모두 발행자에게 지급됨.
    	
    
        function totalSupply() public view returns (uint256) {
    	return totalSupply_;
        }
        
        function balanceOf(address tokenOwner) public view returns (uint) {
            return balances[tokenOwner];
        }
        // tokenOwner의 잔고를 확인
    
        function transfer(address receiver, uint numTokens) public returns (bool) {
        
            require(numTokens <= balances[msg.sender]);
            balances[msg.sender] = balances[msg.sender].sub(numTokens);
            balances[receiver] = balances[receiver].add(numTokens);
            emit Transfer(msg.sender, receiver, numTokens);
            return true;
        }
        
        // transfer 함수 :토큰 전송
        // : 함수 transfer는 수신자의 주소, 토큰의 수량을 파라미터로 받는다. 
        //그리고나서 true/false(bool)를 반환한다.
        
        // require~:보내는 토큰의 수량(numTokens)보다 토큰 전송자의 
        //토큰 잔고( balances[msg.sender])가 더 커야 함.
        
    	// balance[msg.sender]~: :보내는 토큰의 수량(numTokens)만큼 
    	//토큰 전송자의 잔고( balances[msg.sender])를 감소(sub)시킴
    
    	// balances[receiver]~:수신자의 토큰 잔고(balances[receiver])를 
    	//송신자가 전송한 토큰의 수량만큼 증가(add)시킴.
    
    
        function approve(address delegate, uint numTokens) public returns (bool) {
            allowed[msg.sender][delegate] = numTokens;
            emit Approval(msg.sender, delegate, numTokens);
            return true;
        }
    
        function allowance(address owner, address delegate) public view returns (uint) {
            return allowed[owner][delegate];
        }
    
        function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) {
            require(numTokens <= balances[owner]);    
            require(numTokens <= allowed[owner][msg.sender]);
        
            balances[owner] = balances[owner].sub(numTokens);
            allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
            balances[buyer] = balances[buyer].add(numTokens);
            emit Transfer(owner, buyer, numTokens);
            return true;
        }
    }
    
    library SafeMath { 
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
          assert(b <= a);
          return a - b;
        }
        
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
          uint256 c = a + b;
          assert(c >= a);
          return c;
        }
    }

DEPLOY & RUN TRANSACTIONS

Deploy에 총 발행량을 입력하면 된다.

1,000을 입력하여 1,000개 발행.

 

토큰명: Maximus

토큰 심볼: Maxi

토큰 발행 수량: 1,000

 

 

 

  • 발행 완료
  •  
    원래는 1,000개 였고 1개 전송했음

 

토큰이 발행이 완료 되고

메타마스크에서 토큰 추가를 클릭하여

토큰의 스마트컨트랙트 주소를 입력하면

토큰 발행자인 나의 메타마스크에

1,000개의 Maxi 토큰이 지급된것을 확인 할 수 있다.

 

1,000개의 Maxi 토큰 중 1개를 다른 지갑 주소로보낸다.

 

수신자는 토큰 전송이 완료 되었더라도 

전송자가 보낸 1 Maxi 토큰을 확인할 수 없다.

역시 토큰 추가를 눌러서 

토큰의 스마트컨트랙트 주소를 입력해서 추가하면

전송된 토큰을 확인할 수 있다.

 

*토큰은 스마트컨트랙트내에 주소마다 밸런스가 얼마 갖고 있는지 기록된다.

토큰 스마트컨트랙트 주소를 해야 해당 토큰을 내가 얼마 갖고 있는지 확인 할 수 있다.

 

 

[코인과 토큰 차이]

  • 코인

Account {
nonce:
balance:
code:
storage:
}

코인 전송시 
전송자는 받는 사람 주소, 보낼 코인의량을 설정하고 보내게 된다.
이 경우 EOA(외부 소유 계정)에서 EOA로 전송되므로
수신자는 전송된 코인 만큼 어카운트의 코인이 증가하고
송신자는 전송한 코인 만큼 감소하게된다.

 

 

  • 토큰

Tx {
to:
value:
gas:
data:
}
토큰의 경우에는
수신자 EOA를 입력하고 보낼 토큰의 수량을 설정하고 보내게 된다.
하지만 토큰 전송이 완료 되어도 수신자는 자신이 토큰을 받았는지 확인할 수 없다.
토큰의 스마트컨트랙트 주소를 메타마스크에서 추가해야 비로소 수신자가
토큰을 얼마나 받았는지 확인 할 수 있다.
토큰의 스마트컨트랙트 내에 수신자의 밸런스가 기록되기 때문이다.

 

 


loading