이번 시간에는 로컬 환경에서 이용이 가능한 Truffle을 활용하여
NFT를 개발하여 배포, 테스트 까지 해보는 시간을 가져봅시다!
필요한 것 / Prerequisite
- Nodejs
- Code Editor (Vscode)
- Infura.io API Key
- Metamask Wallet
- Basic understading of JS, Solidity
먼저 개발환경을 구축합시다! /Dependencies
터미널에서 폴더와 npm / truffle 패키지를 받아준 이후
mkdir nft
cd nft
truffle init
npm init
npm install @truffle/hdwallet-provider
npm install @openzeppelin/contracts
Mnemonic Phrase and Infura.io API Key 가져오기
그리고 니모닉 시드를 해당 네트워크에서 사용될 계정을 사용하기 위해
HDWalletProvider와 추후 컨트랙 배포 코드에서 쓰일 오픈 제플릿 패키지도 같이 받아준 이후
니모닉 시드를 5번째 줄 따옴표 안에 붙여넣어주고, (니모닉 시드 가져오는 법)
Infura.io의 API Key를 가져옵니다 (더보기 참고)
가입 후에 원하는 이름으로 프로젝트 생성 후
프로젝트 세팅에 가서 "꼭"! 롭스텐 네트워크로 설정 후 엔드포인트 가져와서 넣어주기
트러플 환경설정 / Set up truffle-config.js
자 이제 truffle-config.js 를 세팅할건데 사진에 설명한 것과 같이
각자 추가로 넣어줘야하는 것은 위에서 가져온 니모닉 시드와 Infura.io의 API Key다!
const HDWalletProvider = require("@truffle/hdwallet-provider");
// require("dotenv").config();
// const { PRIVATE_KEY } = process.env;
const mnemonicPhrase = "{니모닉 지갑 12자리 넣어주기}";
module.exports = {
// networks: {
// ganache: {
// host: "127.0.0.1",
// port: 8545,
// network_id: "*",
},
ropsten: {
provider: function () {
return new HDWalletProvider(mnemonicPhrase, "https://ropsten.infura.io/v3/{API Key}");
},
network_id: "3",
},
},
mocha: {},
compilers: {
solc: {
version: "0.8.7",
settings: {
evmVersion: "london",
},
},
},
};
<가려놓은 부분은 당장 굳이 필요하지 않다!>
그리고 Solidity 컴파일러의 버전을 최근 버젼인 런던 네트워크 버젼으로 맞춰주고
이번 시간엔 메인넷이 아닌 Ropsten Network 에서 테스트할 예정이어서
Rosten Nework로 맞춰줘야 한다.
자 이제 얼추 환경 세팅은 끝났고 이제 코드를 짜볼 시간! / Let's start to code our contract!
MyNFTs.sol / Contracts 폴더 안
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract MyNFTs is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() public ERC721("MyNFTs", "MNFT") {}
function mintNFT(string memory tokenURI) //address recipient 삭제
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId); //recipient를 msg.sender로 대체
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}
이 파트가 초반에 설치한 OpenZeppelin 라이브러리를 다운받는 이유이다.
NFT Tutorial Series 파트10 부분에서 조금 더 손쉽게 하기 위해
인수로 들어가는 주소를 없애고 _mint펑션 부분에 컨트랙을 실행하는 주소인
msg.sender로 대체하였다!
1_initial_migration.js / migration 폴더
const Migrations = artifacts.require("Migrations");
const MyNFTs = artifacts.require("MyNFTs.sol"); // MyNFTs.sol 파일 추가
module.exports = function (deployer) {
deployer.deploy(Migrations);
deployer.deploy(MyNFTs); // MyNFTs를 배포에 추가
};
이제 작성한 코드를 배포하기 위해
작성한 컨트랙트를 지정해주고 배포하는 부분에 추가해준다!
테스트넷 배포 / Deploy it on the internet World!
원래같으면 해당 터미널에서
// truffle migrate --compile-all --network ropsten
truffle migrate --network ropsten --skipDryRun
이 명령어로 했으면 됐는데 에러가 계속 떠서 구글링 결과
두번째 명령어로 입력하니 작동이 되더라.. 이미 배포를 했어서 그런가?
첫 NFT 주조 도전! / Mint your own NFT finally!
MacBookPro NFT % sudo truffle console --network ropsten // 터미널에서 테스트넷 진입
truffle(ropsten)> yourFirstNFT = await MyNFTs.deployed()
undefined
truffle(ropsten)> yourFirstNFT.name()
'MyNFTs'
truffle(ropsten)> yourFirstNFT.symbol()
'MNFT'
truffle(ropsten)> yourFirstNFT.mintNFT("ipfs://bafyreif6wz7r6gff2udfxtgmeotqklgnxan6af4nt5ajybunhbi7c6shkm/metadata.json")
터미널에 진입한 후 원하는 이름으로 컨트랙의 인스턴스를 받아와줍니다!
해당 토큰의 이름과 티커를 확인할 수 있고
마지막으로 인자로 받아오려 했던
(string memory) tokenUri 인 본인의 메타데이터가 담긴 json 링크를 넣어주면!
짜잔 🎶
이제 민팅한 NFT를 직접 민팅까지 해봤으니
민팅한 토큰을 직접 확인 해봐야겠쥬?
자, 이더스캔에서 해당 트랜잭션을 검색해주면! (Ropsten Network)
앞으로 내 많은 트랜잭션이 롭스텐 네트워크에 오랫동안 남아있을 예정이다...
이렇게 트랜잭션 안에 많은 정보가 담겨있습니다! 블록과 가스비 등등
주목할만한거라면 From 0x0000.. 에서 제 주소로 왔는데
이더리움이 아닌 다른 토큰 (우리의 경우 NFT)을 보냈으니 Value가 0이고
없는걸 새로 민팅한 것이라 블랙홀?주소 에서 오게 되는 것입니다!
반대로 소각할 때 저 주소에 보내곤 하죠.
참고로 제가 넣은 메타데이터는 제일 아래 Input Data에
ipfs://CID 형태로 들어가있는걸 확인할 수 있죠?
저 메타데이터 생성하는 법을 같이 올렸으면 더 좋았겠지만
내용이 너무 많아질 것 같아서 추후에 포스팅 예정입니다!
마무리
작업을 끝내는데에 있어 NFT라고 한다면 Non Fungible Token이라면
아무래도 사진 하나쯤은 들어가야지, 라는 생각에 ipfs와 메타데이터 를
스탠다드에 맞게 업로드하고 마무리하고싶은 생각에
시간도 오래걸렸지만 잘 마무리 했네. 진작에 포스팅좀 많이 햇으면
좋은 정보의 장이 되었을 거라 생각하는게 그 부분이 조금 아쉽다.
앞으로도 꾸준히 기록하는 습관을 가지는건 어떨까?
'BlockChain > Truffle' 카테고리의 다른 글
[Truffle] Given value "TxTypeLegacyTransaction" is not a valid hex string. 오류 날 시에 (0) | 2021.12.01 |
---|