본문 바로가기
Studynote/Blockchain

[솔리디티/Solidity] ERC20 호환 Token의 스마트 컨트랙트 생성 #01

by e.sunie 2019. 6. 8.

 

리믹스(Remix) 
https://remix.ethereum.org
브라우저에서 솔리디티를 실행할 수 있는 통합 개발 환경

 


1. ERC20 호환 Token의 스마트 컨트랙트 생성

 ERC20 (Ethereum Request For Comments 20)
이더리움의 표준 토큰 규격
- ERC20 호환 토큰 : ERC20 규격을 준수하는 토큰
→ ERC20 규격을 준수하면 다른 토큰 사이의 교환을 단순하는  ERC20 대응 지갑 개발 가능

 

1) ERC20 인터페이스

https://eips.ethereum.org/EIPS/eip-20
//Methods
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

//Events
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

 

2) 실습 예제

pragma solidity 0.5.7;

// ERC20 functions
contract ERC20 {
    uint256 public _max_supply;

    constructor (uint256 max_supply) public {
        _max_supply = max_supply;
    }
    
     function _mint(address account, uint256 value) internal {
    }
}

// Token main contract
contract token is ERC20 {
    string public constant name = "rayOshow";
    string public constant symbol = "ray";
    uint8 public constant decimals = 4;
    
    uint256 public constant initial_supply = 10000 * (10 ** uint256(decimals));
    uint256 public constant max_supply = 20000 * (10 ** uint256(decimals));    

    constructor () public ERC20(max_supply){
        _mint(msg.sender, initial_supply);
    }
}
https://github.com/OpenZeppelin/openzeppelin-solidity/blob/9b3710465583284b8c4c5d2245749246bb2e0094/contracts/token/ERC20/ERC20.sol

 

 


 

1) 컴파일러 버전 지정

pragma solidity 0.5.7;
pragma 키워드
컴파일러에 소스코드를 처리하는 방법을 정의할 때 사용

- ^0.5.7 : ^사용 시, 한 단계 위 버전(0.6.0 이상)에서는 동작하지 않는다는 뜻

 

  • Remix에서 컴파일러 버전 설정하기

  1. Remix - Complie 탭
  2. 선언한 컴파일버전과 동일한 버전 선택
  3. 0.5.7+commit 선택

2) ERC20 계약 선언

// ERC20 functions
contract ERC20 {
    uint256 public _max_supply;

    constructor (uint256 max_supply) public {
        _max_supply = max_supply;
    }
    
     function _mint(address account, uint256 value) internal {
    }
}

 


 

contract ERC20 {

}
contract
= 객체지향언어의 클래스

 

uint256 public _max_supply; //최대 토큰 발행량 상태 선언
상태
= 객체지향언어에서 인스턴스변수
uint256 타입
256비트의 unsigned int 타입
- uint의 default 비트 수 : 256 bit

 

    constructor (uint256 max_supply) public {
        _max_supply = max_supply;
    }
constructor 생성자
스마트 계약을 새로 만들 때 실행
- 이전 버전에서는 contract와 동일한 이름을 사용 : function ERC20(uint256 max_supply) public { } 

 

     function _mint(address account, uint256 value) internal {
     
    }
address 주소타입
EOA나 CA 주소 20바이트의 값을 저장
연산자 외 맴버 함수도 있으며, 모든 계약의 핵심을 정의하는 기반
맴버 함수명 설명
balance 계정주소에 있는 이더를 wei로 return
transfer 계정 주소에 있는 이더를 송금
send

계정주소에 있는 이더를 송금

- 실패 시, false return

call

계정 주소에 있는 이더를 송금

- 실패 시, false reutrn

  • 가스양 조정가능
  • ABI에 적합하지 않은 계약과 연결하기 위해 어떤 데이터 타입의 임의 파라미터를 선언하는 함수 호출
delegatecall 다른 계약을 호출하는 메서드
접근제어자 
- 변수 default 값 : internal
- 함수 default 값 : public
접근제어자 설명
external 외부 계약 및 거래에서 호출
public 계약 안 또는 메시지로 외부에서 호출
internal 계약 안 또는 계약에서 파생한 계약에서 호출
private 계약 안에서만 호출

 


3) 토큰 계약 생성

// Token main contract
contract token is ERC20 {
    string public constant name = "rayOshow"; //토큰 이름 설정
    string public constant symbol = "ray"; //토큰을 화폐 단위로 나타낼 때의 기호 설정
    uint8 public constant decimals = 4; //토큰에서 허용할 소수점 자릿수 설정
    
    uint256 public constant initial_supply = 10000 * (10 ** uint256(decimals)); //초기 토큰 발행량
    uint256 public constant max_supply = 20000 * (10 ** uint256(decimals)); //최대 토큰 발행량   

    constructor () public ERC20(max_supply){
        _mint(msg.sender, initial_supply);
    }
}

 


 

// Token main contract
contract token is ERC20 {

}
is 키워드
상속의 개념을 표현
- 계약 token은 계약 ERC20를 상속한다.

 

string public constant name = "rayOshow"; //토큰 이름 설정
string public constant symbol = "ray"; //토큰을 화폐 단위로 나타낼 때의 기호 설정
uint8 public constant decimals = 4; //토큰에서 허용할 소수점 자릿수 설정
constant 키워드
상태를 변경하지 않을 때 사용 
name, symbol, decimals은 반드시 public으로 선언되어야 한다. 

 

uint256 public constant initial_supply = 10000 * (10 ** uint256(decimals)); //초기 토큰 발행량
uint256 public constant max_supply = 20000 * (10 ** uint256(decimals)); //최대 토큰 발행량    
타입 캐스팅
컴파일러는 보통 자동으로 타입캐스팅 진행
타입을 명시하여 타입 캐스팅 진행
1) 작은 타입 값 → 큰 타입 값 
2) 큰 타입 값 → 작은 타입 값 : 크기가 작은 타입 값에 맞춰지므로 원래 값을 보장하지 않음 (상위 비트값 삭제)

- uint8 → uint256 (O)
- int8 → int16 (O)
- int8 → uint8 (X) : 음수 표현 불가 
- uint160 → address 타입으로 캐스팅 가능

 

constructor () public ERC20(max_supply){
	_mint(msg.sender, initial_supply); //mint함수 설정
}
블록 및 거래 속성 변수
https://solidity.readthedocs.io/en/v0.5.9/units-and-global-variables.html

 

변수명 설명

blockhash(uint blockNumber) 

returns (bytes32)

지정한 블록의 해시값 return

- 현재 블록을 제외한 최신 256블록에만 사용가능

block.coinbase (address payable) 현재 블록 채굴자의 주소 return
block.difficulty (uint) 현재 블록의 난이도 reutrn
block.gaslimit (uint) 현재 블록의 가스 제한량 return
block.number (uint) 현재 블록의 번호 return 
block.timestamp (uint) 현재 블록의 타임스탬프를 as seconds since unix epoch로 return
gasleft() returns (uint256)

남아있는 가스 return (=msg.gas)

msg.data (bytes calldata) 완전한 호출 데이터 return
msg.sender (address payable) 메시지 보낸 사람을 return 
msg.sig (bytes4) 호출데이터의 첫 4바이트를 return(함수 식별자)
msg.value (uint) 메시지와 함께 보낸 wei를 return
now (uint) 현재 블록의 타임스탬프 return (alias block.timestamp)
tx.gasprice (uint) 해당 가스의 거래 가격
tx.origin (address payable) 거래 발신자를 return (full call chain)

 

댓글