안녕하세요!^^
오늘은 BNB Challengers 강의 5일차, 실습강의로
NFT 종류중 하나인 PFP NFT에 대하여 실습해보는 수업이었습니다!
h662 선생님이 멋진 강의를 진행해주셨습니다!!^^
강의 내용을 이해하며 정리해보았습니다!
NFT의 종류!!메타데이터란??
1. Art NFT : 그림을 NFT로 올려 저작권을 인정받는다!
2. PFP NFT : 오늘의 수업주제!!! > Profile Photo NFT
> 조상님격!! CryptoPunks : 단순한 NFT + 메타데이터 포함(Rarity)
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
npm도 깔고 복잡한 작업을 해야한다!...
결국은 아래와 같이 레이어 별 사진을 만들고 다양한 이미지를 만들어주는작업!!
할일 리스트!! (너무 어려워서.. 간단히)
> config.js 수정하기
> package.json
> build 명령 바꾸기
> 이후 폴더를 보면 이미지들이 많이 생긴다
> 이미지올리고
> 이미지 URI올리고
> 메타데이터 올리고
> 메타데이타 URI 올리고!
ㅁ 챕터2 : 메타데이터를 기반으로 Solidity에서 Batch Mint 하기!!
지난번에는 1개의 이미지만 민팅했기에 바로바로 했었습니다!!
하지만!!, 이번에는 폴더 내의 번호를 모두 민팅하는 방법으로 바뀐다!!
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 들을 확인할수 있습니다!!^^*
감사합니다
'블록체인 > 블록체인' 카테고리의 다른 글
[BNB Challengers 6일차] NFT 프로젝트의 발전!! - Owner만 minting 할 수 있게, NFT 전격공개 기능!! (1) | 2022.11.19 |
---|---|
[BNB Challengers 5일차] 다양한 NFT 프로젝트들!! (0) | 2022.11.18 |
SBT(SoulBound Token)란 무엇일까? (feat. 판매불가능한 NFT) (0) | 2022.11.12 |
[BNB Challengers 4일차] Smart Contract에 이미지를 포함하여 NFT 민팅 + Opensea에서 확인하기! (0) | 2022.11.12 |
간단한 스마트컨트랙트 실습!! (0) | 2022.11.11 |
댓글