ERC-6147 NFT·SBT 가드 확장 (Guard of NFT/SBT, an Extension of ERC-721)

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

NFT와 소울바운드 토큰(SBT)에 유효기간이 있는 가드(guard)라는 관리 역할을 추가해 토큰을 보유한 채 쓰는 권리와 옮기는 권리를 분리할 수 있게 하는 ERC-721 확장 표준입니다.

왜 필요한가

NFT는 쓰임새와 재산 가치를 함께 가진 자산인데, 도난 사례가 많습니다. 도난을 막으려고 인터넷과 분리된 콜드월렛으로 옮겨 두면 정작 쓰기가 불편해집니다. NFT를 담보로 돈을 빌릴 때도 NFT를 대출 컨트랙트에 넘겨야 해서 돈을 빌리는 동안에는 NFT를 쓸 수 없습니다. 현실에서 집을 담보로 잡혀도 그 집에 계속 살 수 있는 것과 다릅니다. 한 주소에 묶여 옮길 수 없는 토큰인 소울바운드 토큰(SBT)도 문제입니다. 지갑 개인키를 잃어버리거나 도난당하면 SBT를 되찾을 방법과 표준이 없고 대학이 졸업장 SBT를 발급한 뒤 부정행위가 드러난 졸업자에게서 회수할 방법도 필요합니다. 보유 권리와 이전 권리를 나누는 공통 규칙이 없으면 이런 사례마다 따로 해법을 만들어야 합니다.

구현해야 하는 것

심층 설명

가드 유무에 따른 권한 규칙

가드는 expires 이전에만 유효해야 합니다(MUST). 가드가 없거나 만료되면 guardInfo는 (address(0), 0)을 반환해야 하고 이때는 토큰의 소유자, 승인된 운영자(authorised operators), 승인 주소가 가드와 expires를 설정할 수 있어야 합니다. 반대로 유효한 가드가 있으면 소유자와 승인된 주소는 가드와 expires를 바꿀 수 없고 토큰을 이전할 수도 없으며(MUST NOT), 가드만이 가드 제거와 변경, 토큰 이전을 할 수 있어야 합니다. 유효한 가드가 있는 토큰이 소각(burn)되면 가드는 삭제되어야 합니다.

인터페이스 구성과 구현 요건

인터페이스 IERC6147은 changeGuard, removeGuard, transferAndRemove, guardInfo 네 함수와 UpdateGuardLog 이벤트로 구성됩니다. changeGuard에서 newGuard는 0 주소일 수 없고 expires는 유효해야 하며 tokenId가 유효한 NFT가 아니면 실패합니다. 세 상태 변경 함수는 public 또는 external로, guardInfo는 pure 또는 view로 구현할 수 있습니다(MAY). 가드가 바뀔 때마다 UpdateGuardLog 이벤트를 발생시켜야 하고 supportsInterface는 0xb61d1057에 대해 true를 반환해야 합니다(MUST).

참조 구현의 이전 가로채기 방식

참조 구현은 ERC-721의 transferFrom과 safeTransferFrom을 오버라이드해 이전 전에 _checkGuard로 가드를 확인합니다. 유효한 가드가 있으면 호출자가 가드여야 통과하고 이때 실제 보내는 주소는 ownerOf(tokenId)로 다시 읽어 사용합니다. 가드가 없으면 기존 ERC-721처럼 소유자나 승인 주소인지 검사합니다. _updateGuard는 기존 가드가 있으면 가드 본인만, 없으면 소유자나 승인 주소만 변경을 허용하고 _burn은 소각 후 _guardInfo 항목을 지우고 이벤트를 발생시킵니다. changeGuard는 expires가 현재 블록 시각보다 커야 한다고 검사합니다.

expires가 넓히는 쓰임새

가드에 만료 시각을 두면 설계 폭이 넓어집니다. 발행 시 일정 기간 잠기는 NFT에 할인을 주는 유연한 발행이 가능합니다. 가드 주소의 개인키를 잃어 접근할 수 없게 되어도 만료 이후에는 소유자가 NFT를 되찾을 수 있습니다. 사용 기한이 있는 SBT도 guard와 expires로 관리할 수 있습니다. SBT를 발행할 때는 가드를 지정된 주소로 일괄 설정해 관리를 쉽게 할 수 있습니다(MAY).

범용성과 확장성

이 표준은 현실 자산에 붙는 권리를 분석해 NFT와 SBT의 권리를 보유 권리와 이전 권리로 추상화했습니다. 쓰임새마다 전용 EIP를 만들면 표준 수가 늘어 개발자 부담이 커지므로, 하나의 범용 규칙으로 도난 방지, 대출, SBT 관리 등을 모두 다룹니다. 사회적 복구나 다중 서명 같은 복잡한 기능이 필요하면 가드를 제3자 프로토콜 주소로 지정해 그 프로토콜 쪽에서 구현할 수 있습니다. 이름은 guardian과 guard 중 더 짧고 간결한 guard를 골랐습니다.

ERC-721과의 호환성

이 표준은 확장 함수 집합을 더하는 방식이라 ERC-721과 완전히 호환됩니다. 이 표준으로 발행한 NFT라도 가드를 설정하지 않으면 기존 기능 면에서 일반 ERC-721 NFT와 다르지 않습니다. 상태는 Final로 확정된 표준입니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs