4편 ERC-20 토큰 기능성 토큰의 기본 구조 이해하기

블록체인에서 기능성 토큰을 이야기할 때 가장 자주 등장하는 표현 중 하나가 바로 ERC-20입니다.
처음 접하면 어려운 기술 용어처럼 느껴질 수 있지만, 실제로는 “토큰이 공통으로 따라야 하는 기본 규칙” 정도로 이해하면 훨씬 쉽습니다.

이번 글에서는 ERC-20 토큰이 무엇인지, 왜 많은 기능성 토큰이 이 구조를 따르는지, 그리고 토큰 계약에서 자주 보게 되는 핵심 요소인 totalSupply, balanceOf, transfer, approve, allowance, transferFrom이 각각 어떤 역할을 하는지 쉽게 정리해보겠습니다.


ERC-20 이란 무엇인가?

ERC-20은 이더리움 계열 블록체인에서 토큰을 만들 때 많이 사용하는 표준 규칙입니다.
쉽게 말하면, 토큰이 지켜야 할 공통 약속이라고 볼 수 있습니다.

예를 들어 어떤 토큰은 잔액 확인 방식이 다르고, 어떤 토큰은 전송 방식이 완전히 다르다면 지갑이나 거래소가 각각 따로 대응해야 해서 매우 불편해집니다.
그래서 “토큰은 최소한 이런 기능들을 공통으로 갖추자”라는 기준이 필요했고, 그 대표적인 기준이 ERC-20입니다.

즉, ERC-20 은
토큰끼리의 통일된 문법
또는
지갑과 거래소가 쉽게 이해할 수 있는 공통 규칙이라고 생각하면 됩니다.


왜 ERC-20 표준이 중요한가?

ERC-20이 중요한 이유는 아주 단순합니다.
표준이 있어야 여러 서비스가 토큰을 쉽게 다룰 수 있기 때문입니다.

예를 들어 ERC-20 표준을 따르는 토큰은 보통 다음과 같은 곳에서 다루기 편합니다.

  • 메타마스크 같은 지갑
  • 탈중앙화 거래소(DEX)
  • 토큰 추적 서비스
  • 블록 탐색기
  • 스테이킹이나 디앱 서비스

즉, ERC-20 은 단순한 개발 규칙이 아니라
토큰이 블록체인 생태계 안에서 자연스럽게 연결되게 해주는 공통 기반입니다.


ERC-20 토큰의 핵심 구조는 어떻게 이루어질까?

ERC-20 토큰 계약에는 보통 다음과 같은 핵심 요소가 들어갑니다.

  • 총발행량을 보여주는 totalSupply
  • 특정 주소의 잔액을 확인하는 balanceOf
  • 토큰을 보내는 transfer
  • 다른 주소에 사용 권한을 주는 approve
  • 허용된 사용량을 확인하는 allowance
  • 승인받은 범위 안에서 대신 보내는 transferFrom

처음에는 이름이 낯설 수 있지만, 역할만 이해하면 어렵지 않습니다.


1. totalSupply란 무엇인가?

totalSupply는 말 그대로 총발행량입니다.
즉, 지금까지 이 토큰이 전체적으로 몇 개 존재하는지를 나타냅니다.

예를 들어 총 10억 개를 발행한 토큰이라면, totalSupply는 그 전체 수량을 보여줍니다.

이 값이 중요한 이유는 토큰의 전체 규모를 파악할 수 있기 때문입니다.
토큰을 볼 때는 단순히 가격만 보는 것이 아니라, 총발행량과 현재 유통 구조도 함께 살펴보는 경우가 많습니다.

쉽게 말하면 totalSupply는
**“이 토큰이 전체적으로 몇 개 있는가?”**를 보여주는 기준값입니다.


2. balanceOf란 무엇인가?

balanceOf특정 지갑 주소가 가지고 있는 토큰 수량을 확인하는 기능입니다.

예를 들어 A라는 주소가 토큰 500개를 가지고 있다면,
balanceOf(A)를 통해 그 수량을 확인할 수 있습니다.

이 기능이 있어야 지갑이나 서비스에서 “내가 현재 몇 개를 보유 중인지”를 알 수 있습니다.

즉, balanceOf는
주소별 토큰 잔액 조회 기능이라고 이해하면 됩니다.


3. transfer란 무엇인가?

transfer토큰을 다른 주소로 보내는 기능입니다.

예를 들어 내가 가진 토큰 100개 중 20개를 다른 사람에게 보내고 싶다면 transfer를 사용합니다.

토큰의 가장 기본적인 기능이 바로 전송이기 때문에, transfer는 ERC-20 구조에서 매우 핵심적인 요소입니다.

이 과정에서는 보통 이런 검사가 함께 이루어집니다.

  • 보내는 사람이 충분한 잔액을 가지고 있는지
  • 받는 주소가 유효한지
  • 전송 후 잔액이 정상적으로 변경되는지

즉, transfer는
**“내 토큰을 직접 보내는 기능”**입니다.


4. approve란 무엇인가?

approve는 처음 보면 조금 헷갈릴 수 있습니다.
이 기능은 다른 주소에게 내 토큰을 일정 수량까지 사용할 수 있는 권한을 주는 것입니다.

예를 들어 어떤 디앱이나 거래소가 내 지갑에서 토큰을 사용하려면, 먼저 승인 절차가 필요할 수 있습니다.
이때 approve를 통해 “이 주소는 내 토큰을 최대 얼마까지 사용할 수 있다”는 권한을 부여합니다.

왜 이런 구조가 필요할까요?

블록체인에서는 보안이 중요하기 때문에, 다른 계약이 내 토큰을 마음대로 움직이면 안 됩니다.
그래서 먼저 사용 허락을 해주는 구조가 필요합니다.

즉, approve는
**“이 주소에게 내 토큰을 일정 범위까지 사용할 권한을 준다”**는 의미입니다.


5. allowance란 무엇인가?

allowance승인된 사용 한도를 확인하는 기능입니다.

예를 들어 내가 어떤 디앱에 1,000개의 토큰 사용 권한을 줬다면, allowance를 통해 현재 그 허용량이 얼마인지 확인할 수 있습니다.

쉽게 말해 approve가 “허락하기”라면, allowance는
**“얼마까지 허락했는지 확인하기”**입니다.

이 값이 필요한 이유는 디앱이나 사용자 모두 승인 상태를 확인해야 하기 때문입니다.
그래야 실제로 transferFrom 같은 기능이 정상적으로 동작할 수 있습니다.


6. transferFrom이란 무엇인가?

transferFromapprove로 미리 허락받은 범위 안에서 대신 토큰을 이동시키는 기능입니다.

이 기능은 직접 보내는 transfer와 다르게,
승인을 받은 제3자가 토큰을 이동시킬 수 있다는 점이 특징입니다.

예를 들어 이런 경우에 많이 쓰입니다.

  • 디앱이 사용자의 토큰을 예치할 때
  • 거래소가 승인된 범위 안에서 토큰을 처리할 때
  • 스테이킹 계약이 사용자의 토큰을 받아갈 때

즉, transferFrom은
**“승인받은 권한을 바탕으로 대신 토큰을 옮기는 기능”**입니다.

approve, allowance, transferFrom은 서로 연결되어 동작한다고 이해하면 쉽습니다.


ERC-20 의 기본 흐름을 아주 쉽게 정리하면

ERC-20 토큰은 보통 이런 흐름으로 생각하면 이해하기 좋습니다.

직접 전송할 때

  • 내 지갑에 토큰이 있음
  • transfer로 다른 지갑에 보냄

서비스가 대신 처리할 때

  • 내가 먼저 approve로 사용 권한을 줌
  • 서비스가 allowance로 허용량을 확인함
  • 이후 transferFrom으로 토큰을 이동시킴

이 흐름을 이해하면 토큰과 디앱이 왜 연결되는지 훨씬 쉽게 보입니다.


왜 ERC-20 이 기능성 토큰의 기본 구조로 많이 쓰일까?

기능성 토큰은 서비스 안에서 특정 역할을 하는 토큰입니다.
예를 들어 다음과 같은 용도로 쓰일 수 있습니다.

  • 서비스 이용권
  • 보상 지급
  • 스테이킹 참여
  • 거버넌스 투표
  • 특정 기능 활성화

이런 토큰이 실제로 사용되려면 기본적으로
잔액 조회, 전송, 승인, 계약 간 연동이 가능해야 합니다.

ERC-20은 바로 그 기본 구조를 잘 제공해주기 때문에, 많은 기능성 토큰이 이 표준을 기반으로 만들어집니다.


OpenZeppelin은 왜 자주 같이 언급될까?

ERC-20 을 공부하다 보면 OpenZeppelin이라는 이름도 자주 보게 됩니다.
OpenZeppelin은 스마트 계약을 보다 안전하고 편하게 작성할 수 있도록 도와주는 대표적인 오픈소스 라이브러리입니다.

쉽게 말하면,
검증된 토큰 기본 코드를 가져와서 활용할 수 있게 해주는 도구 모음이라고 생각하면 됩니다.

예전에는 개발자가 ERC-20 구조를 처음부터 전부 직접 작성하는 경우도 많았지만,
지금은 OpenZeppelin의 표준 구현을 기반으로 사용하는 경우가 많습니다.

왜냐하면 그 편이 더 안전하고, 실수도 줄일 수 있기 때문입니다.

다만 초보자 입장에서는
지금 단계에서 “OpenZeppelin은 검증된 기본 틀을 제공하는 도구” 정도로 이해해도 충분합니다.


아주 간단한 ERC-20 개념 예시

실제 코드는 더 길어질 수 있지만, 개념적으로 보면 ERC-20 토큰은 대략 아래와 같은 요소를 가집니다.

pragma solidity ^0.8.20;contract MyToken {
uint256 public totalSupply;
mapping(address => uint256) public balanceOf; function transfer(address to, uint256 amount) public returns (bool) {
// 잔액 검사 후 전송
} function approve(address spender, uint256 amount) public returns (bool) {
// 사용 권한 승인
} function allowance(address owner, address spender) public view returns (uint256) {
// 허용량 확인
} function transferFrom(address from, address to, uint256 amount) public returns (bool) {
// 승인된 범위 안에서 전송
}
}

이 코드는 설명용으로 아주 단순화한 구조이지만,
ERC-20 에서 어떤 기능들이 핵심인지 감을 잡는 데는 도움이 됩니다.


초보자가 자주 헷갈리는 부분

ERC-20 을 처음 배울 때 자주 헷갈리는 포인트는 아래와 같습니다.

transfer와 transferFrom의 차이

  • transfer는 내가 직접 보내는 것
  • transferFrom은 승인받은 쪽이 대신 보내는 것

approve와 전송을 같은 개념으로 보는 경우

approve는 실제 전송이 아니라 권한 부여입니다.

totalSupply와 개인 잔액을 헷갈리는 경우

  • totalSupply는 전체 발행량
  • balanceOf는 특정 주소의 잔액

표준이면 완전히 안전하다고 생각하는 경우

ERC-20 구조를 따르더라도,
추가 기능이 잘못 설계되면 문제가 생길 수 있습니다.
예를 들어 관리자 권한, 민팅, 소각, 수수료 구조 등은 별도로 잘 봐야 합니다.


정리

ERC-20 은 기능성 토큰을 이해할 때 가장 중요한 기본 구조 중 하나입니다.

핵심만 다시 정리하면 다음과 같습니다.

  • ERC-20 은 토큰이 공통으로 따르는 표준 규칙이다
  • totalSupply는 총발행량
  • balanceOf는 주소별 잔액 조회
  • transfer는 직접 전송
  • approve는 사용 권한 승인
  • allowance는 허용량 확인
  • transferFrom은 승인받은 범위 안에서 대신 전송
  • OpenZeppelin은 검증된 ERC-20 구현을 돕는 대표 라이브러리다

이 개념을 이해하면 다음 단계인 실제 토큰 실습도 훨씬 쉽게 따라갈 수 있습니다.

이더리움 ERC-20 공식 문서 바로가기

5편 Remix IDE 에서 기능성 토큰

다음 글 예고

다음 글에서는 Remix에서 가장 간단한 기능성 토큰 계약을 만들어보는 실습으로 넘어갑니다.
즉, 오늘 정리한 ERC-20 개념이 실제 코드와 배포 흐름에서 어떻게 보이는지 직접 연결해서 보게 될 것입니다.