Truffle을 이용한 ERC-721 개발

안창남·2021년 12월 13일

Truffle 를 이용한 ERC-721 개발 정리

[Truffle 이란?]
-> 이더리움 기반 디앱을 쉽게 개발할 수 있도록 도와주는 블록체인 프레임워크입니다. 스마트 컨트랙트(smart contract) 컴파일, 배포, 관리, 테스트까지 빠르고 쉽게 할 수 있습니다. 루비 온 레일스, 파이썬/장고 등과 같은 웹 애플리케이션 개발을 위한 프레임워크처럼, 트러플은 디앱(dapps) 개발에 가장 널리 사용되는 프레임워크 중 하나로서 블록체인에서 스마트 계약을 컴파일하고 배포하는 복잡성을 많이 추상화합니다.

즉, 트러플은 개발 환경, 테스트 프레임워크 및 자산 파이프 라인을 제공하여 이더리움 가상머신(EVM)을 사용하여 디앱을 개발하기 위해 만들어졌다고 보면 됩니다.

[ERC-721 이란?]
-> ERC-721은 이더리움 블록체인에서 대체 할 수 없거나 고유한 토큰을 작성하는 방법을 설명하는 무료 공개 표준입니다. 대부분의 토큰은 대체 할 수 있지만, ERC-721 토큰은 모두 대체할 수 없습니다. 2018년 6월 21일, ERC-721은 최종적으로 받아들여졌는데, 이는 이 일에 관심을 두는 사람들 사이에 상당한 지지가 있다는 것을 의미합니다. 지금까지 가장 성공적인 애플리케이션은 고양이를 교화하는 게임입니다. 고양이는 기본적으로 ERC-721 토큰으로 기록되었습니다.

<실습>

1. Local에서 ERC-721 개발하기

먼저, 새로운 폴더를 생성하고 Truffle을 이용한 개발 환경을 준비해보겠습니다.

(설치)

  • npm install -g truffle

폴더 생성

  • mkdir erc721

폴더 진입

  • cd erc721

truffle 초기화

  • truffle init

npm 초기화

  • npm init

  • 개발 환경 준비를 마쳤다면, VScode를 실행합니다.

    truffle-config.js 를 열고, solc를 설정합니다. solc 는 Solidity, Compiler의 버전 등을 설정합니다.
    이 예시에서 사용하는 Solidity의 버전은 "0.8.7"이고, Compiler의 버전은 "london"입니다.

compilers: {
solc: {
version: '0.8.7',
evmVersion: 'london',
},
},

다음은 네트워크 설정을 편집합니다. Ganache를 이용해 로컬 환경에서 테스트할 예정이므로, 먼저 Ganache를 등록해야합니다.

truffle-config.js 파일을 수정

networks: {
ganache: {
host: '127.0.0.1', // 로컬
port: 8545,
network_id: '*',
},
},

----------------------- 기본 세팅 끝 -----------------------

다음은 이전 콘텐츠에서 작성한 코드를 가져와 오너의 지갑 주소에서만 함수 mintNFT 를 실행할 수 있도록 만들어 볼겁니다.

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;
}**

}

  • 함수 mintNFT 에서 변경된 부분은 다음과 같습니다.

    파라미터 address recipient 삭제
    파라미터 address recipient 를 사용하는 _mint 함수 실행부에서, recipient 를 msg.sender 로 대체

이렇게 변경하면, 오너의 지갑 주소에서만 함수 mintNFT 를 실행할 수 있고, 새로운 NFT는 항상 오너의 지갑 주소로 발행됩니다.

이제 VScode로 넘어가서 contract/ 폴더 아래에 MyNFTs.sol 파일을 생성하여 편집한 코드를 붙여넣고, npm 을 통해 openzeppelin 을 설치해야합니다.

  • npm install @openzeppelin/contracts

붙여넣은 코드가 정상적으로 배포되기 위해서는, migration 파일을 설정해야하고, 그 다음
migration/ 폴더로 이동하여 1_initial_migration.js 파일을 열어야합니다. 그리고 다음과 같이 편집합니다.

const Migrarions = artifacts.require('Migrations');
const MyNFTs = artifacts.require('MyNFTs.sol');

Module.exports = function (deployer) {
deployer.deploy(Migrations);
deployer.deploy(MyNFTs);
};

이걸로 ERC721을 이용한 개발을 마쳤습니다.

2. Truffle에서 ERC-721 배포하기

1) 이제 다른 터미널 창을 하나 더 열어서 가나슈와 트러플을 사용하여 ERC-721 배포를 실습해 보겠습니다.
먼저, 새로운 터미널을 열고 ganache-cli 를 실행합니다.

  • ganache-cli

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

  • truffle migrate --compile-all --network ganache

위 명령어에서 --network 에 이어 나오는 ganache 는 truffle-config.js 에서 설정한 network 의 키입니다. 위 명령어를 통해 로컬의 ganache-cli 와 연결하고, 컨트랙트를 배포합니다.

  • truffle console --network ganache

Truffle console에서, 배포한 컨트랙트의 인스턴스를 받아오고 배포한 컨트랙트가, 작성한 코드와 일치하는지 확인해봅니다.

배포된 컨트랙트에 작성한 함수가 잘 동작하는것을 확인할 수 있었습니다.

그 다음 발행된 NFT로부터 tokenURI 를 확인하면 끝입니다.

  • instance.tokenURI(1)

개발회고

[1] 목적: 실습을 통해 ERC-721이 NFT라는 점에 대해 다시 한번 숙지 또한 Rimix에서 활용 해보았던 ERC-721을 Truffle을 통해 개발/배포 실습

[2] 느낀점: 한번 배포된 컨트랙트는 수정이 불가능하기 때문에 메인넷에 배포하기전 여러번 테스트 연습을 해보았고, 또한 블로깅을 처음 해보니 생소해서 어려웠지만, 배웠던 컨텐츠들을 다시한번 복습하여 나의 것으로 만드는데 최적화된 복습 방법이라고 생각이 들었습니다. 아직 함수부분이나 여러부분에 미흡하다보니 부족한점이 많지만 하나하나씩 배워가며 블로깅을 통해 복습하는 방법으로 학습량을 늘려갈 생각입니다.

profile
I like Blockchain with all one's heart and soul

0개의 댓글