안녕하세요!^^
오늘은 BNB Challengers 강의 6일차, 실습가 계속되고있습니다!
NFT 종류중 하나인 PFP NFT에 대하여 실습해보는 수업이었습니다!
h662 선생님이 멋진 강의를 진행해주셨습니다!!^^
강의 내용을 이해하며 정리해보았습니다!
NFT 프로젝트 기획 시 주의사항!
1. 개발보다는 기획이다!!
- 복잡한 토크노믹스보다는 쉽고 간결하게1!
2. 커뮤니티가 중요하다!!!
- h가 포함된 CryptoPhunks의 등장!! > 오픈씨에서는 폐쇄당했지만,, 중앙화에서 관리되는게 맞을까?
- NFT 프로젝트는 커뮤니티 파워가 있어야 지속가능한 프로젝트가 될 수 있다!!
"Ownable" 알아보기!!
> 민팅은??? Owner만 하게해야해!! 이때 사용되는 패키지!!
> Openzeppelin에서 제공하는 기능!! : Airdrop을 구현할 수 있다!
- https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable
> 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'));
}
}
-> 똑같이 디플로이
Ownable을 통하 반영된 함수의 기능들!!!
ㅁ renounceOwnership : 탈중앙화에 맞게 나의 ownership도 없엔다!
- 즉!! 이후로는 수정이 불가능하게 됨으로 조심해야해!!
ㅁ transferForm : ownership을 넘긴다!!
"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 후에는 이미지가 확정되어서 보이는 것을 알 수 있다!!!
감사합니다!^^
'블록체인 > 블록체인' 카테고리의 다른 글
[BNB Challengers 8일차] Dapp 알아보기! - localhost로 Dapp 오픈!! (0) | 2022.11.26 |
---|---|
[BNB Challengers 7일차] NFT 프로젝트의 발전!! - whitelist 등록 및 수수료 받기! (0) | 2022.11.24 |
[BNB Challengers 5일차] 다양한 NFT 프로젝트들!! (0) | 2022.11.18 |
[BNB Challengers 5일차] PFP NFT + Opensea에서 확인하기! (0) | 2022.11.17 |
SBT(SoulBound Token)란 무엇일까? (feat. 판매불가능한 NFT) (0) | 2022.11.12 |
댓글