ERC-2135 소모형 토큰 인터페이스 (Consumable Interface (Tickets, etc))

Final · NFT·멀티토큰 · 2019-06-23 작성

ERC-721·ERC-1155 토큰을 '소모할 수 있는' 자산으로 만들고 소모가 일어났을 때 이를 알리는 표준 인터페이스입니다. 공연 입장권처럼 한 번 쓰면 효력이 사라지는 디지털 자산에 쓰입니다.

왜 필요한가

공연 티켓 같은 디지털 자산은 보유하고 전송하는 것으로 끝나지 않고 실제로 '사용'되는 순간이 있습니다. 티켓 소유자가 공연장에 입장하면 그 티켓은 소모된 것입니다. 그런데 기존 토큰 표준에는 이 소모라는 동작을 표현하는 공통 방법이 없어서 서비스마다 제각기 다른 방식으로 구현해야 했습니다. 그러면 지갑이나 검표 서비스, 다른 컨트랙트가 어떤 토큰이 소모 가능한지, 소모가 실제로 일어났는지를 일관되게 확인할 수 없습니다. 이 표준은 소모 함수와 소모 가능 여부 조회 함수, 소모 발생 이벤트를 하나의 인터페이스로 정해서 이 사용 사례 위에 올라가는 서비스·클라이언트·화면·컨트랙트 간 기능이 서로 맞물려 동작하게 합니다.

심층 설명

consume 함수와 권한 설계

consume은 호출이 성공할 때마다 토큰 하나를 소모합니다. 이 표준은 누가 소모를 수행할 권한이 있는지, 어떤 조건에서 소모가 가능한지를 일부러 정하지 않습니다. 각 구현이 사용 사례에 맞게 정합니다. 다만 자산이 ERC-721 방식처럼 uint256 자산 id로 식별된다는 점은 전제합니다. _consumer 파라미터를 따로 둔 이유는 거래를 시작한 계정이 아닌 다른 사람을 위해 토큰을 소모할 수 있게 하기 위해서입니다. _data 필드는 추가 메시지나 향후 확장(예: 암호학적 보증 추가)을 위한 자리입니다.

isConsumableBy 뷰 함수

isConsumableBy는 상태를 바꾸지 않는 view 함수로, _consumer 주소가 _assetId 자산을 _amount 수량만큼 소모할 수 있는지를 불리언으로 돌려줍니다. 검표 서비스나 화면이 실제 consume을 호출하기 전에 소모 가능 여부를 미리 확인하는 용도입니다.

이벤트 규칙: OnConsumption과 Transfer

소모가 성공하면 OnConsumption 이벤트를 반드시 발생시켜야 합니다. 이 이벤트에는 consumer와 assetId가 인덱스로, amount와 data가 함께 기록됩니다. 또한 준수 컨트랙트가 ERC-721이나 ERC-1155 토큰이라면, consume 호출이 성공했을 때 토큰이 현재 보유자로부터 0 주소로 전송된 것처럼 Transfer 또는 TransferSingle 이벤트를 추가로 발생시켜야 합니다. 기존 토큰 이벤트를 구독하는 서비스도 소모를 소각성 전송으로 인식할 수 있게 하는 규칙입니다.

ERC-165 식별자 0xdd691946

준수 컨트랙트는 ERC-165의 supportsInterface(0xdd691946) 호출에 반드시 true를 돌려줘야 합니다. 클라이언트는 이 조회 한 번으로 상대 컨트랙트가 이 소모형 인터페이스를 지원하는지 알 수 있습니다.

의도적으로 뺀 것: 생성과 메타데이터

이 표준은 소모형 자산을 만드는(생성) 함수나 이벤트를 일부러 포함하지 않습니다. 생성은 실제 사용 사례의 성격에 대한 가정이 필요하기 때문이며 공통 사례가 생기면 후속 표준으로 다룰 수 있다고 설명합니다. 메타데이터도 표준에 넣지 않았고 필요하면 ERC-721의 ERC721Metadata 같은 별도 메타데이터 확장 인터페이스로 만들 수 있습니다.

호환 범위

이 인터페이스는 ERC-721과 ERC-1155의 NFT에 호환되도록 설계됐습니다. 다만 ERC-721이나 ERC-1155를 필수 요건으로 못 박지는 않았는데, 다른 토큰 표준이나 다른 사용 사례에 쓰일 미래 가능성을 배제하지 않기 위해서입니다. 약간 손보면 ERC-20, ERC-777, ERC-1155의 대체 가능 토큰에도 쓸 수 있다고 밝힙니다. 참고로 0x1002 버전의 참조 구현이 goerli 테스트넷 주소 0x3682bcD67b8A5c0257Ab163a226fBe07BF46379B에 배포되어 있습니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs