Truffle을 이용한 ERC-721 개발

허정·2022년 4월 7일
0

블록체인

목록 보기
36/38

1. Local에서 ERC-721 개발

Local 환경에서 ERC-721 개발하는 과정을 살펴보겠습니다.

(1) 개발 환경 만들기

  • 명령어 truffle init을 통해 로컬 환경에서 truffle로 개발하기 위한 환경을 만들어줍니다.
  • 명령어 npm init을 통해 npm 초기화를 해줍니다.

(2) 민팅 함수 작성

  • Owner만이 mintNFT function을 사용할 수 있는 코드를 작성합니다.
  • OpenZeppelin 파일을 import 후 사용하기 위해, npm install @openzeppelin/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() 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;
    }
}

(3) 배포 파일 작성

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

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

2. Truffle로 배포하기

truffle-config.js 작성하는 과정을 살펴보겠습니다.

(1) .env 파일 작성

MNEMONIC 와 INFURA_ID를 사용하기 위해서 .env 파일을 작성합니다. .gitignore에 .env 파일을 추가합니다.

(2) ropsten 네트워크에 배포하기 위한 코드

ropsten: {
      provider: () =>
        new HDWalletProvider(
          process.env.MNEMONIC,
          `https://ropsten.infura.io/v3/${process.env.INFURA_ID}`
        ),
      network_id: 3, // ropsten's id
      gas: 4000000,
      confirmations: 2,
      timeoutBlocks: 200,
      skipDryRun: true,
    }

(3) 배포하기

  • 명령어 ganache-cli를 입력합니다
  • Ropsten 네트워크에 배포하기 위한 명령어를 입력합니다
truffle migrate --compile-all --network ropsten

(4) 배포 과정 gif

transaction hash를 복사하여, 이더스캔에서 확인해봅시다.

(5) verify and publish

명령어 npm install truffle-flattener를 입력하고, 명령어 npx truffle-flattener ./contracts/MyNFTs.sol > ./contracts/FlatMyNFTs.sol 를 입력하면 파일을 하나로 묶어주는 과정이 진행됩니다. 이렇게 생성된 FlatMyNFTs.sol 파일을 이용해서 verify and publish를 진행할 수 있습니다. 성공한 결과는 다음 이미지와 같습니다.

(6) 전체 코드

require("dotenv").config();
const HDWalletProvider = require("@truffle/hdwallet-provider");

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1", // Localhost (default: none)
      port: 8545, // Standard Ethereum port (default: none)
      network_id: "*", // Any network (default: none)
    },
    ropsten: {
      provider: () =>
        new HDWalletProvider(
          process.env.MNEMONIC,
          `https://ropsten.infura.io/v3/${process.env.INFURA_ID}`
        ),
      network_id: 3, // ropsten's id
      gas: 4000000,
      confirmations: 2,
      timeoutBlocks: 200,
      skipDryRun: true,
    },
  },

  // Configure your compilers
  compilers: {
    solc: {
      version: "0.8.7", // Fetch exact version from solc-bin (default: truffle's version)
      settings: {
        evmVersion: "london",
      },
    },
  },
};

3. 회고

  • 플랫폼을 활용한 NFT 등록은 해봤지만, 직접 코드를 작성하여 배포하고 민팅하는 과정을 통해 구체적인 process를 이해하는데 도움이 됐습니다.
  • 좀 더 다양한 기능을 구현하지 못한 것이 아쉽습니다.
  • 조건을 만족하면 NFT에 변화를 줄 수 있는 기능을 추가해보면 좋을 거 같습니다.

전체 코드는 다음 링크에서 확인할 수 있습니다.
https://github.com/vamprodo47/erc721-truffle

0개의 댓글