ERC-721이 무엇인가요?

이번 편에서는 NFT를 블록체인 상에서 구현하는데 사용되는 ERC-721 표준에 대해서 알아보도록 하겠습니다.

ERC-20편에서 언급하였듯이, ERC는 이더리움에서 사용하는 표준이지만 도입된 목적과 사용되는 방식은 다른 블록체인 메인넷에서도 유사합니다. 원활한 이해를 위해 아래 링크의 ERC-20에 대한 설명을 먼저 읽기를 추천드립니다.

pageERC-20이 무엇인가요?

NFT와 ERC-721 등장 배경

NFT란 Non-Fungible Token의 약자입니다. Fungible Token이 아니라는 의미인데, 그렇다면 Fungible Token(FT)이란 무엇을 의미할까요? 우선 토큰은 ERC-20 편에서도 다루었듯이 블록체인 플랫폼 상에서 발행할 수 있는 자산을 의미합니다. 예를 들어, 이더리움 상에서 발행되어 있는 스테이블 코인인 USDT가 있습니다. UDST는 1개의 토큰이 약 1달러의 가치를 지니며, 모든 토큰이 동일한 가치를 지닙니다. 따라서 USDT 토큰이기만 하면, 그것이 어떤 토큰이든 상관없이 동일한 가치를 가지고 있기 때문에 거래를 할 때 1:1로 상호 교환이 가능합니다. 이러한 특성을 가진 토큰을 대체 가능한 토큰(Fungible Token)이라고 합니다.

그렇다면 대체 불가능한(Non-Fungible)한 특성을 가지는 토큰에는 어떤 것이 있을까요? 이더리움에서 NFT로 발행된 유명한 프로젝트인 크립토키티(Crypto Kitties)를 예로 들어보겠습니다. 크립토키티는 블록체인 기반의 고양이를 육성하는 게임으로, 사용자들은 고양이를 사서 수집하거나 다른 종과 교배하여 새로운 고양이를 만들고 이를 거래하기도 합니다. 여기에서 고양이를 나타내는 방식에서 토큰을 사용하는데, 각 고양이들은 서로 다른 모양과 특성을 가지고 있습니다. 어떤 특성은 희소하기도 하고, 어떤 특성은 특정 사용자에게 구매욕을 일으킬 만한 가치가 있을 수도 있습니다. 따라서 토큰과 연결된 크립토키티 이미지의 특성에 따라 각각 다른 가치를 지니기 마련인데, 대체 가능한 특성을 가진 토큰을 발행하는 ERC-20 표준으로는 이러한 특성을 반영하는데 한계가 있습니다. 이러한 이유로 대체 불가능한 특성을 가진 토큰을 발행할 때 사용되는 토큰 형식이 필요하여 NFT라고 정의하고, 이를 구현하기 위한 새로운 표준 ERC-721이 등장하였습니다.

NFT는 FT와 다른점은 토큰에 연결된 가치가 있는 어떤 것이 존재한다는 것입니다. 앞서 설명한 크립토키티의 경우에는 고양이 이미지에 대한 소유권이 해당됩니다. 이미지 자체는 인터넷에 공개된 데이터라 누구든 사용가능하지만, 고양이를 거래하거나 자신의 것이라고 주장하는 것은 토큰 소유주만이 가능합니다. 이를 확장해보면 실제 세계에서 가치가 있다고 여겨지는 예술 작품에 대한 소유권을 NFT로 발행하여 거래할 수도 있습니다. NFT는 고유한 가치를 지닌 어떤것을 토큰으로 발행하여 블록체인 상에서 거래 가 가능한 형태로 확장시켜주는 역할로 볼 수도 있기 때문에 디지털 소유권(Digital Ownership)이라 불리기도 합니다.

이는 마치 부동산과 등기부등본과 같은 사례와 비슷하다고 할 수 있습니다. 실제 가치가 있는 부동산과, 이에 대한 권리를 증명할 수 있는 등기부등본이 별개인 것처럼, NFT도 이와 유사하게 관리됩니다. 단, NFT는 블록체인 상에 존재하는 토큰이기 때문에 중앙화된 주체가 아닌 탈중앙화된 스마트 컨트랙트에 의해 발행되며, 위변조가 불가능하나는 특징이 있습니다.

ERC-721 standard

ERC-20처럼 ERC-721로 발행된 NFT도 송금 및 교환이 가능하기 위해서는 공통된 인터페이스를 필요로 합니다. 예를 들어, ERC-20에 사용된 전송 기능(Transfer)과 같은 것이 이에 해당합니다. NFT는 고유한 가치를 지닌 토큰이기 때문에 토큰의 소유주가 누구인지를 나타내는 소유주 조회, NFT의 데이터 특성을 나타내는 메타데이터를 연결하는 인터페이스가 추가되었습니다.

아래는 ERC-721의 인터페이스를 나타냅니다. (코드보다는 function 뒤의 이름에 주목해주세요.)

function ownerOf(uint256 _tokenId) external view returns (address); 
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function balanceOf(address _owner) external view returns (uint256);

FT를 거래하거나 확인할 때 주요 관점은 수량(Amount)에 있습니다. 누군가에게 얼마만큼의 토큰을 보낼지, 잔액이 얼마인지 등을 나타내는데 수량이 중요합니다. 하지만 NFT는 토큰 하나하나가 고유한 가치를 가지기 때문에 같은 프로젝트 내에서 토큰 ID를 통해 관리가 됩니다. 크립토키티에서도 모든 고양이는 하나의 컨트랙트에서 발행되었지만, 이미지 하나하나가 각각 고유한 토큰 ID에 매핑됩니다.

ownerOf는 토큰 ID(_tokenID)를 통해 소유주가 누구인지를 알려주는 인터페이스입니다. NFT에 할당된 토큰 번호를 통해 어떤 주소가 소유권을 가지고 있는지 알 수 있습니다. 거래를 위해 토큰 전송 권한을 부여하는 approve나 소유권을 이전하기 위한 transferFrom의 경우에도, FT처럼 수량을 설정하는 것이 아니라 NFT의 토큰 ID를 기반으로 동작을 수행하는 것을 알 수 있습니다.

이외에도 소유주(_owner)를 조회하여 해당 주소가 가지고 있는 NFT의 개수를 알려주는 balanceOf도 표준에 포함됩니다.

NFT 메타데이터

ERC-721은 NFT를 구현하기 위해 스마트 컨트랙트 상에서 필요한 함수들을 정의한 인터페이스입니다. 하지만, FT와는 다르게 NFT는 실제 블록체인 상의 토큰의 소유권과 별개로 다양한 정보들을 포함하고 있는 경우가 많습니다. 예를 들어, 크립토키티의 경우 각 고양이들이 어떤 특징을 가지고 있는지를 명세화 하여 나타낼 필요가 있는데, 이러한 데이터 양식을 메타데이터라고 합니다.

이렇게 토큰과 메타데이터를 별개로 나누어서 관리하는 이유는, NFT를 표현하기 위해 다양한 정보가 필요할 수 있는데 블록체인에 직접 저장하는 것이 비효율적이기 때문입니다. 이미지나 영상을 NFT로 발행할 때, 파일을 직접 블록체인 상에 저장하는 것은 비용이 많이 듭니다. 따라서 보통 활용되는 방법은 외부 저장소를 활용하고, 이미지가 저장된 링크만 블록체인에 업로드 하는 방식입니다. 외부 저장소로는 IPFS와 같은 분산 스토리지 플랫폼이 활용 될 수 있습니다.

메타데이터는 어떤 NFT인지에 따라 자유롭게 작성이 가능하며 분야마다 특징이 매우 다르기 때문에 표준화되어 있지 않습니다. 다만, 아래와 같이 NFT의 이름 name이나, 토큰의 symbol, 토큰에 연결된 데이터가 저장된 외부 주소를 가리키는 tokenURI 같은 것들은 공통적으로 많이 활용되는 메타데이터 형식입니다.

function name() external view returns (string _name);
function symbol() external view returns (string _symbol);
function tokenURI(uint256 _tokenId) external view returns (string);

이번 편에서는 ERC-721을 이해하기 위해 몇 가지의 대표적인 인터페이스를 살펴보았습니다. 자세한 사항에 관심이 있으신 분들은 표준 문서를 참고하시기 바랍니다.

https://eips.ethereum.org/EIPS/eip-721

Last updated