ERC-20이 무엇인가요?
Last updated
Last updated
블록체인을 가진 메인넷 중 스마트 컨트랙트를 지원하는 플랫폼에서는 토큰 발행이 가능합니다. 예를 들어 이더리움에서 토큰을 발행하는 프로그램(스마트 컨트랙트)을 작성하여 등록할 수 있습니다. 이더리움에서 스마트 컨트랙트는 누구나 작성하여 배포할 수 있기 때문에, 토큰 발행 역시 누구나 가능합니다.
이더리움 상에서는 수많은 토큰이 존재합니다. 스테이블 코인을 비롯해서, 유틸리티나 증권형, 커뮤니티 운영 등 다양한 목적과 종류의 토큰이 발행되어 있습니다. 토큰을 발행할 때 자체적인 양식을 쓸 수도 있지만, 이럴 경우 다른 토큰과의 교환이나 지갑과의 연동에서 호환성 문제가 발생할 수 있기 때문에 토큰을 발행할 때 공통적인 양식이 필요합니다.
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에는 다음과 같은 함수가 정의되어 있습니다. (코드는 몰라도 상관없습니다. function 뒤에 오는 함수의 이름에 집중해주세요.)
스테이블 코인으로 유명한 USDT를 가지고 ERC-20 토큰의 함수의 사용을 간단하게 예시를 들어 살펴보겠습니다. USDT 토큰의 이름은 ‘Tether USD’이고, 심볼은 ‘USDT’로 표기됩니다. 만약 블록체인 상에서 토큰을 발행할 때 이름과 심볼을 정의하고 싶다면, ERC-20의 name()과 symbol() 함수에 정의하면 됩니다. 또한, 토큰을 발행하는 수량과 유통량을 고려했을 때 화폐의 단위를 어느정도로 할 지를 나타내기 위해서 decimals을 사용합니다.
이외에도 각 함수는 다음과 같은 경우에 사용됩니다. 토큰 컨트랙트는 하나의 장부라고 생각하시고, 장부에 기입된 내용을 어떻게 요청하여 알아낼 수 있을까를 생각하며 다음 함수의 이름을 생각해보면 이해가 쉬울겁니다.
totalSupply
는 토큰의 발행 총량을 알 수 있는 인터페이스입니다.
balanceOf
는 요청한 계정의 잔액이 얼마인지를 알기 위해 사용됩니다.
transfer
는 토큰을 다른사람에게 이전하기 위해 사용됩니다다.
approve
는 다른 사람에게 정해진 금액 만큼 인출할 권리를 부여합니다.
allowance
는 다른 사람에게 허가한 금액의 허용 잔액이 얼마인지를 나타냅니다.
transferFrom
은 승인된 허가를 받은 사람이 토큰을 보낼 때 사용됩니다. 예를 들어, 여러분의 잔액을 A가 허가하에 B에게 전송하는 경우입니다. 사전에 approve를 통해 승인이 되어 있어야 합니다.
또한 이외에도 위에서 설명한 함수가 실행되면 알려주는 기능인 Events가 두가지 있습니다. 이벤트가 상대적으로 적은 이유는 자산이 이동되거나, 이동 가능성을 나타내는 경우가 두 가지 경우 뿐이기 때문입니다. 이름이 무엇인지, 누군가가 조회해 보았는지와 같은 상황은 자산의 변동에 해당되지 않기 때문에 특별히 이벤트가 발생하지 않습니다. 예를 들어, transfer(함수)가 실행되어, 자산의 이동이 일어나면, 이 내역에 대한 Transfer(이벤트)가 발생합니다.
이렇게 알고보니, 여러분의 지갑에서 표시되는 토큰의 이름, 심볼, 화폐 단위나 잔액 등이 ERC-20 토큰 컨트랙트로부터 가져온 정보라는 것을 알 수 있겠네요. 그리고 다른 사람에게 토큰을 전송할 경우에는 토큰 컨트랙트에 transfer, approve, allowance와 같은 기능을 사용한다는 것도 알 수 있고요. 이를 모든 토큰마다 동일하게 적용한 ERC-20이 있으면 개발할 때도 쉽게 추가가 가능하기 때문에 매우 편리합니다.
ERC-20은 이더리움에 해당하는 표준 인터페이스를 나타내지만, 각 블록체인 네트워크 마다 토큰을 발행할 때 사용하는 표준이 존재합니다. 여러분이 개발자가 아니라면, ERC-20의 내용에 대해선 몰라도 상관없지만, 사용자의 많은 실수 중 하나는 ERC-20 토큰을 이더리움이 아닌 다른 네트워크의 주소로 보낸 다는 것입니다. 이를 방지하기 위해서라도 ERC-20 토큰인지, 혹은 다른 네트워크의 표준 규격으로 발행된 토큰인지를 구분할 수 있는 지식은 반드시 필요합니다. 이와 관련된 자세한 내용은 다음 링크를 참고해주세요.
💡같이 읽어보면 좋을 아티클
ERC20 토큰 : 이더리움 생태계를 혁신하는 디지털 자산
ERC721 토큰: NFT 시장을 이끄는 블록체인 기술
ERC 1155 토큰 : 디지털 자산 관리의 미래를 여는 이더리움 토큰 표준