21.07.27 토큰 컨트랙트

jongho_lee·2021년 7월 27일
0

Blockchain

목록 보기
3/3
post-thumbnail

이번에는 토큰과 토큰의 컨트랙트에 대해서 학습했습니다.

토큰

ERC-20

Ethereum Request for Comment 20의 약자입니다. EIPs에서 관리하는 공식 프로토콜이며 이더리움 블록체인 네트워크에서 정한 표준 토큰 스펙이다. ERC-20 토큰은 이더리움과 교환 가능하며 이더리움 지갑으로 전송이 가능한 특징을 가지고 있습니다.

여러분은 토큰과 코인을 구별할 줄 아시나요?

코인은 블록체인 네트워크(메인넷)을 구축하여 독립적인 블록체인 생태계 구성이 가능합니다.

토큰은 특정 블록체인을 기반으로 DAPP 분산화 애플리케이션에 사용되는 암호화폐입니다.

토큰은 어떻게 생산될까??

스마트 계약을 통해 생성됩니다. 불가역적으로 전개되는 기능을 통해 중앙관리가 배제된 서비스를 구현하는 것을 목표로 합니다. 이더리움 블록체인 플랫폼을 활용해 토큰을 발행하여 비즈니스를 구현, 자금모집 및 거래체계, 플랫폼 사용료 등 이더리움으로 비용을 지불할 수 있습니다.

Transaction

Transaction {
	nonce: 해당 계좌에서 발생된 Transaction의 수
    	from: 발신자 주소
    	to: 수신자 주소
    	value: 수신자에게 보내는 이더 수량
    	data: 가변 길이의 바이너리 데이터, <= smart contract
    	v, r, s: ECDSA 서명 구성 요소

	}

EX) 이더리움의 코인은 이더이고, 토큰은 스마트 컨트랙트에서 ERC-20 표준으로 발행한 암호화폐입니다.

이더는 계좌의 balance에서 움직이지만 토큰은 컨트랙트 내부에만 존재합니다. 즉, 독립적인 데이터베이스를 갖습니다.

Transfer Transaction

var transaction = {
	nonce: nonce,
    	gasPrice: gasPrice,
    	gasLimit: gasLimit,
    	to: 'toAddress',
    	value: value,
    	data: '0X0
	};

일반적인 송금에서 data에 아무런 값을 넣어주지 않아도 된다.

Contract Exection Transaction

var transaction {
	nonce: nonce,
    	gasPrice: gasPrice,
    	gasLimit: gasLimit,
    	to: 'contractAddress',
    	value: '0X0',
    	data: '0x26f0e4d3'
	}

코인과 토큰의 차이점을 알아봤습니다. 이번에는 ERC-20의 Contract를 보겠습니다.

토큰의 컨트랙트

pragma solidity >=0.4.22 <0.6.0;

contract ERC20Basic {

    string public constant name = "name";
    string public constant symbol = "ABC";
    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);

    mapping(address => uint256) balances;

    mapping(address => mapping (address => uint256)) 				allowed;
    
    uint256 totalSupply_;

    using SafeMath for uint256;

   constructor(uint256 total) public {  
		totalSupply_ = total;
		balances[msg.sender] = totalSupply_;
    }  

    function totalSupply() public view returns (uint256) {
		return totalSupply_;
    }
    
    function balanceOf(address tokenOwner) public view 				returns (uint) {
        return balances[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;
    }

    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;
    }
}

토큰 컨트랙트는 추후 정리 예정입니다.

profile
Developer

0개의 댓글