# ERC-20

공형규·2024년 4월 9일

공식 문서

요약

  • 토큰을 위한 표준 interface

개요

  • 다음 표준은 스마트 계약 내에서 토큰에 대한 표준 API 구현을 가능하게 한다.
  • 이 표준은 토큰 전송을 위한 기본 기능을 제공하며, 토큰을 승인하여 다른 on-chain 제 3자의 토큰 소비를 가능하게 한다.

동기

  • 표준 interface는 이더리움의 어떤 토큰이든 지갑-탈중앙화 거래소에 이르기까지 서로 다른 어플리케이션에서 재사용 될수 있게 한다.

ERC-20 토큰 표준이 있기 전에는 공통된 인터페이스가 없기때문에 서로 다른 어플리케이션간 토큰 전송이 불가능했습니다. ERC-20 표준이 생기고 나서야 상호간 전송이 가능해졌고 한 지갑에 토큰들을 모아서 저장할 수 있게되었습니다.

토큰 사양

Methods

  • Notes
    • 아래 사양들은 Solidity 0.4.17 이하 버전의 문법을 사용함
    • 호출자는 반드시 false 반환 케이스를 처리해야 한다. 호출자는 false 가 반환되지 않을거라 생각하면 절대 안된다!
name (optional)
  • 토큰의 이름을 반환 - 예) "MyToken"
  • Optional - 이 메소드는 사용성 증가를 위해 사용할 수 있다. 하지만 인터페이스들과 다른 컨트랙트들은 이 값이 존재한다 예상하면 안된다.
function name() public view returns(string)
symbol (optional)
  • 토큰의 심볼을 반환 - 예) HIX
  • Optional - 이 메소드는 사용성 증가를 위해 사용할 수 있다. 하지만 인터페이스들과 다른 컨트랙트들은 이 값이 존재한다 예상하면 안된다.
function symbol() public view returns(string)
decimals (optional)
  • 토큰이 사용하는 소수점 수 반환

  • 예) 8은 토큰 양을 100000000(10 ** 8)로 나누어 사용자 표현을 얻는다는 걸 의미

  • Optional - 이 메소드는 사용성 증가를 위해 사용할 수 있다. 하지만 인터페이스들과 다른 컨트랙트들은 이 값이 존재한다 예상하면 안된다.

function decimals() public view returns(uint8)
totalSupply
  • 토큰 총 공급량 반환
function totalSupply() public view returns(uint256)
balaceOf
  • _owner 주소의 토큰 잔액 반환
function balanceOf(address _owner) public view returns (uint256 balance)
transfer
  • _value 양만큼 _to 주소로 토큰 전송
  • 그 다음 반드시 Transfer 이벤트 실행해야 함
  • 호출자의 계정 잔액에 사용할 토큰 부족한 경우 throw 함수 실행해야 함
  • Note: 0 값 전송은 정상 전송으로 처리하고 Transfer 이벤트를 실행해야 함
function transfer(address _to, uint256 _value) public returns (bool success)
transferFrom
  • _from 주소에서 _to 주소로 _value 만큼의 토큰을 전송

  • 그 다음 반드시 Transfer 이벤트 실행해야 함

  • transferFrom 메소드는 인출 워크플로우에 사용되며 게약이 토큰을 대신 전송할 수 있도록 함

  • 이는 예를 들어, 당신을 대신하여 토큰을 전송하는 계약이나 서브 통화(sub-currencies)로 수수료를 지불할 수 있도록 하는 데에 사용될 수 있다.

  • _from 주소의 계정이 어떠한 메커니즘을 통해 의도적으로 메시지를 보낸 사람에게 권한을 부여하지 않는 한 throw 함수가 실행되어야 한다.

  • Note: 0 값 전송은 정상 전송으로 처리하고 Transfer 이벤트를 실행해야 함

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
approve
  • 최대 _value 까지 금액을 계정에서 _spender 주소로 여러번 인출시킬 수 있음
  • 이 함수가 다시 호출되면 현재 허용치를 _value 로 덮어씀
  • NOTE
    • 설명 문서와 ERC-20 이슈에서 논의된 공격 벡터를 방지하기 위해 클라이언트는 허용량을 0으로 먼저 설정한 다음 동일 지출에 대해 다른 값으로 설정하는 방식으로 사용자 인터페이스를 만들어야 함
    • 계약 자체가 강제해서는 안되지만, 이전 배포된 계약과 역호환을 허용해야 함
function approve(address _spender, uint256 _value) public returns (bool success)
allownace
  • _onwer 로부터 _spender 가 인출할 수 있는 금액 반환
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

Events

Transfer
  • 0 value 전송을 포함해서, 모든 토큰 전송에 trigger 되어야 함
  • 새 토큰을 생성하는 토큰 계약은 토큰 생성 시 _from 주소에서 0x0 으로 설정된 Transfer 이벤트를 trigger 해야 함
event Transfer(address indexed _from, address indexed _to, uint256 _value)
Approval
  • approve(address _spender, uint256 _value) 가 성공적으로 호출 되었을 때 만드시 trigger 되야 함
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

구현

  • 이더리움 네트워크에는 이미 수 많은 ERC-20를 준수한 토큰이 배포되어 있음

  • 가스 절약에서 보안 개선에 이르기까지, 서로 다른 trade-off 를 가진 다양한 구현을 다양한 팀에서 작성했음

  • 구현 예시

역사

profile
즐겁게 개발하는 개발자

0개의 댓글