Truffle 를 이용한 NFT(ERC-721) 개발 및 배포하기

JangJooCool·2022년 2월 7일
1

블록체인 개발

목록 보기
1/2
post-thumbnail

개요

강의를 통해 ERC-721 개발 연습을 해보았지만
이번에는 직접 IPFS에 이미지와 메타데이터 파일을 업로드하여 진행해보았다.
테스트넷이긴 하지만 진정한 의미로 생애 첫 NFT를 만들었다고 할 수 있다.
로컬 환경에서 개발하고 truffle을 이용하여 ropsten 테스트넷에 배포하였다.
그럼 생애 첫 NFT 개봉박두!!

1. 개발환경 구축

1-1. 프로젝트 생성

먼저 개발환경을 구축해야 하는데 터미널을 열고 작업을 시작한다.
개발할 폴더를 만든 후 해당 폴더에서 아래 명령어를 입력한다.

truffle init
npm init

명령어 실행 뒤 VScode로 열어보면 위와 같이 패키징되어 있다.
'truffle-config.js' 를 열어 truffle 환경설정을 먼저 해주자!

1-2. truffle-config.js 환경설정

js 파일을 열어보면 상단에 설명이 주석으로 적혀 있고 코드들이 주석처리 되어 있는데,
설명을 읽어보면 필요한 부분에 대해 주석을 제거해서 알맞게 사용하면 된다고 한다.

테스트넷에 배포하기 위해서는 wallet Provider 와 니모닉이 필요한데
설명 주석 아래에 있는 코드를 주석 해제하면 된다.
hdwallet-provider를 사용하기 위해서는 터미널에 아래 명령어를 실행해줘야 한다.

npm install @truffle/hdwallet-provider

코드를 보면 .secrit 파일에서 니모닉을 문자열로 읽어오는 것을 알 수 있다.
.secret 파일을 생성하고 사용할 지갑의 시드구문을 적어둔다.
(코드를 GitHub에 올릴 때는 시드구문이 노출되지 않도록 주의!)

다음으로 네트워크 설정을 해줘야 하는데 ropsten 테스트넷을 사용할거니까 ropsten 부분을 주석해제하고 'YOUR-PROJECT-ID'라고 적힌 부분에 본인 infura 계정의 PROJECT-ID 를 넣어준다.
infura PROJECT-ID 는 아래 링크로 회원가입 후에 프로젝트 설정에서 확인할 수 있다.

https://infura.io/register

이제 마지막 설정으로 컴파일러를 개발하려는 환경에 맞추어 설정하면 된다.
본인은 Solidity 버전은 "0.8.7", Compiler의 버전은 "london"으로 설정했다.

2. Contract 코드 작성

레퍼런스 코드 링크

위의 링크에서 STEP-10 레퍼런스 코드를 참조하여 코드를 작성하면 되는데
CLI 환경에서의 편의를 위해서 조금 수정할 부분이 있다.

먼저 수정하기에 앞서 해당 코드에서는 OpenZeppelin의 파일을 참조하고 있기 때문에
아래 명령어를 실행하여 openzeppelin을 설치해준다.

npm install @openzeppelin/contracts

코드에서 수정할 부분은 mintNFT 함수인데 우선 첫번째 파라미터 recipient를 지우고
해당 파라미터를 사용한 부분을 msg.sender로 변경해준다.

function mintNFT(string memory tokenURI)
        public onlyOwner
        returns (uint256)
    {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(msg.sender, newItemId);
        _setTokenURI(newItemId, tokenURI);
        return newItemId;
    }

이렇게 변경하면 오너의 지갑 주소에서만 함수 mintNFT 가 실행되어,
항상 오너의 지갑 주소로 새로운 NFT가 발행된다.

마지막으로 작성한 코드를 배포하기 위해서 '1_initial_migration.js' 를 열어
작성한 컨트랙트를 지정해주고 배포하는 부분에 추가해주면 코드 작성은 끝난다.

3. 배포

이제 테스트넷에 배포를 위해서 명령어를 날려보자!

truffle migrate --compile-all --network ropsten

명령어를 실행하고 아래와 같이 결과가 나오면 성공~

하지만 아직 끝이 아니다.. 아래 명령어로 truffle console 진입하여
인스턴스를 받아와 배포한 컨트랙트가 작성한 코드와 일치하는지 확인한다.
그리고 진짜 마지막으로 미리 만들어 두었던 메타데이터가 담긴 json 파일 링크를 넣어서 입력하면 끝!!

sudo truffle console --network ropsten
instance = await MyNFTs.deployed()
instance.name()
-> 'MyNFTs'
instance.symbol()
-> 'MNFT'
instance.mintNFT("{json 파일 링크}")

성공적으로 배포가 끝났으면 트랜잭션을 이더스캔에 찍어보자

이더스캔 링크

이더스캔에서 검색해보면 정상적으로 배포가 된 것을 알 수 있고
input data에 메타데이터 json 파일 링크가 넘어간 것을 확인할 수 있다.

해당 링크로 들어가보면 위와 같이 메타데이터가 나오고
image에 있는 링크로 들어가 보면 생애 첫 NFT 이미지를 확인할 수 있다.

IPFS 이미지 링크

감자 까꿍!

이렇게 생애 첫 NFT 만들기 끝!!!

github 링크

회고

이전에 강의를 통해 연습할 때는 'ganache' 를 이용하여 컨트랙트를 배포했었는데,
이번에는 직접 ipfs에 이미지와 메타데이터를 업로드하고 ropsten 테스트넷에 배포를 해보는 것이 목적이었다.
비록 테스트넷에 기본적인 코드로 배포한 NFT이지만 이미지도 직접 만들어보고 나름 재미도 있었고 소기의 목적도 큰 어려움 없이 달성한 것 같다.

다만 메타데이터를 작성하는 것에 대한 표준이 있는데 거기에 맞게 해본다고 했지만
attribute 부분에서 기록의 개념으로 해당 사진을 실제로 찍은 날짜를 연/월/일/시/분/UTC 로 구분하여 작성하였는데 이렇게 해도 되는건지 정확히 모르겠다.
NFT에 대한 내용을 좀 더 공부해야할 것 같다.

0개의 댓글