ERC-5023 공유 가능 NFT (Shareable Non-Fungible Token)
Final · NFT·멀티토큰 · 2022-01-28 작성
가진 NFT의 사본을 새 토큰으로 발행해 다른 사람에게 나눠 줄 수 있게 하는 표준입니다. 원본은 그대로 남고, 누가 누구에게 무엇을 공유했는지 이벤트로 기록됩니다.
왜 필요한가
기존 NFT 표준인 EIP-721과 EIP-1155는 희소한 디지털 자산을 전제로 만들어졌고 토큰을 발행하거나 다른 사람에게 넘기는 방법만 정의합니다. 그런데 디지털 자원 중에는 희소할 필요가 없고 오히려 나눌수록 가치가 커지는 것이 있습니다. 예를 들어 프로젝트에 기여한 공로를 나타내는 토큰을 받은 사람이, 함께 고생한 동료에게도 그 인정을 나누고 싶을 수 있습니다. 기존 표준에는 이런 공유라는 동작이 없어서 원본을 간직한 채 사본을 발행해 건네는 방식을 컨트랙트마다 제각각 구현해야 했습니다. 공유 내역을 남기는 공통 이벤트도 없어서 누가 누구에게 공유했는지의 관계망을 표준적인 방법으로 추적할 수도 없었습니다. 이 표준은 공유를 위한 최소한의 함수와 이벤트를 하나의 인터페이스로 정의해 이 문제를 풉니다.
구현해야 하는 것
event Share(address indexed from, address indexed to, uint256 indexed tokenId, uint256 derivedFromtokenId);: 토큰이 공유될 때 발생하는 이벤트입니다. 공유한 주소, 받은 주소, 새로 발행된 토큰 id, 그리고 어떤 토큰에서 파생되었는지를 기록합니다.function share(address to, uint256 tokenIdToBeShared) external returns(uint256 newTokenId);: 기존 토큰을 다시 발행해 새 토큰 id를 부여하고 원본은 호출자가 그대로 보유한 채 새 토큰을 받는 사람에게 전송합니다. 받는 사람은 호출자와 다른 주소여야 합니다.
심층 설명
인터페이스 구성과 ERC-165 식별자
IERC5023은 IERC165를 상속하며 Share 이벤트와 share 함수 하나로 구성됩니다. share(address to, uint256 tokenIdToBeShared)는 기존 토큰을 다시 발행(remint)해 새 토큰 id를 부여하고 원본 토큰은 호출자 소유로 유지하며 새로 발행된 토큰을 호출자가 아닌 다른 주소인 수신자에게 전송한 뒤 newTokenId를 반환합니다. 이 인터페이스의 ERC-165 식별자는 0xded6338b입니다. EIP-165를 필수(requires)로 둡니다.
Share 이벤트의 의미
Share 이벤트는 share 함수가 성공적으로 호출되어 주어진 토큰 id를 바탕으로 새 토큰이 발행되고 수신자에게 전송되었을 때 발생할 것으로 기대됩니다. from(공유한 주소), to(받은 주소), tokenId(새 토큰 id)는 indexed 파라미터이고 derivedFromtokenId로 어떤 토큰에서 파생되었는지를 함께 기록합니다. 함수 호출자가 아닌 다른 지갑에 토큰이 재발행되어 주어졌음을 알리는 용도입니다.
전송 가능 여부는 구현에 위임
토큰의 전송 가능성을 어떻게 다룰지는 컨트랙트 구현자에게 맡깁니다. 전송을 열어 두면 공유 가능 토큰은 기존 토큰과 비슷하게 동작하되, 공유될 때 원본 버전이 유지된다는 점만 다릅니다. 전송을 막으면 공유 가능 비전송 토큰이 되어, 발행하고 다른 사람에게 주거나 공유할 수는 있지만 남에게 넘길 수는 없습니다. 인터페이스 차원에서는 특정 토큰 종류를 요구하지 않으므로, 디지털 복사, 부분 공유, 사용권 부여 같은 서로 다른 공유 방식의 구현이 모두 가능합니다.
공유 이벤트로 만드는 그래프
Share 이벤트 정보가 쌓이면 시간이 지나면서 나무 모양 구조가 만들어집니다. 밥이 앨리스에게 공유하고 앨리스가 찰리와 데이비드에게 공유하면 공유 활동에서 기초적인 나무 구조가 나옵니다. 이런 나무 구조를 더 모으고 접으면 일정 기간 동안 누가 누구에게 공유했는지를 바탕으로 한 네트워크 표현, 예를 들어 소셜 그래프로 만들 수 있습니다. 이 데이터는 나중에 토큰이 나타내는 공유 활동을 더 깊이 분석하는 데 쓸 수 있습니다.
참조 구현 ShareableERC721
참조 구현은 공동체 기여를 기리는 공유 가능 비전송 토큰입니다. ERC721URIStorage와 Ownable을 상속하고 mint는 onlyOwner로 컨트랙트 소유자만 호출할 수 있습니다. share는 to가 0 주소가 아니고 공유할 토큰이 존재하며 msg.sender가 그 토큰의 소유자일 것을 require로 검사합니다. 원본의 tokenURI를 읽어 _currentIndex를 id로 새 토큰을 발행하고 같은 URI를 설정한 뒤 Share 이벤트를 발생시킵니다. transferFrom과 safeTransferFrom은 모두 revert하도록 재정의해 토큰을 전송할 수 없게 했습니다.
기존 표준과의 호환성
이 제안은 EIP-721, EIP-1155와 하위 호환됩니다. 설계된 공유 가능 토큰은 인터페이스 수준에서 기존 토큰 표준과 호환되도록 만들어졌고 구현 컨트랙트는 공유 가능성 같은 요구 사항을 맞추기 위해 확장 기능을 담을 수 있습니다. 표준의 상태는 Final로 확정되어 더 바뀌지 않습니다.
쓸 때 주의할 점
- 참조 구현을 그대로 쓰지 말 것: 참조 구현은 운영 환경에서 그대로 사용해서는 안 됩니다. 이 외에 표준 구현과 직접 관련된 다른 보안 고려 사항은 없습니다.