ERC-5007 시간 NFT: ERC-721 시간 확장 (Time NFT, ERC-721 Time Extension)

Final · NFT·멀티토큰 · 2022-04-13 작성

ERC-721 NFT에 시작 시각(startTime)과 종료 시각(endTime) 조회 함수를 더해 토큰의 유효 기간을 체인 위에서 표준 방식으로 관리할 수 있게 하는 확장입니다.

왜 필요한가

NFT 중에는 정해진 이용 기간이 있어 그 기간 밖에서는 쓸 수 없는 것이 있습니다. 그런데 기존 ERC-721에는 시간 정보가 없어서 특정 시점에 토큰을 무효로 만들거나 활성화하려면 누군가 직접 트랜잭션을 보내야 합니다. 이 과정은 번거롭고 수수료도 듭니다. 일부 NFT는 자체적으로 시간 기능을 넣기도 했지만 컨트랙트마다 인터페이스가 제각각이라 지갑이나 마켓 같은 서드파티 플랫폼이 이를 공통으로 지원하기 어렵습니다. 이 표준은 시작 시각과 종료 시각을 조회하는 공통 함수 두 개를 정의해 트랜잭션을 따로 보내지 않아도 체인 위에서 NFT를 자동으로 켜고 끌 수 있게 합니다.

구현해야 하는 것

심층 설명

기본 인터페이스 IERC5007

조회 함수 두 개가 핵심입니다. startTime(uint256 tokenId)는 NFT의 시작 시각을, endTime(uint256 tokenId)는 종료 시각을 UNIX 타임스탬프로 반환하며 반환형은 둘 다 uint64입니다. 두 함수 모두 tokenId가 존재해야 한다는 요구 조건이 있습니다. 이 인터페이스의 ERC-165 식별자는 0xf140be0d이므로, 외부 플랫폼은 ERC-165 조회로 어떤 컨트랙트가 이 확장을 지원하는지 확인할 수 있습니다. 상태를 바꾸는 함수는 없고 조회 전용이라, 시간에 따른 활성·비활성 판정은 이 값을 읽는 쪽에서 처리합니다.

선택 확장 IERC5007Composable

컴포저블 확장은 이 표준에서 선택 사항(OPTIONAL)입니다. 기존 NFT에서 새 NFT를 발행해 나누거나, 두 NFT를 하나로 합칠 수 있게 합니다. assetId(uint256 tokenId)는 시간 NFT의 자산 ID를 반환하며 같은 자산 ID를 가진 NFT끼리만 병합할 수 있습니다. 이 인터페이스의 ERC-165 식별자는 0x75cf3842입니다. 분할로 만들어진 새 토큰의 assetId는 원래 토큰의 assetId와 같습니다.

split의 요구 조건

split은 기존 토큰(oldTokenId) 하나를 두 개의 새 토큰으로 나눕니다. oldTokenId는 존재해야 하고 newToken1Id와 newToken2Id는 아직 존재하지 않아야 하며 newToken1Owner와 newToken2Owner는 영 주소(zero address)가 될 수 없습니다. 분할 기준 시각인 splitTime에는 require(oldToken.startTime <= splitTime && splitTime < oldToken.EndTime) 조건이 걸려 있어 기존 토큰의 유효 기간 안에 있어야 합니다. 즉 하나의 기간을 splitTime 앞뒤의 두 기간으로 쪼개 각각 다른 소유자에게 줄 수 있습니다.

merge의 요구 조건

merge는 첫 번째 토큰과 두 번째 토큰을 하나의 새 토큰으로 합칩니다. firstTokenId와 secondTokenId는 모두 존재해야 하고 require((firstToken.endTime + 1) == secondToken.startTime) 조건에 따라 첫 토큰의 종료 시각 바로 다음이 둘째 토큰의 시작 시각이어야 합니다. 또 require((firstToken.assetId()) == secondToken.assetId())로 두 토큰의 자산 ID가 같아야 합니다. newTokenOwner는 영 주소가 될 수 없고 newTokenId는 아직 존재하지 않아야 합니다. 시간이 끊김 없이 이어지는 같은 자산의 두 조각만 다시 하나로 붙일 수 있는 셈입니다.

시간 값에 uint64를 쓰는 이유

uint64의 최댓값은 18,446,744,073,709,551,615이고, 이를 타임스탬프로 보면 약 584,942,419,325년에 해당해 시간 표현에 충분합니다. 반면 uint256은 C, C++, Java, Go 같은 언어에서 다루기에 너무 크고 uint64는 주요 프로그래밍 언어가 기본으로 지원합니다. 그래서 startTime과 endTime의 반환형, split의 splitTime 매개변수 모두 uint64를 씁니다.

호환성과 구현 자료

이 표준은 ERC-721과 완전히 호환됩니다. 기존 ERC-721 동작을 바꾸지 않고 조회 함수를 더하는 방식이기 때문입니다. 원문에는 truffle로 실행하는 테스트 케이스(test.js)와 참조 구현(ERC5007.sol)이 함께 제공됩니다. 표준 자체는 ERC-165와 ERC-721을 필수로 요구하며(requires: 165, 721), 상태는 Final로 확정된 표준입니다.

ERC 원문 · ← ERCs