Chapter 2. ERC-20 토큰표준 함수

Running to Blockchain·2022년 7월 7일
0

개요

이전 포스팅에서는 이더리움의 EIP중 Standard Track EIP에 해당하는 ERC에 해당하는 세가지 ERC-20, ERC-721, ERC-1155에 대한 기본 개념을 정리해보는 시간을 가졌다.
해당 내용을 잘 알지 못하거나, 확인하고 싶은 사람은 아래 링크를 참조하면 된다.
https://velog.io/@hoo_park95/ERC-%ED%86%A0%ED%81%B0-%ED%91%9C%EC%A4%80-%EC%A0%95%EB%A6%AC

Chapter 2를 포함한 이후 Chapter에서는 ERC-20, ERC-721, ERC-1155 세가지 토큰 표준별로 제공해주는 표준함수들에 대해 자세히 살펴보는 시간을 가져보려한다.

우선 Chapter 2에서는 ERC-20 토큰표준에서 제공하는 표준함수들에 대해 살펴보도록 하자.



Chapter 2

ERC-20

ERC-20 토큰표준을 통해 토큰이 생성되면, 이는 ERC-20 표준을 지원하는 서비스 및 소프트웨어(소프트웨어 지갑, 하드웨어 지갑, 거래소 등)와 자동으로 호환된다.

한가지 중요한 개념이 있다. 이더리움 자체 암호화폐(코인)인 이더(ETH)와 달리, ERC-20기반 토큰은 계정에 보관되지 않는다. 토큰은 실제로는 Contract내부에만 존재하며, 이는 독립적인 데이터베이스와 같다. 이름, 심볼, 가분성과 같은 "토큰 규칙"들을 구체적으로 명시하여 사용자 계정에 상응하는 목록을 이더리움 주소에 보관하는 방식이다.

만약 사용자가 본인 소유의 토큰을 이동하고 싶다면, 자신의 잔고 일부를 다른 곳으로 전달해달라는 요청을 하는 트랜잭션을 Contract에 전송해야만 한다. 예를들어 P라는 사람이 XX토큰 500개를 YH라는 사람에게 전송하고자 하는 경우, XX토큰 내부의 SmartContract에 구현되어있는 함수를 호출해서 이를 요청한다.

간단한 설명은 마치고 ERC-20의 Contract 내부 구조를 살펴보도록 하자.

ERC-20 토큰표준을 준수하기 위해서는 Contract에 다음의 "6가지" 함수가 "필수적으로" 포함되어야 한다.

  • 전체 공급량 (totalSupply)
  • 잔고 (balanceOf)
  • 전송 (transfer)
  • ~에서 전송 (transferFrom)
  • 승인 (approve)
  • 허용 (allowance)
    또한,
  • 이름 (name)
  • 심볼 (symbol)
  • 소수점 (decimal)
    과 같은 부가적인 함수들을 설정할 수도 있다.

1. ERC-20 표준 Events

해당 Events들은 아래에서 다룰 "ERC-20 표준 Functions"가 호출될 때 함수에서 호출하는 Event이며, 이 Event들을 통해 실제 블록체인에 데이터를 기록한다고 보면 된다.

1-1. event Transfer

event Transfer(address indexed _from, address indexed _to, uint256 _value)

1-2. event Approval

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

2. ERC-20 표준 Functions

2-1. totalSupply

사용자가 이 함수를 호출하면, 해당 함수는 Contract가 보유하고있는 토큰의 "전체 공급량"을 전달한다.
함수 호출시 입력 파라미터는 존재하지 않는다.

function totalSupply() public view returns (uint256)

2-2. balanceOf

totalSupply와 달리 balanceOf는 입력 파라미터로 주소를 받는다. 이 함수가 호출되면, 파라미터로 넘어온 주소가 보유하고 있는 토큰의 잔고가 출력된다. 이더리움 네트워크의 계정은 공개적이기 때문에 주소만 알고있다면 모든 사용자의 토큰잔고를 요청할 수 있다는 점을 알아야한다.

function balanceOf(address _owner) public view returns (uint256 balance)

2-3. transfer

transfer는 다른 사용자에게 토큰을 전송하는 기능을 제공하는 함수이다. 함수 호출시에는 함수를 호출하는 사람이 전송하고자 하는 "목적지 주소"와 "금액"을 파라미터로 넘겨주어야 한다. 다시말하면, 이 함수는 토큰을 전송할 사용자가 호출해야만 한다.
함수가 호출되면 transfer는 이벤트(event transfer)를 호출하며, 이 이벤트 호출을 통해 블록체인에 데이터를 기록한다.

function transfer(address _to, uint256 _value) public returns (bool success)

2-4. transferFrom

transferFrom 함수는 transfer을 좀 더 구체화 한 것으로, 이 함수를 통해 Dapp에서 좀 더 활용도 높게 사용이 가능하다. 이는 transfer와 마찬가지로 토큰을 전송하지만, 전송되는 토큰이 반드시 Contract를 호출하는 사람의 소유일 필요는 없다.
즉, 다른 누군가 또는 다른 Contract에서 나를 대신하여 내 자금을 전송하도록 허락할 수 있다.
예를들어, 매일/매주/매월 수동으로 결제해야 하는 구독형 서비스 결제에서 이 함수를 사용할 수 있다.
프로그래밍을 통해서 이 함수를 자동으로 호출한다면, 구독형 서비스 자동결제 시스템에 활용이 가능할 것이다.

해당 함수는 transfer함수와 동일한 이벤트(event transfer)를 호출한다.

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)

2-5. approve

approve라는 함수를 통해, SmartContract가 내 잔고에서 인출할 수 있는 토큰 수량을 제한할 수 있다.
이 함수가 없다면 함수 오작동(또는 부정한 이용)과 자금 탈취의 위험이 있다.

예를들어, 내가 구독형 서비스 자동결제 시스템을 사용하고 있다고 생각해보자. 나는 매달 자동결제 되는 토큰수량보다 훨씬 더 많은 양을 가지고 있는데, 어떠한 오작동(또는 부정한 이용)으로 인해 자동결제 되어야 하는 토큰수량보다 훨씬 더 많은 토큰이 빠져나갈 수도 있을 것이다. 이러한 경우를 방지하기 위해서 나의 approve한도를 OO개의 토큰으로 제한할 수 있고 이러한 경우를 위해 제공되는 함수가 approve이다.
최악의 경우에 Dapp이 악의를 품고 나의 자금을 모두 출금하려 하거나, 해킹 시도가 들어온다고 하더라도 내가 approve를 통해 한도를 걸어놓은 자금까지만 잃게 될것이다.

approve함수는 호출되면 approve 이벤트를 호출한다. transfer 이벤트처럼, 이 이벤트를 통해 블록체인에 데이터를 기록하게 된다.

function approve(address _spender, uint256 _value) public returns (bool success)

2-6. allowance

allowance는 approve와 함께 사용할 수 있다. 내가 특정 Contract에 "토큰관리기능"을 부여했다면, 이 allowance함수를 통해 얼마나 많은 토큰을 인출할 수 있는지 확인하는데 사용할 수 있다.
예를들어, 내가 approve를 통해 토큰수량을 10개로 제한했고, 그 중 3개를 사용했다면, 이 경우 allowance함수를 호출할 경우 7개의 토큰을 사용할 수 있다는 메세지가 출력될 것이다.

function allowance(address _owner, address _spender) public view returns (uint256 remaining)

2-7. name, symbol, decimal

이 세가지 function들은 ERC-20 토큰표준을 사용하기 위한 필수 함수들은 아니다.
하지만 이를 추가할 경우에 사람이 읽을 수 있는 이름을 추가할 수 있고, 심볼(예를들면, ETH, BTC, SOL, ..)을 설정할 수 있고, 소수점 몇 자리까지 토큰이 분할될 수 있는지를 지정할 수 있다.
예를들어 FT토큰들(통화로 사용되는 토큰들)은 NFT토큰들(토큰의 소유권을 나타내는 토큰) 보다 더 많이 분할되도록 설정하는게 좋을 것이고, 그런경우에 해당 함수를 추가하여 사용하면 된다.

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)

마무리하며

위의 모든 기능들을 모아두면 ERC-20 표준을 준수하는 Contract, 즉 ERC-20 Contract가 된다.
우리는 해당 Contract를 통해 전체 공급량 요청, 잔고 확인, 자금 전송, 토큰 관리를 위한 다른 Dapp에 권한 부여 등 을 수행할 수 있다.

추가적으로, ERC-20 토큰의 가장 큰 장점은 유연성이다.
ERC-20 표준의 경우 개발을 제한하지 않으며, 이러한 특성덕에 당사자들은 자신에게 적합한 부가적인 기능을 추가하고, 특정 변수들을 설정하는 등 본인이 만들고자 하는 토큰에 맞게 활용할 수 있다.

다음 챕터에서는 ERC-721 표준토큰이 제공하는 함수들에 대해 살펴보도록 할 것이다.


참고 : https://ethereum.org/ko/developers/docs/standards/tokens/erc-20/

profile
블록체인에 대해 같이 공부하는 채널입니다~

0개의 댓글