ERC-5216 ERC-1155 수량 지정 승인 확장 (ERC-1155 Allowance Extension)

Last Call · NFT·멀티토큰 · 2022-07-11 작성

ERC-1155 토큰을 id별로, 정해진 수량만큼만 제3자에게 승인할 수 있게 하는 확장 표준입니다. 전부 아니면 전무였던 승인 권한을 수량 단위로 나눕니다.

왜 필요한가

여러 종류의 토큰을 한 컨트랙트에서 다루는 ERC-1155는 날마다 수많은 거래에 쓰이고 그중에서도 NFT 마켓플레이스와의 상호작용이 가장 흔합니다. 그런데 ERC-1155가 제공하는 승인 수단은 setApprovalForAll 함수뿐이어서 특정 id의 토큰을 전부 한꺼번에 승인하게 됩니다. 블록체인의 특성상 프로그래밍 오류나 악의적인 운영자가 있으면 자금이 영구히 사라질 수 있으므로, 거래는 최대한 신뢰가 필요 없는 방식이어야 합니다. 필요 이상으로 많은 권한을 맡기는 전체 승인 방식은 최소 신뢰 관점에서 분명한 결함이 있습니다. 이 표준은 ERC-20과 ERC-721의 아이디어를 결합해 소유자가 마켓플레이스 같은 제3자에게 한 id의 토큰을 무제한이 아니라 제한된 수량만큼만 승인할 수 있는 신뢰 장치를 만듭니다.

구현해야 하는 것

심층 설명

IERC5216 인터페이스와 ERC-165 식별자

이 표준을 쓰는 컨트랙트는 반드시(MUST) IERC5216 인터페이스를 구현해야 합니다. IERC5216은 IERC1155를 상속하는 확장으로, Approval 이벤트와 approve, allowance 두 함수로 구성됩니다. 이 인터페이스의 ERC-165 식별자는 0x1be07d74이며 supportsInterface 메서드는 0x1be07d74로 호출될 때 반드시 true를 반환해야 합니다.

approve 함수 요구사항

approve(address operator, uint256 id, uint256 amount)는 반드시 public 또는 external이어야 합니다. 호출자의 토큰 중 id에 해당하는 것을 amount만큼 전송할 권한을 operator에게 부여하며 operator는 호출자 자신일 수 없습니다. 일정 수량의 토큰이 승인될 때 반드시 Approval 이벤트가 발생해야 합니다.

allowance 함수 요구사항

allowance(address account, address operator, uint256 id)는 반드시 public 또는 external이면서 view여야 합니다. account의 id 토큰에 대해 operator가 전송하도록 승인받아 배정된 수량을 반환합니다. 사용자는 이 함수로 오퍼레이터가 id별로 가진 승인을 확인할 수 있습니다.

safeTransferFrom의 동작 규칙

ERC-1155가 정의한 safeTransferFrom은 두 가지 규칙을 반드시 지켜야 합니다. 첫째, 사용자가 msg.sender에게 충분한 amount를 승인했다면 전송이 revert되지 않아야 합니다. 둘째, msg.sender가 setApprovalForAll로 승인된 상태가 아니라면 전송된 토큰 수량을 승인 수량에서 차감해야 합니다. 즉 전체 승인을 받은 오퍼레이터는 기존대로 동작하고 수량 승인만 받은 오퍼레이터는 쓸 때마다 한도가 줄어듭니다.

safeBatchTransferFrom의 추가 조건

여러 id를 한 번에 옮기는 safeBatchTransferFrom에는 모든 id의 allowance가 승인된 amounts를 갖추고 있는지 확인하는 조건을 추가해야 합니다. 참조 구현의 _checkApprovalForBatch 함수가 이 확인 방식의 예시입니다.

ERC-20 이름 규칙을 따른 설계

이 표준의 이름인 ERC-1155 Allowance Extension은 표준의 내용을 간결하게 설명하기 위해 선택되었습니다. ERC-20 승인과의 유사성 때문에 approve, allowance라는 ERC-20의 이름 규칙을 그대로 썼습니다. 사용자는 approve로 id별 수량을 승인하고 allowance로 오퍼레이터의 승인을 조회하는 방식으로 신뢰 수준을 직접 관리할 수 있습니다. 이 표준은 ERC-1155와 하위 호환됩니다.

표준 진행 상태

원문 기준 이 제안의 상태는 Last Call이며 마지막 의견 수렴 마감일은 2022년 11월 12일이었습니다. 요구사항은 RFC 2119의 MUST, SHOULD 등 키워드 해석을 따릅니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs