ERC-5008 ERC-721 논스 확장 (ERC-721 Nonce Extension)

Last Call · NFT·멀티토큰 · 2022-04-10 작성

ERC-721 NFT에 전송될 때마다 바뀌는 번호인 논스(nonce)를 더하는 확장입니다. 판매 주문에 논스를 함께 기록하면, 지갑 이동으로 되살아난 옛 주문을 걸러내 헐값 판매를 막을 수 있습니다.

왜 필요한가

일부 NFT 마켓플레이스의 판매 주문이 공격을 받아, NFT가 현재 시장 최저가보다 낮은 가격에 팔리는 일이 있었습니다. 사용자가 NFT를 다른 지갑으로 옮겼다가 나중에 원래 지갑으로 되돌리면, 과거에 걸어 두었던 판매 주문이 다시 살아날 수 있기 때문입니다. 소유자는 이미 취소했다고 생각한 주문이 되살아나면, 지금 받고 싶은 가격보다 훨씬 낮은 가격에 그대로 체결될 수 있습니다. 그런데 주문이 만들어진 뒤에 토큰이 이동했는지를 컨트랙트에서 확인할 표준 방법이 없습니다. 이 표준은 토큰마다 전송될 때 바뀌는 번호인 논스를 두고 이를 조회하는 함수를 정의합니다. 주문에 논스를 함께 적어 두면, 체결 전에 현재 논스와 비교해 번호가 달라진 주문을 무효로 걸러내는 식으로 이런 공격을 피할 수 있습니다.

구현해야 하는 것

심층 설명

nonce 함수의 동작 요건

nonce(uint256 tokenId)는 특정 NFT의 현재 논스를 돌려주는 조회 함수입니다. tokenId가 유효한 NFT가 아니면 실행이 실패(throw)해야 합니다. 이 함수는 반드시 view로 구현해야 하므로 상태를 바꾸지 않고 언제든 읽을 수 있습니다. 논스는 토큰이 전송될 때 바뀌는 값이므로, 마켓플레이스 같은 외부 시스템은 주문을 만들 때의 논스와 체결 시점에 조회한 논스를 비교해 그 사이에 토큰이 이동했는지 판별할 수 있습니다.

NonceChanged 이벤트

NonceChanged(uint256 tokenId, uint256 nonce) 이벤트는 NFT의 논스가 바뀔 때 발생합니다. 이벤트에는 대상 토큰의 tokenId와 바뀐 뒤의 논스 값이 담깁니다. 체인에 남는 이 기록을 구독하면 각 토큰의 논스가 언제 어떤 값으로 바뀌었는지 따라갈 수 있으므로, 논스를 근거로 주문의 유효성을 검사하는 시스템이 변경 시점을 놓치지 않고 반영할 수 있습니다.

ERC-165 식별자 0xce03fdab

이 인터페이스의 ERC-165 식별자는 0xce03fdab입니다. 구현 컨트랙트는 supportsInterface를 0xce03fdab으로 호출했을 때 반드시 true를 돌려줘야 합니다. 호출하는 쪽은 임의의 ERC-721 컨트랙트를 상대할 때 먼저 이 값으로 확장 지원 여부를 확인한 뒤 nonce 함수를 호출하면 됩니다. 이 표준은 ERC-165와 ERC-721을 전제로 하는(requires: 165, 721) 확장이므로, 두 표준을 이미 구현한 컨트랙트 위에 더해 쓰는 구조입니다.

이름이 transferCount가 아니라 nonce인 이유

처음에는 함수 이름으로 transferCount(전송 횟수)가 검토되었습니다. 그러나 전송 말고도 논스를 바꿔야 할 경우가 있을 수 있습니다. 원문은 토큰의 중요한 속성이 바뀌는 경우를 예로 듭니다. 그래서 이름을 전송 횟수에 국한하지 않는 nonce로 바꿨습니다. 즉 논스는 토큰이 전송될 때 바뀌는 값이지만 구현에 따라 다른 중요한 변화가 있을 때도 바뀔 수 있도록 여지를 둔 이름입니다.

호환성과 제공되는 구현 자료

이 표준은 ERC-721과 호환되는 확장입니다. 기존 ERC-721의 동작을 바꾸는 것이 아니라 함수 하나와 이벤트 하나를 더하는 방식이므로, 기존 생태계와 충돌하지 않습니다. 원문 저장소에는 테스트 케이스(test.ts)와 참조 구현(ERC5008.sol)이 함께 제공됩니다. 구현자는 해당 디렉터리에서 npm install과 npm run test를 실행해 테스트를 돌려 볼 수 있어, 자체 구현이 표준이 기대하는 동작과 맞는지 확인하는 출발점으로 쓸 수 있습니다.

문서 상태와 보안 고려사항

원문 기준으로 이 제안의 상태는 라스트 콜(Last Call)이고 마지막 의견 수렴 기한은 2023년 8월 15일로 적혀 있습니다. 최종(Final)으로 확정되기 전의 마지막 검토 단계에 있는 문서이므로, 구현 전에 최신 상태를 확인하는 것이 좋습니다. 보안 고려사항(Security Considerations) 절에는 발견된 보안 문제가 없다고만 적혀 있어, 이 확장 자체가 새로 만드는 보안 위험은 원문에서 확인된 것이 없습니다.

ERC 원문 · ← ERCs