본문 바로가기
블록체인/WEB3 개발

Local에서 ERC-721 개발해 Truffle 로 배포하기

by 제이제이_은재 2022. 7. 21.
반응형

💡Local 에서 ERC-721 개발하기

 

로컬에서 Truffle과 Ganache를 이용하여 NFT를 개발해보자. 먼저 새로운 폴더를 생성하고 Truffle을 이용한 개발환경을 준비하자. 

 

#폴더 생성
mkdir erc721
#폴더 진입
cd erc721
#truffle 초기화
truffle init
#npm 초기화
npn init

 

 

개발 환경 준비를 마쳤다면, VSCODE를 실행해보자. VScode에 나타나는 폴더와 파일의 구조는 다음과 같다.

 

 

먼저 몇 가지 세팅을 진행해보자.

 

truffle-config.js 를 열고 solc를 설정한다. solc는 solidity, compiler의 버전 등을 설정할 수 있다. 이 예시에서 사용하는 Solidity 의 버전은 0.8.7이고 Compiler 버전은 london 이다.

 

다음은 네트워크 설정을 편집해야 한다. Ganache를 통해 로컬 환경에서 테스트할 예정이므로, 먼저 Ganache를 등록한다. 다음과 같이 주석을 제거하고, development를 ganache로 변경한다.

 

 

이제 로컬 환경에서 Truffle과 Ganache를 이용해 개발하는 환경을 구축했다. 이제 MyNFTs.sol이라는 파일을 생성하고 아래 코드를 붙여 넣는다.

//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)
        public onlyOwner
        returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(msg.sender, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

 

이 파일은 OpenZeppelin의 파일을 참조하고 있기 때문에 만약 openzeppelin이 로컬 PC에 설치되지 않았다면 설치해주어야 한다. 

 

npm install @openzeppelin/contracts

 

붙여 넣은 코드가 정상적으로 배포되기 위해서는 migration 파일을 설정해줘야 한다. migration/ 폴더로 이동하녀 1_initial_migration.js 파일을 열고 아래와 같이 편집한다.

const Migrations = artifacts.require("Migrations");
const MyNFTs = artifacts.require("MyNFTs.sol"); // MyNFTs.sol 파일 추가

module.exports = function (deployer) {
    deployer.deploy(Migrations);
    deployer.deploy(MyNFTs); // MyNFTs를 배포에 추가
};

 

이걸로 ERC 721 을 이용한 개발은 끝이 났다. 이제 배포 콘텐츠를 통해 작성한 컨트랙트를 로컬에서 Truffle과 Ganache로 배포하면 된다. 

 

 

✓ Truffle로 ERC-721 배포하기

 

먼저, 새로운 터미널을 열고 ganache-cli를 실행한다.

# 새로운 터미널에서 ganache-cli 실행
ganache-cli

 

기존의 터미널에서 truffle로 배포한다. 이때, truffle-config.js 파일의 network에 설정한 ganache로 실행해야 한다.

 

truffle migrate --compile-all --network ganache

 

위 명령어를 통해 로컬의 ganache-cli와 연결하고 컨트랙트를 배포한다.

 

컨트랙트의 배포가 잘 이루어졌다면, Truffle console을 이용해 컨트랙트를 조작할 수 있다. 다음의 명령어를 터미널 프롬프트에 입력하고 truffle console에 진입한다.

 

truffle console --network ganache

 

Truffle console에 접속해서 배포한 컨트랙트의 인스턴스를 받아와 아래와 같이 확인해보자.

instance = await MyNFTs.deployed()
instance.name()
instance.symbol()

 

배포된 컨트랙트에 대한 확인을 마쳤으면, 작성한 함수가 잘 도착하는지 확인한다. 이 때 함수의 마지막 파라미터로 실행할 지갑 주소를 함께 전달해야한다. 이 지갑의 주소는 ganache-cli의 첫 번째 지갑 주소이다. Ganache를 이용해 컨트랙트를 배포할 때에는, default로 첫번째지갑의 주소에서 컨트랙트를 배포한다.

 

instance.mintNFT("https://urclass-images.s3.ap-northeast-2.amazonaws.com/beb/section4/unit4/test.json", { from: accounts[0] })

 

그 다음 발행된 NFT로부터 tokenURI를 확인해보면 아래와 같은 결과를 얻을 수 있다.

 

instance.tokenURI(1)

 

앞으로 다른 네트워크에 배포할 때에는 truffle-config.js 에 네트워크 정보를 추가하고 Truffle 명령어 중 옵션 --network와 함께 네트워크의 정보를 담고있는 키를 입력하면 된다.

반응형

댓글