[Solidity] ERC-721 기반 NFT 만들기 (Truffle 사용, Rinkeby Testnet 배포)
Truffle / ERC-721 / Rinkeby / Infura / OpenZeppelin / pinata / OpenSea / 트러플
ERC-721 기반 NFT 만들기 (로컬 환경에서 Truffle 이용)
ERC-721 이란?
-
EIP-721 (Ethereum Improvement Proposal-721)
이더리움 개선 제안의 721번째 토론 에서 채택되었다 -
ERC-721은 Ethereum Request for Comment-721 의 약자
👉 ERC의 721번째 요청사항이다
- ERC는 이더리움 블록체인 네트워크에서 발행되는 토큰(token)의 표준
http://wavescats.github.io/blockchain/2022/05/26/bc39.html
👆 (ERC-721 정리 참고)
Rinkeby 테스트넷에 ERC-721 토큰 만들고 배포하기
-1. 메타마스크에 접속하고, Rinkeby 테스트 네트워크를 선택한다
-2. Rinkeby 테스트넷 에서 사용할 테스트용 ETH 를 받는다
https://rinkebyfaucet.com/
(👆 Rinkeby 테스트넷 이더리움 Faucet)
👉 24시간 마다 ‘0.1 ETH’ 씩 받을수 있다
-3. 로컬에서 truffle 개발 환경 설정을 한다
truffle init
👈 명령어를 입력하여 truffle 모듈 생성
-4. truffle ↔ Rinkeby 네트워크 연결 설정을 해준다
(truffle-config.js 설정)
truffle-config.js 설정
4-1. ‘Infura’를 사용하기 위해 @truffle/hdwallet-provider를 설치해준다.
npm install @truffle/hdwallet-provider
4-2. 메타마스크의 ‘니모닉코드’ 를 적는다
4-3. ‘Infura’ 에서 Rinkeby ‘ENDPOINTS’ 주소를 적는다
https://infura.io/ (👈 infura 사이트)
-5. ‘contracts’ 폴더 안에 MyNFTs.sol
파일을 생성해서 ‘ERC-721’ 코드를 입력한다
OpenZeppelin
‘ERC-721’ 코드를 사용하기위해 ‘OpenZeppelin’ 라이브러리를 설치한다
npm install @openzeppelin/contracts
-6. 작성한 코드를 배포하기 위한 ‘migration’ 코드를 작성한다
‘migrations’ 폴더 내의 생성되어있는
1_initial_migration.js
파일의 코드를 수정하여
MyNFTs.sol
코드를 배포할 수 있게 만든다
-7. 이제 코드 작성과 셋팅이 끝났으니 컴파일 & 배포를 한다
터미널을 열고 truffle을 통해 ‘rinkeby 테스트넷’ 에 컴파일 & 배포를 한다
truffle migrate --compile-all --network rinkeby
컴파일이나 배포 할때 에러가 발생한다면
👉 ‘build’ 폴더를 완전히 삭제해주고 다시 명령어 실행해보기
👆 메타마스크 주소를 rinkeby 테스트넷 ‘이더스캔’에 입력하면
truffle을 이용해 배포 완료된 컨트랙트를 확인 할 수 있다
truffle에서 NFT 발행하기
-1. 컨트랙트의 배포가 잘 이루어졌다면
Truffle console
을 이용해 컨트랙트를 조작할 수 있다
truffle console --network rinkeby
👈 명령어
instance = await MyNFTs.deployed()
👉 ‘MyNFTs’ 함수를 배포
instance.name()
👉 ‘MyNFTs’
instance.symbol()
👉 ‘MNFT’
-2. NFT 를 배포할 함수 mintNFT
를 입력하고 ‘tokenURI’ 주소와 ‘몇번째 계정’ 인지를 입력한다
instance.mintNFT("ipfs://tokenURI주소", { from: accounts[0] })
tokenURI 에는 NFT화 시킬 이미지가 저장되어있는 ‘주소’를 입력하면 된다
CID를 붙여넣는데 앞에ipfs://
를 꼭 써줘야한다 👆
💻 tokenURI 에 입력할 주소 적는법
2-1. IPFS 분산저장소인 pinata 사이트에 접속해서
https://www.pinata.cloud/ (👈 pinata 사이트)
2-2. NFT로 만들 이미지를 업로드 한다 👆
2-3. 업로드한 이미지의 CID를 복사해서 ‘json 파일’로 만들어야한다 👆
{
"attributes" : [ {
"trait_type" : "Breed",
"value" : "Maltipoo"
}, {
"trait_type" : "Eye color",
"value" : "Mocha"
} ],
"description" : "The world's most adorable and sensitive pup.",
"image" : "ipfs://이부분에 CID 를 복사해서 넣음",👈
"name" : "이름 지정하기" 👈
}
2-4. “image” 에 CID를 붙여넣는데 앞에 ipfs://
를 꼭 써줘야한다 👆
2-5. 그리고 작성한 json 파일 을 업로드 👆
-3. 발행된 NFT의 tokenURI 를 확인 해본다
instance.tokenURI(1)
👈 명령어
-4. ‘OpenSea 테스트넷’ 에 들어가서 메타마스크 지갑연결을 하고 보면
NFT가 정상적으로 발행된걸 확인 할 수 있다
https://testnets.opensea.io/ (👈 OpenSea 테스트넷 사이트)
-5. ‘OpenSea 테스트넷’ 에서 내가 발행한 NFT의 컨트랙트를 바로 확인할수도 있다
NFT를 발행한 트랜잭션 컨트랙트 주소
👆 (rinkeby 테스트넷에 NFT를 발행한 트랜잭션 컨트랙트 주소)
truffle 에서 ERC-721 기반 토큰을 만들기 위한 코드
ERC-721 기반 토큰을 만들기 위한 코드
👆 (코드가 길어서 링크 첨부)
개발 회고 💡
ERC-721 기반으로 NFT 만들기
겉으로만 알던 NFT에 대해 정말 자세히 배웠다
NFT 만드는 법을 배웠으니 디자인적인 것도 배워두면 좋겠다
Remix IDE 를 이용해서 배포할때는
UI가 눈에 직접 보이면서 작업하는거라
이해가 쉽고 조작하기도 수월했는데
truffle 을 이용해서 개발을 할때는
라이브러리 불러오기, npm 설치, 설치 중 에러 등
조금 번거로운부분이 많았다 💧
개발자들도 truffle이 불편해서
Remix IDE 같은 사이트가 개발되어진거겠지
참고 했던 사이트 🖥
- https://andresaaap.medium.com/how-to-deploy-a-smart-contract-on-a-public-test-network-rinkeby-using-infura-truffle-8e19253870c4
(truffle 에서 Rinkeby 테스트넷 연결하기)