본문 바로가기
블록체인/블록체인

[BNB Challengers 5일차] PFP NFT + Opensea에서 확인하기!

by 일등박사 2022. 11. 17.

안녕하세요!^^
오늘은 BNB Challengers 강의 5일차, 실습강의로
NFT 종류중 하나인 PFP NFT에 대하여 실습해보는  수업이었습니다!

h662 선생님이 멋진 강의를 진행해주셨습니다!!^^
강의 내용을 이해하며 정리해보았습니다!


NFT의 종류!!메타데이터란??

1. Art NFT : 그림을 NFT로 올려 저작권을 인정받는다!

785억원짜리!!

 

2. PFP NFT :  오늘의 수업주제!!!  > Profile Photo NFT

   > 조상님격!! CryptoPunks : 단순한 NFT + 메타데이터 포함(Rarity)

크립토펑크는 이후 BAYC로도 진화

3. "X"2E NFT (P2E, M2E 등등등) : NFT가 있으면 보상을 준다

    > Step To Earn, Move To Earn 등등 Tokenomics를 만들어야한다!!

 


오늘의 수업은 PFP NFT를 만들어보자!!


ㅁ 챕터1 : Hashlips를 활용하여 다양한 이미지 + 메타데이터 만들기

Hashlips 란!?

 

github에 있는 hashlips_art_engine을 다운받자!!

https://github.com/HashLips/hashlips_art_engine

 

GitHub - HashLips/hashlips_art_engine: HashLips Art Engine is a tool used to create multiple different instances of artworks bas

HashLips Art Engine is a tool used to create multiple different instances of artworks based on provided layers. - GitHub - HashLips/hashlips_art_engine: HashLips Art Engine is a tool used to create...

github.com

 npm도 깔고 복잡한 작업을 해야한다!...

결국은 아래와 같이 레이어 별 사진을 만들고 다양한 이미지를 만들어주는작업!!

할일 리스트!! (너무 어려워서.. 간단히)

> config.js 수정하기

> package.json

> build 명령 바꾸기

> 이후 폴더를 보면 이미지들이 많이 생긴다

> 이미지올리고

> 이미지 URI올리고

> 메타데이터 올리고

> 메타데이타 URI 올리고!

 


ㅁ 챕터2 : 메타데이터를 기반으로 Solidity에서 Batch Mint 하기!!

 

지난번에는 1개의 이미지만 민팅했기에 바로바로 했었습니다!!

2022.11.12 - [일등박사의 생각/블록체인] - [BNB Challengers 4일차] Smart Contract에 이미지를 포함하여 NFT 민팅 + Opensea에서 확인하기!

 

[BNB Challengers 4일차] Smart Contract에 이미지를 포함하여 NFT 민팅 + Opensea에서 확인하기!

안녕하세요!^^ 오늘은 BNB Challengers 강의 4일차, 실습강의로 NFT 메타데이터를 입력해서 실제 이미지를 민팅해보는 수업이었습니다! 지난 강의에서 배웠던 Smart Contract 코드에 5줄 정도만 더 추가된

drfirst.tistory.com

하지만!!, 이번에는 폴더 내의 번호를 모두 민팅하는 방법으로 바뀐다!!

 

1. Solidity 코드 바꾸기!!!

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

contract MintNFT is ERC721Enumerable {
    mapping(uint => string) public metadataURIs;

    constructor () ERC721("DrfirstOfficialProject","DoF") {}
    
    function mintNFT() public {
        uint tokenId = totalSupply() + 1;
        _mint(msg.sender, tokenId);
    }

    function setTokenURI(uint _tokenID, string memory _metadataURI) public {
        metadataURIs[_tokenID] = _metadataURI;
    }

    function tokenURI(uint _tokenId) public override view returns(string memory) {
        return metadataURIs[_tokenId];
    }

}

코드들이 아래와 같이 바꾼다!

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";  // 여기 추가 string 추가! (0)

contract MintNFT is ERC721Enumerable {
    // mapping(uint => string) public metadataURIs;
    string public metadataURI;  // 여기 추가 (1)
    uint constant public TOTAL_NFT = 100;  // 여기도 추가. Total NFT 개수 넣기
    
    constructor (string memory _metadataURI ) ERC721("Drfirst_PFP","PFP") {  // 여기 추가  (2)
        metadataURI = _metadataURI;                                                     // 여기 추가  (2)
    }

    function mintNFT() public {                                                        //  여기추가   (5)            
        require(TOTAL_NFT > totalSupply(), "No more mint,");                           //  여기추가   (5) 
        uint tokenId = totalSupply() +1;                                               //  여기추가   (5) 
        _mint(msg.sender, tokenId);                                                    //  여기추가   (5) 
    }

    // function mintNFT() public {
    //     uint tokenId = totalSupply() + 1;
    //     _mint(msg.sender, tokenId);
    // }
    function batchMint(uint _amount) public {                                                      //  여기추가   (6) 
        for(uint i =0; i < _amount; i++){                                                //  여기추가   (6)
            mintNFT();                                                                 //  여기추가   (6)
        }                                                                              //  여기추가   (6)
    }



    // function setTokenURI(uint _tokenID, string memory _metadataURI) public {
    //     metadataURIs[_tokenID] = _metadataURI;
    // }

    function tokenURI(uint _tokenId) public override view returns(string memory) {
        // return metadataURIs[_tokenId];
        return string(abi.encodePacked(metadataURI,'/',Strings.toString(_tokenId), 'json')); // 여기 추가  (3)
    }  

    

}

바뀐 내용들을 해석해보면 각 번호별 의미가 아래와 같다

0. Zeplin에서 string 관련 패키지(string.sol)을 import 하고!

   (https://docs.openzeppelin.com/contracts/4.x/api/utils#Strings)

1. 2.기존에 string으로 url입력받덛것을 metadataURI라는 변수로 추가하고

3. tokenURI를 >> metadataURI + '/' + _tokenId +  'json' 로 넣어준다!!

4. Total NFT 값을 정해주기

5. NFT 총량까지 NFT 민팅하는 함수

6. Bacth로 한번에 NFT 민팅하는 함수

 

로해서 각 폴더의 NFT를 모두 메다데이터의 URI를 연결해서 민팅한다는점!!

 

그렇게한 뒤!!

 

1. Deploy 시에 내 ipfs의 meta URI를 입력해서 Deploy 해주고!!

 

2. batchMint에 NFT 개수 값을 입력해주면!!!!

짠!! 내 지갑에 batchMint 끝!!!

이제 Opensea Testnet에 가면!!

짠!! 나의 PFP 들을 확인할수 있습니다!!^^*

 

감사합니다

 

댓글