ERC-20이 무엇인가요?

블록체인을 가진 메인넷 중 스마트 컨트랙트를 지원하는 플랫폼에서는 토큰 발행이 가능합니다. 예를 들어 이더리움에서 토큰을 발행하는 프로그램(스마트 컨트랙트)을 작성하여 등록할 수 있습니다. 이더리움에서 스마트 컨트랙트는 누구나 작성하여 배포할 수 있기 때문에, 토큰 발행 역시 누구나 가능합니다.

이더리움 상에서는 수많은 토큰이 존재합니다. 스테이블 코인을 비롯해서, 유틸리티나 증권형, 커뮤니티 운영 등 다양한 목적과 종류의 토큰이 발행되어 있습니다. 토큰을 발행할 때 자체적인 양식을 쓸 수도 있지만, 이럴 경우 다른 토큰과의 교환이나 지갑과의 연동에서 호환성 문제가 발생할 수 있기 때문에 토큰을 발행할 때 공통적인 양식이 필요합니다.

ERC-20의 필요성

ERC은 Ethereum Request for Comments의 약자로, ERC-20은 이더리움 내에서 20번째로 제안된 요청을 의미합니다. 20번째 제안 요청의 내용은 토큰을 발행할 때 외부에서 접근하기 위한 인터페이스의 형식을 정의하기 위한 내용입니다. ERC-20은 현재까지도 가장 많이 활용되는 표준 인터페이스 중 하나입니다.

이더리움의 코인인 이더의 경우, 여러분의 지갑에 생성된 개인키의 계정있고, 블록체인 상의 계정에서 코인을 보관하고 있습니다. 하지만 ERC-20 토큰의 경우에는 토큰을 발행한 컨트랙트가 존재하고, 컨트랙트에 여러분의 계정이 얼마를 가지고 있는지를 나타내주는 방식으로 표현됩니다. 따라서 실제 자산은 토큰 컨트랙트가 가지고 있다고 할 수 있습니다. 여러분은 컨트랙트에 있는 자산을 옮길 수 있는 제어권을 가지고 있는 셈입니다. 따라서, 토큰 컨트랙트는 블록체인 상에서 무결성을 보장받으므로 토큰을 관리하는 하나의 장부라고 할 수 있겠네요.

예를 들어, ABC 토큰 컨트랙트에서 Alice가 Bob에게 10 ABC를 전송한다고 해보겠습니다. Alice는 개인키로 서명된 트랜잭션을 블록체인에 제출할 것이고, 토큰 컨트랙트에서는 Alice가 10 ABC를 가지고 있을 경우, Bob에게 10 ABC 토큰을 이전하는 동작을 실행합니다. 이렇게 작동하는 기능의 이름을 컨트랙트 상에서 transfer라고 표기해두었다고 해보겠습니다. 그런데 ABC 토큰만 있는게 아니라, DEF 토큰, GHI 토큰도 있을 텐데, 각 컨트랙트에는 send, transmit 이라고 해둔다면, 서로 교환도 어려울 뿐더러, 지갑에서 구현이 어려워 질 수가 있습니다. 그래서 ERC-20은 이러한 상황을 방지하기 위해 표준 인터페이스로 제안된 것입니다.

ERC-20의 내용

ERC-20에는 다음과 같은 함수가 정의되어 있습니다. (코드는 몰라도 상관없습니다. function 뒤에 오는 함수의 이름에 집중해주세요.)

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

function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

스테이블 코인으로 유명한 USDT를 가지고 ERC-20 토큰의 함수의 사용을 간단하게 예시를 들어 살펴보겠습니다. USDT 토큰의 이름은 ‘Tether USD’이고, 심볼은 ‘USDT’로 표기됩니다. 만약 블록체인 상에서 토큰을 발행할 때 이름과 심볼을 정의하고 싶다면, ERC-20의 name()과 symbol() 함수에 정의하면 됩니다. 또한, 토큰을 발행하는 수량과 유통량을 고려했을 때 화폐의 단위를 어느정도로 할 지를 나타내기 위해서 decimals을 사용합니다.

이외에도 각 함수는 다음과 같은 경우에 사용됩니다. 토큰 컨트랙트는 하나의 장부라고 생각하시고, 장부에 기입된 내용을 어떻게 요청하여 알아낼 수 있을까를 생각하며 다음 함수의 이름을 생각해보면 이해가 쉬울겁니다.

  • totalSupply는 토큰의 발행 총량을 알 수 있는 인터페이스입니다.

  • balanceOf는 요청한 계정의 잔액이 얼마인지를 알기 위해 사용됩니다.

  • transfer는 토큰을 다른사람에게 이전하기 위해 사용됩니다다.

  • approve는 다른 사람에게 정해진 금액 만큼 인출할 권리를 부여합니다.

  • allowance는 다른 사람에게 허가한 금액의 허용 잔액이 얼마인지를 나타냅니다.

  • transferFrom은 승인된 허가를 받은 사람이 토큰을 보낼 때 사용됩니다. 예를 들어, 여러분의 잔액을 A가 허가하에 B에게 전송하는 경우입니다. 사전에 approve를 통해 승인이 되어 있어야 합니다.

또한 이외에도 위에서 설명한 함수가 실행되면 알려주는 기능인 Events가 두가지 있습니다. 이벤트가 상대적으로 적은 이유는 자산이 이동되거나, 이동 가능성을 나타내는 경우가 두 가지 경우 뿐이기 때문입니다. 이름이 무엇인지, 누군가가 조회해 보았는지와 같은 상황은 자산의 변동에 해당되지 않기 때문에 특별히 이벤트가 발생하지 않습니다. 예를 들어, transfer(함수)가 실행되어, 자산의 이동이 일어나면, 이 내역에 대한 Transfer(이벤트)가 발생합니다.

event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

이렇게 알고보니, 여러분의 지갑에서 표시되는 토큰의 이름, 심볼, 화폐 단위나 잔액 등이 ERC-20 토큰 컨트랙트로부터 가져온 정보라는 것을 알 수 있겠네요. 그리고 다른 사람에게 토큰을 전송할 경우에는 토큰 컨트랙트에 transfer, approve, allowance와 같은 기능을 사용한다는 것도 알 수 있고요. 이를 모든 토큰마다 동일하게 적용한 ERC-20이 있으면 개발할 때도 쉽게 추가가 가능하기 때문에 매우 편리합니다.

ERC-20은 이더리움에 해당하는 표준 인터페이스를 나타내지만, 각 블록체인 네트워크 마다 토큰을 발행할 때 사용하는 표준이 존재합니다. 여러분이 개발자가 아니라면, ERC-20의 내용에 대해선 몰라도 상관없지만, 사용자의 많은 실수 중 하나는 ERC-20 토큰을 이더리움이 아닌 다른 네트워크의 주소로 보낸 다는 것입니다. 이를 방지하기 위해서라도 ERC-20 토큰인지, 혹은 다른 네트워크의 표준 규격으로 발행된 토큰인지를 구분할 수 있는 지식은 반드시 필요합니다. 이와 관련된 자세한 내용은 다음 링크를 참고해주세요.

page블록체인 네트워크 이해하기

Last updated