블록체인, NFT, 이더리움 개발자 모임의 커뮤니티: https://coinhigh.xyz
코인하이 - NFT 커뮤니티, 블록체인 개발자, 비트코인, 이더리움
Coin High는 NFT와 블록체인 생태계의 핵심 개발자들과 함께 특화된 커뮤니티입니다. NFT 프로젝트, 비트코인, 이더리움, 암호화폐
coinhigh.xyz
NFT 제작의뢰: https://kmong.com/gig/520626
이더리움, 폴리곤 NFT 프로젝트에 필요한 모든 개발 - 크몽
oRES 전문가의 IT·프로그래밍 서비스를 만나보세요. 현대는 아이디어가 모든 것을 결정짓는 시대입니다. 특히 블록체인 시장에서는 좋은 아이디어만...
kmong.com
보통 Reveal을 하는 목적은 NFT의 레어리티를 감추기 위해서이다.
구매자는 같은 가격에 mint를 해도 각 NFT의 고유성은 다르기 때문에 뽑기를 하는 심리를 가지고 있으며 유니크한 NFT를 가지기를 원한다. 만약 reveal을 하지 않으면 IPFS 주소로 이미지 파일을 먼저 열어봐서 몇번째에 레어리티 이미지가 있는지 기다린 다음 발행을 할 수도 있기 때문이다. 이렇게 여러 가지 이유로 reveal을 하여 본 이미지를 감추곤(reveal 이미지만 그리고 본 nft의 이미지는 안그려논 경우도 있음 = scam) 한다.
그래서 reveal이 필요없이 다른 방법을 선택하는건 어떨까 해서 NFT가 #1(token id) 부터 발행 되는것이 아닌 #n부터 발행되게 랜덤으로 만드는 코드를 테스트 하려고한다. 물론 레어리티가 몇개 남아 있는지는 체크 가능할것이다.
기본적으로 NFT 스마트 컨트랙트 코드를 작성하고 추가로
1. token id를 랜덤으로 만들어줄 함수
2. token id를 비교하여 중복되지 않게 NFT를 전송하는 함수
이 2가지를 추가해야한다.
먼저, generateRandomTokenId 함수에서 타임스탬프와 이전 블록 해시를 사용하려고 한다. 이유는 랜덤한 토큰 ID를 생성하기 위해 랜덤을 활용하기 위함이다.
타임스탬프: block.timestamp를 사용하여 현재 블록의 시간 정보를 가져온다.
이전 블록 해시: blockhash(block.number - 1)을 사용하여 이전 블록의 해시 값을 가져옵니다. 이는 블록체인 해시를 활용하여 예측 불가능한 값을 생성하기 위한 방법 중 하나이다.
따라서 타임스탬프와 이전 블록 해시를 조합하여 랜덤 값을 생성하면, 토큰 ID를 랜덤으로 설정할 수 있다. 굳이 이렇게 안해도 되긴 하다.


TransForOwner 함수 내에서 generateRandomTokenId 함수를 사용하여 랜덤한 토큰 ID를 생성한다. 생성된 토큰 ID가 이미 존재하는지 확인하고, 이미 존재하는 경우 다시 랜덤한 토큰 ID를 생성. 그리고 생성된 토큰 ID와 호출한 주소를 사용하여 _mint 함수를 호출하여 토큰을 발행하고, 해당 토큰 ID를 _tokenExists 매핑에 기록한다. 마지막으로 _mintedCount를 증가시킨다.
이렇게 코드를 작성하고 테스트 진행

첫번째 발행한 NFT가 #1이 아닌 #16으로 왔으며 랜덤으로 NFT가 보내졌으니 테스트 성공!
근데 동시에 여러개의 NFT를 전송하기에는 힘들것 같다. 2개 이상 nft의 token id를 랜덤으로 구하려면 블록안에서 처리가 많이 늦어지고 gas fee가 많이 들것같다.
그래서 해결책으로는 매핑을 사용하여 모든 token id를 미리 생성하고 사용 가능한 token id 중 랜덤으로 선택하는것도 괜찮을것 같다.
'블록체인 > ─NFT(ERC-721)' 카테고리의 다른 글
| ERC-721 업데이트 // OpenZeppelin Contracts (last updated v5.0.0) (1) | 2023.12.23 |
|---|---|
| 토큰 ID 랜덤으로 Reveal 필요 없이 NFT 발행 (2) 마무리 (1) | 2023.12.03 |
| JPEG 마이닝 NFT(Buterin Card) (1) | 2023.12.02 |
| 위믹스(WEMIX)체인으로 NFT 만들기 (3) 마무리 (1) | 2023.12.02 |
| 위믹스(WEMIX)체인으로 NFT 만들기 (2) (1) | 2023.12.02 |