ERC-6381 공개 NFT 이모지 반응 저장소 (Public Non-Fungible Token Emote Repository)

Final · NFT·멀티토큰 · 2023-01-22 작성

누구나 어떤 NFT에든 유니코드 이모지로 반응을 남기고 취소할 수 있는 공용 저장소 컨트랙트 표준입니다. 모든 네트워크에서 같은 주소로 접근할 수 있습니다.

왜 필요한가

지금의 NFT 시장은 토큰이 과거에 팔린 가격, 최저 호가, 마켓플레이스가 제공하는 희소성 정보에 크게 의존합니다. 특정 토큰이 지금 얼마나 호감과 관심을 받고 있는지 실시간으로 보여 주는 지표는 없습니다. 좋아요 같은 반응 기능이 있어도 특정 업체의 독점 시스템이거나 체인 밖(오프체인)에서 처리되기 때문에 조작될 수 있고 믿기 어렵습니다. 반응 기록이 서비스마다 흩어져 있으면, 반응이 일정 수를 넘으면 토큰이 변하는 것 같은 피드백 기반 기능도 신뢰할 수 있게 만들기 어렵습니다. 이 표준은 누구나 쓸 수 있는 공용 저장소 컨트랙트를 모든 네트워크에서 같은 주소로 제공해, 어떤 NFT에든 유니코드 이모지로 반응을 남기고 그 기록을 체인 위에서 투명하게 조회할 수 있게 합니다.

심층 설명

모든 체인에서 같은 주소를 쓰는 공용 저장소

이 표준은 개별 토큰 컨트랙트에 붙이는 확장이 아니라 누구나 쓰는 공용 저장소(common-good repository) 하나로 설계되었습니다. 덕분에 표준 이전에 발행된 ERC-721, ERC-1155 토큰에도 반응을 남길 수 있습니다. 저장소 주소는 결정적으로 계산되어 모든 체인에서 0x31107354b61A0412E722455A771bC462901668eA로 같습니다. 주소 앞부분 0x311073은 EMOTE를 형상화한 것입니다. 통합하는 쪽은 체인마다 주소를 찾을 필요 없이 같은 주소를 조회하면 됩니다.

이모지는 bytes4 유니코드 식별자로 표현

반응은 문자열이나 숫자가 아니라 유니코드 이모지의 bytes4 식별자로 기록합니다. 이모지가 감정과 인상을 전달하는 확립된 수단이기 때문입니다. 유니코드 표준에 없는 값도 넣을 수 있어 커스텀 이모트가 가능하지만 그 경우 어떤 이미지를 그릴지 화면 쪽이 알아야 하므로 해당 반응은 그것을 만든 인터페이스나 마켓플레이스 안에서만 통용될 가능성이 큽니다.

emote와 bulkEmote의 동작 규칙

emote는 state가 true면 반응을 남기고 false면 취소합니다. 이미 같은 상태를 다시 설정하려고 하면 아무 일도 하지 않으며 Emoted 이벤트는 상태가 실제로 바뀔 때만 발생해야 합니다(MUST). bulkEmote는 collections, tokenIds, emojis, states 배열의 길이가 서로 다르면 되돌려야 합니다(MUST revert). 단건과 다건 함수를 모두 둔 것은 네트워크 가스 비용과 토큰 수에 따라 사용자가 더 경제적인 쪽을 고를 수 있게 하기 위해서입니다.

사전 서명으로 대리 제출하기

prepareMessageToPresignEmote가 돌려주는 메시지는 keccak256(abi.encode(DOMAIN_SEPARATOR, collection, tokenId, emoji, state, deadline))로 만듭니다. DOMAIN_SEPARATOR는 "ERC-6381: Public Non-Fungible Token Emote Repository", "1", block.chainid, address(this)를 abi.encode해 keccak256으로 해시한 값이라 체인마다 다릅니다. 반응 당사자가 이 메시지에 ECDSA 서명을 하면 다른 사람이 presignedEmote로 대신 제출할 수 있습니다. deadline이 지났거나 서명에서 복원한 주소가 영 주소면 되돌려야 합니다. 위임자 목록을 두는 방식 대신 서명을 택해 복잡도를 줄였고 오프체인 활동으로 얻은 반응을 대신 기록하는 것 같은 쓰임을 염두에 둔 기능입니다.

조회 함수와 인터페이스 식별자

emoteCountOf는 토큰 하나의 특정 이모지 반응 수를, bulkEmoteCountOf는 여러 조합을 배열로 돌려줍니다. hasEmoterUsedEmote와 haveEmotersUsedEmotes는 특정 계정이 특정 토큰에 해당 이모지를 썼는지 여부를 단건과 다건으로 확인합니다. 이 인터페이스의 ERC-165 식별자는 0xd9fac55a입니다.

체인 ID를 매개변수로 넣지 않은 이유

한 체인에서 다른 체인의 토큰에 반응할 수 있도록 체인 ID 매개변수를 넣자는 제안이 있었지만 채택하지 않았습니다. 드물게 쓰일 기능 때문에 모든 반응 트랜잭션 비용이 늘고 마켓플레이스와 지갑이 반응을 모으려면 저장소가 배포된 모든 체인을 조회해야 하기 때문입니다. 저장소는 반응 대상 토큰의 존재 여부를 검증하지 않으므로 아직 없는 토큰에도 반응할 수 있고 같은 주소에 다른 컬렉션이 있을 가능성은 매우 낮아 다른 체인의 컬렉션 주소로 반응을 기록하는 우회도 가능합니다.

쓸 때 주의할 점

ERC 원문 · ← ERCs