블록체인에서 기능성 토큰을 이야기할 때 가장 자주 등장하는 표현 중 하나가 바로 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이란 무엇인가?
transferFrom은 approve로 미리 허락받은 범위 안에서 대신 토큰을 이동시키는 기능입니다.
이 기능은 직접 보내는 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 구현을 돕는 대표 라이브러리다
이 개념을 이해하면 다음 단계인 실제 토큰 실습도 훨씬 쉽게 따라갈 수 있습니다.
다음 글 예고
다음 글에서는 Remix에서 가장 간단한 기능성 토큰 계약을 만들어보는 실습으로 넘어갑니다.
즉, 오늘 정리한 ERC-20 개념이 실제 코드와 배포 흐름에서 어떻게 보이는지 직접 연결해서 보게 될 것입니다.