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

[BNB Challengers 6일차] NFT 프로젝트의 발전!! - Owner만 minting 할 수 있게, NFT 전격공개 기능!!

by 일등박사 2022. 11. 19.

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

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


NFT 프로젝트 기획 시 주의사항!

1. 개발보다는 기획이다!!
  - 복잡한 토크노믹스보다는 쉽고 간결하게1!

 

2. 커뮤니티가 중요하다!!!
  -  h가 포함된 CryptoPhunks의 등장!! > 오픈씨에서는 폐쇄당했지만,, 중앙화에서 관리되는게 맞을까?

  - NFT 프로젝트는 커뮤니티 파워가 있어야 지속가능한 프로젝트가 될 수 있다!!

Crypto p"h"unks

"Ownable" 알아보기!!

> 민팅은??? Owner만 하게해야해!! 이때 사용되는 패키지!!

> Openzeppelin에서 제공하는 기능!! : Airdrop을 구현할 수 있다!
  - https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable

 

Access Control - OpenZeppelin Docs

This directory provides ways to restrict who can access the functions of a contract or when they can do it. AccessControl provides a general role based access control mechanism. Multiple hierarchical roles can be created and assigned each to multiple accou

docs.openzeppelin.com

 

> Solidity코드로 알아보기!!

  - 오늘은 ownable.sol을 불러오고 onlyowner 추가 등 간단하다~!

 - function 정의시에 onlyOwner라고 되면 주인만이 사용할 수 있는 함수가 된다!!

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

 import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
 import "@openzeppelin/contracts/utils/Strings.sol";
 import "@openzeppelin/contracts/access/Ownable.sol";  // 추가!!

 contract MintNFT is ERC721Enumerable, Ownable {        // 추가!!
    string public metadataURI;
    uint constant public TOTAL_NFT = 100;

    constructor(string memory _metadataURI) ERC721("BNB Chanllener", "BC") {
        metadataURI = _metadataURI;
    }

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

    function batchMint(uint _amount) public {
        for(uint i = 0; i < _amount; i++) {
            mintNFT();
        }
    }

    function tokenURI(uint _tokenId) public override view returns(string memory) {
        return string(abi.encodePacked(metadataURI, '/', Strings.toString(_tokenId), '.json'));
    }
 }

 

-> 똑같이 디플로이 

너는 주인이 아니야!!
다른 계정으로 mintNFT하면 동작하지 않는다!!
Deploy 한 계정으로 해야만 잘됨!!

Ownable을 통하 반영된 함수의 기능들!!!

ㅁ renounceOwnership : 탈중앙화에 맞게 나의 ownership도 없엔다!

  - 즉!! 이후로는 수정이 불가능하게 됨으로 조심해야해!!

ㅁ transferForm : ownership을 넘긴다!!

 

"Reveal"알아보기~!

> Reveal이란!?!! 전격 공개 기능!

reveal전과 후!! 복권 긁기의 느낌!!!

 

- reveal 전과 후의 Meta 데이터가 모두 필요하다!!

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

 import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
 import "@openzeppelin/contracts/utils/Strings.sol";
 import "@openzeppelin/contracts/access/Ownable.sol";  

 contract MintNFT is ERC721Enumerable, Ownable {       
    string public metadataURI;
    uint constant public TOTAL_NFT = 100;
    string public notRevealedURI;                           // reveal을 위하여!! - Reveal 되지 않았을때의 URI
    bool public isRevealed = false ;                        // reveal을 위하여!! - Reveal 되었는지 상태


    constructor(string memory _metadataURI, string memory _notRevealedURI) ERC721("BNB Chanllener", "BC") {   // reveal을 위하여!! - _notRevealedURI추가 
        metadataURI = _metadataURI;
        notRevealedURI = _notRevealedURI;    // reveal을 위하여!! - notRevealedURI 추가
    }


    function reveal() public onlyOwner {     // reveal을 위하여!! - reveal 함수 만들기, public 여서 밖에서도 가능, Owner만 가능
        isRevealed = true;                   // reveal을 위하여!! - isRevealed을 true로 바꿔줌!!
    }

    function mintNFT() public onlyOwner {             
        require(TOTAL_NFT > totalSupply(), "No more mint.");
        uint tokenId = totalSupply() + 1;
        _mint(msg.sender, tokenId);
    }

    function batchMint(uint _amount) public {
        for(uint i = 0; i < _amount; i++) {
            mintNFT();
        }
    }

    function tokenURI(uint _tokenId) public override view returns(string memory) {
        if(isRevealed == false) return notRevealedURI;  // reveal을 위하여!! - isRevealed가 false 면 notRevealedURI로 공개!!!
        return string(abi.encodePacked(metadataURI, '/', Strings.toString(_tokenId), '.json'));
    }
 }

 

-> 디플로이 할때 METADATA URI와 REVEALED URI 를 동시에 등록해줘야한다!!

> 참고 notrevealed URI의 메타데이타

{
  "name": "NotRevealed",
  "description": "What kind of lion will reveal out?",
  "image": "https://olbm.mypinata.cloud/ipfs/QmfPu9LBtoywXpByQcDzTeAHp48WT2aVT6Dyf4JWSAAq9j",
  "attributes": [
    {
      "trait_type": "Not Revealed",
      "value": "Not Revealed"
    }
  ]
}

그리고 배포하기!!!

잘 배포되었다!!

그럼!! 아래와 같이 물음표가 있는 NotRevealed 이미지가 나타난다!!

이제!! Reveal해볼까요!?

reveal!!

 

오픈씨에서 어김없이 새로고침해주기!!

짠!! 아래와 같이 reveal 후에는 이미지가 확정되어서 보이는 것을 알 수 있다!!!


감사합니다!^^

댓글