미디움에서 가져온 글이라 반말체인점 양해부탁드립니다ㅠㅠ
Hype이 높은 NFT 프로젝트에는 언제나 꾼들이 몰리기 마련이다.
단순히 봇의 문제가 아니다. 현재에도 많은 NFT 프로젝트들이 사이트를 오픈하고, NFT 이미지를 공개하고, 민팅에 나서고 있지만, 자기 자신들이 얼마나 자신들의 NFT의 가치를 깎아먹고 있는지 모르고 있다.
NFT 스나이핑에 대한 개념부터 잡아보자.
“NFT의 Rarity정보와 높은 rarity의 NFT 번호를 사전에 취득하여 해당 번호를 특정한 방법으로 민팅받는 행위”
물론 이 정의는 통용되는 것은 아니다. 어떤 곳에서는 NFT Rarity Sniping이라고 부르기도 하고, NFT 스나이핑과 NFT 레어리티 스나이핑이라는 동명의 다른 서비스가 있기도 하다. 다만, ‘특정 NFT 번호를 노리고 민팅하는 행위’가 저격, 그러니까 스나이핑과 닮아있으니 이 글에선 NFT 스나이핑이라고 부르도록 하자.
개발자를 데리고 엄청나게 고민해서 보안을 높이라는 얘기가 아니다.
사실 들여다보면 아~주 간단한 문제다.
NFT 스나이핑을 하는 대상을 먼저 살펴보자.
NFT 민팅이 시작되거나, 그 전에 프로젝트에서 마케팅용 NFT를 먼저 발행해 에어드랍으로 뿌리는 경우에, 해당 NFT들이 오픈씨나 클레이튼의 경우엔 클레이튼 스코프에서 공개된다. 어쨋든 컨트랙트의 주소가 공개된다는 것이다.
이 컨트랙트 주소를 한 번 까보자.
메인넷에서 NFT라고 검색해서 무작위로 발행갯수가 꽤 많은 NFT 컬렉션 하나를 조회했다.
Inventory 탭으로 들어가면, 모든 NFT들의 TokenID와 홀더의 지갑주소, 그리고 TokenURI를 볼 수 있다.
이 TokenURI가 중요한데, TokenURI의 목록을 잘 보면, 주소가 모두 하나로 통일되어 있다. 이걸 copy를 눌러서 복사해보자.
https://버킷이름.s3.ap-northeast-2.amazonaws.com/폴더이름/241.json
이렇게 241.json을 제외하고는, 앞의 주소가 모두 동일하다.
이 주소로 들어가보면,
해당 NFT의 메타데이터가 쭉 나온다. 주목해야 할 것은 가장 오른쪽의 attribute. level이 1이라고 뜬다.
잠깐만 짱구를 굴려보면, 이런 추론이 가능하다.
“저거 숫자만 바꿔서 주소창에 입력하면 같은 컬렉션의 다른 NFT들의 메타데이터도 알 수 있겠는데?”
실제로 번호를 바꾸면 다른 NFT들의 메타데이터도 쭉 보는게 가능하다.
그러면, 이렇게 가정해보자.
현재까지 241개의 NFT가 발행되어 있는데, 프로젝트의 민팅은 계속 되고 있고, 번호를 쭉 바꿔가면서 조회를 해보니까 265번째 NFT는 level이 10인 레전더리 등급이다?
사람의 심리는 당연하게도 민팅 사이트에서 264번째 NFT가 민팅될 때까지 기다렸다가, 곧바로 민팅 버튼을 눌러서 레전더리 등급의 NFT를 받고 싶을 것이다.
이게 NFT 스나이핑의 방법이다.
물론 지금 말한 방법처럼 사람의 손으로 일일이 다 주소를 검색해서 메타데이터를 눈으로 보고 추론하는 방법도 있지만,
이걸 코딩으로 하면 1만개의 데이터를 추출하는 것도 껌이다.
실제 방법은 여기에 적진 않겠지만, 궁금하면 axios로 aws s3에 올라가있는 NFT의 데이터들을 get하는 과정을 루프로 돌리면 된다. 필연적으로 opensea의 공개를 위해 s3의 버킷은 퍼블릭으로 설정되는게 기본이니 읽어오는 것은 누구나 할 수 있다.
이렇다보니 NFT 스나이핑이 웬만한 프로젝트에서는 판을 친다.
실제로 얼마 전에 실험을 위해 특정 NFT 민팅 프로젝트의 레어리티를 모두 검사해 레전더리 등급의 번호를 미리 파악하고, 트랜잭션이 몰리는 구간을 지켜보니,
레전더리 등급의 번호가 뜨는 지점에서 트랜잭션이 동시다발적으로 몰리는 현상이 분명하게 있었다.
그러니까 지금까지 이 현상이 국내 NFT 꾼들에게는 암암리에 돌아다니는 사실이었고, 그걸 NFT 개발 전문가가 없는 프로젝트들은 이런 사실이 있다는 것 조차 모른 채로 민팅 프로젝트가 성공리에 마무리되었다고 자축하고 있었던 것이다.
실제로 이런 현상이 나타나면, 해당 프로젝트의 Hype이 크게 높거나, 미래 가치게 기대되는 경우가 아니라면 NFT 스나이핑 직후에 레어리티가 높은 NFT들을 덤핑해버린다. 결국 바닥가는 더 바닥을 치게 되고, 프로젝트에는 악영향을 미치며, NFT 프로젝트를 믿고 들어왔던 홀더들은 레어리티가 높은 NFT를 먹을 기회도 박탈당한 것도 모자라 프로젝트 자체가 망가지는 것을 지켜보고 있을 수밖에 없다.
해결방안
해결방안은 두 가지로 나뉜다.
- NFT를 발행할 스마트 컨트랙트 내, 혹은 메타데이터를 만들 때 발행될 번호를 랜덤하게 섞는다.
- tokenURI를 해시값으로 변환하여 업로드한다.
물론 Reveal의 방식도 있겠지만, 그건 해결이라기보단 차선책에 가깝기 때문에 논의할 여지가 별로 없다.
1번의 방법은 또 세부적으로 여러 방법이 있다.
- 0.json의 데이터에 145.json의 데이터를 입력하고 서로 데이터를 바꾼다.라는 식으로 모든 nft의 메타데이터와 이미지의 파일번호만 바꿔줘도 랜덤한 민팅이 된다.
- 스마트 컨트랙트 내에서 랜덤한 난수를 발생시켜서 그 번호로 민팅을 시켜줄 수 있다. 이 경우에 Counter와 uint를 모두 사용해서 tokenID를 안정적으로 빈틈 없이 메꿔줘야 한다.(이 방법은 설명하면 길어지니 나중에 다뤄보겠다.)
- 스마트 컨트랙트는 받아온 번호만 민팅해주고, 프론트에서 난수를 발생시켜서 컨트랙트에 올리는 방법도 있다.
2번의 방법도 의외로 단순하다.
- ipfs를 폴더를 사용하지 않고 올리면 자동으로 URI가 해시값만 존재하게 된다. 그러니 관리가 좀 짜치더라도 폴더기능은 사용하지 않기를 권한다.
- aws s3를 사용하는 경우에, 마지막 파일명을 0.json이 아니라 특정 해시값.json으로 대치하고, 해당 해시값이 0.json을 가리키고 있다는 것을 따로 리스트로 만들어서 저장해둔다.
요새 하도 NFT 컨트랙트를 쉽게 만들 수 있도록 강좌가 많다보니 아무 생각없이 접근해서 NFT를 만들어 파는 프로젝트도 많아졌다. 최소한 이런 문제 정도는 방법도 (물론 개발자를 하나 구했다는 가정 하에)쉬우니 대처방안을 마련하는 것이 좋겠다.
그리고 이런 NFT 스나이핑을 자기 혼자 알아내고 좋다고 써먹기만하고 그게 다른 홀더들이나 발행사에 손해를 끼치는 것임을 인지하지도 못하는 중생들은 반성을 좀 해야겠다.