스마트 컨트랙트와 ERC-20 개발

ERC-20이란?
이더리움 블록체인 네트워크에서 정한 표준 토큰 스펙.
필요한 이더리움과 호환성이 있는 모든 요구 사항을 충족시키는 표준으로,
ERC-20 토큰은 이더리움과 교환 가능하며 이더리움 지갑으로 전송이 가능함.

이더리움 플랫폼에서는 각각의 디앱이 발행한 토큰을 통합하여 현금화하는 것이 가능.
디앱 내에서의 토큰 교환은 물론, 또 다른 이더리움 플랫폼을 기반으로 한 디앱의 토큰과 교환이 가능.
다양한 디앱에 흩어져있는 ERC-20 표준 호환 토큰들은 나중에 통합되어 한 번에 이더로 현금화 가능.

ERC-20은 이더리움 네트워크 상에서 유통할 수 있는 토큰의 호환성을 보장하기 위한 표준 사양.
디앱이 발행하는 토큰이 이더리움의 통화인 이더리움과 호환성을 충족시키기 위해서
규정하고 있는 프로그래밍 기준.
ERC-20 기준을 맞춰 디앱을 설계한 후 토큰을 발행하면,
이더리움과 쉽게 교환할 수 있고, 표준 이더리움 지갑(My Ether Wallet, MetaMast, Mist 등)에
자유롭게 전송할 수 있음.

ERC-20 토큰 개발
ERC-20 코드 분석
ERC20Interface
솔리디티에서 Interface는 사용할 함수의 형태를 선언.
실제 함수의 내용은 Contract에서 작성함.
function(totalSupply, balanceOf, transfer, approve, allowance, transferFrom)-함수는 이더리움에서 제공하는 함수이며,
event(Transfer, Approval)-이벤트는 이더리움에서 제공하는 로그.
function과 event를 선언시, 입력값과 반환값은 선택할 수 있으나,
function은 자료형, 이름, 순서를 주의해야 함.
Transfer 이벤트는 토큰이 이동할 때마다 로그를 남기고,
Approval 이벤트는 approve 함수가 실행 될 때 로그를 남김.

SimpleToken
ERC20Interface에서 함수의 형태만 선언하고, 함수의 내용은 SimpleToken 컨트랙트에서 사용.

contract SimpleToken is ERC20Interface { ... }

is ERC20Interface를 붙여 SimpleToken 컨트랙트가 ERC20Interface 함수를 사용함을 선언.

mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) public _allowances;

이중으로 매핑된 approvals를 확인 가능.
ERC-20 함수

// 해당 스마크 컨트랙트 기반 ERC-20 토큰의 총 발행량 확인
function totalSupply() external view virtual override returns (uint256) {
// owner가 가지고 있는 토큰의 보유량 확인
function balanceOf(address account) external view virtual override returns (uint256) {

직접 토큰을 다른 사람에게 전송할 때는 tranfer 함수를 사용.

// 토큰을 전송, recipient-수령자, amount-전송량
function transfer(address recipient, uint amount) public virtual override returns (bool) {

토큰을 등록하는 방식을 사용하는 경우, approve, allowance, transferFrom 함수를 사용.

// spender(거래소-EXCHANGE)에게 value 만큼의 토큰을 인출할 권리를 부여, 반드시 Approval 이벤트 호출 필요.
function approve(address spender, uint amount) external virtual override returns (bool) {
// owner가 spender(거래소-EXCHANGE)에게 양도 설정한 토큰의 양을 확인
function allowance(address owner, address spender) external view override returns (uint256) {
// spender(거래소-EXCHANGE)가 거래 가능하도록 양도 받은 토큰을 전송
function transferFrom(address sender, address recipient, uint256 amount) external virtual override returns (bool) {


approve는 지갑의 OWNER가 토큰을 EXCHANGE에 자신이 가진 토큰을 수보다 적은 수량을 거래 가능하도록 맡김.
allowance는 OWNER와 EXCHANGE 값을 입력해서 몇개가 등록 되었는지 확인 가능.
transferFrom은 BUYER가 구매 신청해 놓은 금액에 대해 EXCHANGE가 OWNER가 맡겨둔 토큰을 판매함.
여기서, 앞서 나왔던 이중 매핑해둔 approvals 변수를 다시 확인해 보면,

mapping (address => mapping (address => uint256)) public _allowances;
  • KEY : owner 주소
  • VALUE : ( KEY : SPENDER의 address, VALUE : 맡겨둔 TOKEN의 갯수 )

ERC-20 함수 - approve
OWNER가 토큰을 판매하고자 하는 수량을 EXCHANGE에 기록하는 함수.
ERC-20 함수 - allowance
OWNER가 토큰을 판매하고자 EXCHANGE에 기록한 수량을 확인(출력)하는 함수.
ERC-20 함수 - transferFrom
EXCHANGE에 기록된 토큰 수량 중 일부(또는 전부)를 BUYER(구매자)에게 판매하는 함수.
토큰은 OWNER에서 BUYER에게 _tranfer되고, 잔여 토큰 수량은 allowance에 갱신됨.

좋은 웹페이지 즐겨찾기