ERC-5484 합의형 소울바운드 토큰 (Consensual Soulbound Tokens)
Final · NFT·멀티토큰 · 2022-08-17 작성
다른 주소로 옮길 수 없는 NFT인 소울바운드 토큰의 표준 인터페이스입니다. 발행 전에 발행자와 수령자가 누가 토큰을 소각할 수 있는지 합의하고 그 권한은 발행 후 바꿀 수 없습니다.
왜 필요한가
소울바운드 토큰은 자격 증명, 신용 기록, 대출 이력, 멤버십처럼 특정 사람에게 묶여야 하는 정보를 담는 NFT로 큰 주목을 받았지만 공통 인터페이스가 없어 구현마다 서로 호환되지 않았습니다. 구현 방식에 대한 최소한의 합의가 없으면 소울바운드 토큰을 대상으로 하는 범용 서비스를 만들기 어렵습니다. 또한 기존 구현들은 ERC-721을 확장하면서 전송 함수가 전부 오류를 내도록 만들었을 뿐이어서 외부 서비스가 호출해 보기 전에는 이 토큰이 전송 불가인지 알 방법이 없었습니다. 용도마다 누가 토큰을 없앨 수 있어야 하는지도 달라서 응용별로 소각 권한을 미리 정하고 일반 NFT와 구분할 수 있게 하는 표준이 필요했습니다.
구현해야 하는 것
function burnAuth(uint256 tokenId) external view returns (BurnAuth): 해당 토큰 ID의 소각 권한을 돌려줍니다. 아직 발행되지 않은 토큰 ID는 유효하지 않아 조회가 실패합니다.
심층 설명
ERC-721을 확장하는 구조
이 표준을 구현한 컨트랙트는 ERC-165의 ERC165 인터페이스(0x01ffc9a7)와 ERC-721의 ERC721 인터페이스(0x80ac58cd)를 반드시(MUST) 구현해야 합니다. 이 표준 자체의 ERC-165 인터페이스 식별자는 0x0489b56f입니다. 소울바운드 토큰을 기존 ERC-721 토큰의 특수한 부분집합으로 설계한 것은 기존 NFT 서비스와의 매끄러운 호환성 때문입니다. 서비스 제공자는 소울바운드 토큰을 NFT처럼 다룰 수 있고 기존 코드베이스를 크게 바꿀 필요가 없습니다.
burnAuth의 세 가지 규칙
소각 권한(burnAuth)에는 세 가지 규칙이 있습니다. 첫째, 발행 전에 수령자에게 제시되어야 합니다(SHALL). 둘째, 발행 후에는 바꿀 수 없습니다(SHALL). 셋째, 어느 쪽이 토큰을 소각할 권리를 갖는지 정하는 유일한 기준이어야 합니다(SHALL). burnAuth(uint256 tokenId) 함수는 토큰 ID별 소각 권한을 돌려주며 아직 할당되지 않은 토큰 ID는 유효하지 않아 조회가 실패(throw)합니다. 소각 권한은 토큰 단위로 묶이므로 같은 컨트랙트 안에서도 토큰마다 다를 수 있습니다.
BurnAuth 네 가지 값과 쓰임새
열거형 BurnAuth는 소각 권한의 번호 체계를 표준화하기 위한 지침으로, IssuerOnly(발행자만 소각 가능), OwnerOnly(보유자만 소각 가능), Both(양쪽 다 가능), Neither(아무도 소각 불가) 네 값을 둡니다. 원문 Rationale은 예시로 IssuerOnly는 대출 기록, ReceiverOnly(명세의 OwnerOnly에 해당)는 유료 멤버십, Both는 자격 증명, Neither는 신용 기록을 듭니다. 용도마다 누가 기록을 지울 수 있어야 하는지가 다르기 때문에, 유연하면서도 발행 전에 미리 정해지는 소각 규칙을 핵심으로 삼았습니다.
발행 전 동의와 메타데이터 고정
발행자는 발행 전에 토큰 메타데이터를 수령자에게 제시하고 수령자의 서명을 받아야 합니다(SHALL). 발행 후에는 메타데이터를 바꿀 수 없습니다(SHALL NOT). 소각 권한이 발행 후 바뀌지 않는 만큼, 수령자가 토큰 내용과 소각 규칙을 모두 알고 동의한 상태에서만 발행이 이루어지도록 한 것입니다. 표준 이름에 합의형(Consensual)이 붙은 이유가 이 절차에 있습니다.
Issued 이벤트로 SBT임을 알림
토큰을 발행할 때는 ERC-721의 Transfer 이벤트와 함께 Issued 이벤트가 발생합니다. Issued 이벤트는 발행자(from), 수령자(to), 토큰 ID(tokenId), 소각 권한(burnAuth)을 담습니다. Transfer 이벤트를 그대로 유지해 하위 호환성을 지키면서 제3자에게는 이것이 일반 NFT가 아니라 소울바운드 토큰의 발행이라는 신호를 명확히 주는 설계입니다.
전송은 막되 미리 알 수 있게
ERC-721을 확장한 기존 소울바운드 구현들의 문제는 모든 전송 구현이 오류를 내기만 한다는 점이었습니다. 외부에서는 실제로 호출해 보기 전까지 전송 불가 토큰인지 알 수 없습니다. 이 표준에서도 전송 함수는 여전히 오류를 내지만 제3자가 호출 전에 컨트랙트가 소울바운드 인터페이스를 구현했는지 확인해 전송 호출 자체를 피할 수 있게 한 것이 더 깔끔한 접근이라고 원문은 설명합니다.
키 교체 문제와 소각 후 재발행
소유권을 바꿀 수 없는 소울바운드 토큰이 지갑 키 교체를 어렵게 만든다는 우려가 있습니다. 원문은 이를 타당한 우려로 인정하면서 소각 가능한 소울바운드 토큰이라면 키 교체가 가능하다고 설명합니다. 키를 바꿔야 하는 보유자가 발행자에게 알리면, 소각 권한을 가진 쪽이 토큰을 소각하고 발행자가 새 주소로 같은 내용의 토큰(replica)을 다시 발행하는 방식입니다.