ERC-6150 계층형 NFT (Hierarchical NFTs)

Final · NFT·멀티토큰 · 2022-12-15 작성

NFT들 사이에 부모와 자식 관계를 만들어 파일시스템 같은 트리 구조를 한 컨트랙트 안에서 관리할 수 있게 하는 EIP-721 확장 표준입니다.

왜 필요한가

폴더 안에 폴더와 파일이 들어가는 컴퓨터 파일시스템처럼, 많은 서비스는 계층 구조를 씁니다. 이베이의 카테고리, 레딧의 게시판과 글, 트위터의 리스트가 모두 그렇습니다. 그런데 기존 NFT 표준인 EIP-721은 토큰 하나하나가 서로 독립적이어서 어떤 토큰이 어떤 토큰의 하위에 속하는지 표현할 방법이 없습니다. 이런 관계를 온체인에 담으려면 프로젝트마다 제각각의 방식을 만들어야 하고 지갑이나 앱 같은 외부 프로그램은 그 구조를 읽을 공통된 방법이 없습니다. 이 표준은 부모 조회, 자식 목록 조회, 루트(맨 위) 여부와 리프(맨 아래) 여부 확인 같은 공통 인터페이스를 정해, 하나의 컨트랙트로 디렉터리와 카테고리 전체를 NFT로 관리하고 누구나 같은 방식으로 그 구조를 조회할 수 있게 합니다.

구현해야 하는 것

심층 설명

EIP-721 확장과 필수 인터페이스

이 표준은 EIP-721의 확장이며 호환 컨트랙트는 이 제안과 EIP-721, EIP-165 인터페이스를 모두 구현해야 합니다. 핵심 인터페이스 IERC6150의 ERC-165 식별자는 0x897e2c73입니다. EIP-721과 완전히 하위 호환되므로 기존 NFT 도구는 이 토큰을 일반 NFT로도 다룰 수 있습니다.

트리 구조와 토큰 ID 규칙

모든 NFT는 하나의 계층 트리를 이루며 각 토큰은 루트, 리프, 부모, 자식 중 어느 위치든 될 수 있습니다. 새 토큰을 발행할 때 Minted 이벤트로 부모 자식 관계를 알리는데, 루트 토큰을 발행할 때는 parentId를 0으로 둡니다. 따라서 ID가 0인 토큰은 실제 노드가 될 수 없고 실제 노드의 토큰 ID는 반드시 0보다 커야 합니다. 상하 노드 조회가 흔하므로 parentOf로 부모를, childrenOf로 자식 전체를 조회하도록 표준화했고 isRoot와 isLeaf로 루트와 리프 여부를 확인합니다.

Enumerable 확장

자식 노드를 하나씩 열거해 조회하는 선택 확장입니다. childrenCountOf는 부모 아래 자식 수를, childOfParentByIndex는 특정 순번의 자식 토큰 ID를, indexInChildrenEnumeration은 특정 토큰이 자식 목록에서 몇 번째인지 돌려줍니다. 세 함수 모두 parentId 인자를 받으며 호환성을 위해 parentId가 0이면 루트 노드를 대상으로 조회한다는 뜻입니다. 이 확장의 ERC-165 식별자는 0xba541a2e입니다.

Burnable 확장과 리프 제한

safeBurn과 safeBatchBurn으로 토큰을 소각하는 선택 확장입니다. 소각 대상이 리프 토큰이 아니면, 유효한 NFT가 아니면, 호출자가 소유자나 승인된 운영자 또는 해당 토큰의 승인 주소가 아니면 실패하도록 정의되어 있습니다. 즉 자식이 달려 있는 중간 노드는 바로 지울 수 없습니다. 이 확장의 ERC-165 식별자는 0x4ac0aa46입니다.

ParentTransferable 확장

파일시스템에서 파일이나 디렉터리를 다른 디렉터리로 옮기듯, 토큰의 부모를 바꿀 수 있게 하는 선택 확장입니다. transferParent는 토큰 하나를, batchTransferParent는 여러 토큰을 새 부모 아래로 옮기며 부모가 바뀔 때 ParentTransferred 이벤트로 이전 부모와 새 부모를 기록합니다. 이 확장의 ERC-165 식별자는 0xfa574808입니다.

Access Control 확장

계층 구조에서는 자식 발행, 이동, 소각 같은 작업 권한을 여러 계정이 나눠 갖는 경우가 많습니다. 이 확장은 권한 확인 함수를 표준화합니다. isAdminOf는 계정이 해당 토큰의 관리자인지 확인하며 토큰마다 관리자를 여럿 둘 수 있습니다. canMintChildren은 특정 부모 아래 자식 발행 권한을, canBurnTokenByAccount는 소각 권한을 확인합니다. parentId가 0이면 루트 발행 권한을 묻는 것입니다. 이 확장의 ERC-165 식별자는 0x1d04f0b3입니다.

활용처와 온체인 저장의 장점

원문은 레딧 같은 온체인 포럼, 트위터 같은 온체인 소셜 미디어, 조직 구조를 관리하는 온체인 법인, 이베이 같은 온체인 전자상거래 등 트리 구조가 있는 모든 응용을 사용 사례로 듭니다. 계층 전체가 온체인에 저장되므로 DAO 컨트랙트로 거버넌스를 붙일 수 있고 컨트랙트 하나로 모든 관계를 관리하며 디렉터리 소유권은 NFT로 이전이 가능하고 프런트엔드가 허가 없이 데이터를 읽을 수 있다는 점을 장점으로 제시합니다. 각 토큰의 tokenURI에는 다른 컨트랙트 주소, 웹사이트 링크 등 어떤 형태의 메타데이터든 담을 수 있습니다.

ERC 원문 · ← ERCs