블록체인

[NFT] 이더리움 기반 NTF 토큰 개발 환경 구축 및 테스트

밍글링글링 2022. 11. 11.
728x90

VS CODE는 설치되어 있다는 가정하에... 

시작하기에 앞서, solidity 언어로 스마트 컨트랙트를 만들게되는데... 

유용하게 사용할 수 있는 확장프로그램을 다운로드 받는다.

 

solidity

 

Solidity Contract Flattener

 

Solidity Extended

 

개념보다는 사용법 위주로 풀어나갈 것인데, Git 소스 안에는 소스 중간 중간 개념 설명이 주석으로 되어있으니 참고해도 된다. Git 주소는 맨 아래에 있다.

 

우선, 터미널 창에 글로벌 속성을 주어 *truffle framework를 설치해줍니다.

 

트러플 프레임워크란 Sodity 언어로 이루어져 있는 스마트 컨트랙트 소스를 로컬 환경에서 컴파일 배포를 가능하게 해주는 프레임워크.
# 트러플 설치
npm i -g truffle

 

truffle framework 가 전역에 설치 됬을 것입니다.

이 후, 아래의 코드를 터미널에 입력하여 truffle 프로젝트를 생성합니다.

# 트러플 프로젝트 생성
truffle init

 

디렉토리 및 파일 구조

 

위에서 부터 디렉토리 및 파일을 하나씩 살펴보자면, 

contracts 디렉토리 안에 스마트 컨트랙트 소스들을 담는다.

migrations 디렉토리는 배포를 위해 담는 파일들을 보관한다.

migrations 디렉토리의 특이사항으로는 앞에 붙는 숫자에 따라 순차적으로 배포시 실행된다.

truffle-config.js는 트러플 설정파일이다. 개발을 위한 호스트, 네트워크 설정을 할 수 있게 해준다.

 

하나씩, truffle 명령어를 사용해보자.

# 트러플 컴파일
truffle compile

 

컴파일 관련하여 오류 및 성공을 리턴해준다.

컴파일을 정상적으로 이루어지게 된다면,

build 디렉토리와 build 디렉토리 안에 스마트 컨트랙트 코드가 담겨진 Migrations.json 파일이 생성되게 된다.

contracts 디렉토리 안에 있는 solidity 파일들과 1:1로 build 디렉토리 안에 json 파일이 생성된다.

스마트 컨트랙트를 간단하고 빠르게 개발을 위해 오픈제플린을 이용할 것이다.

 

▼ 오픈제플린 참고 URL

http://wiki.hash.kr/index.php/%EC%98%A4%ED%94%88%EC%A0%9C%ED%94%8C%EB%A6%B0

 

오픈제플린 - 해시넷

오픈제플린(OpenZeppelin) 오픈제플린(OpenZeppelin) 오픈제플린(OpenZeppelin)은 2015년 데미안 브리너(Demian Brener)와 마누엘 아라오스(Manuel Araoz)가 공동설립한 블록체인 및 소프트웨어 개발 회사이다. 이 회

wiki.hash.kr

 

# 오픈제플린 모듈 설치
npm i @openzeppelin/contracts

 

위 코드를 설치하게 되면, node_modules 디렉토리와 package.json 파일이 생성된다.

이더리움 같은 경우 ERC 타입 ERC20, ERC721, ERC777, ERC1155 등등 있다.

ERC20은 일반적인 거래소에 올려져 있는 코인이라고 보면 되고,

ERC721이 NFT 토큰 타입이기에,

오픈제플린에서 제공해주는 ERC721을 이용할 것이다.

 

contracts 디렉토리 안 solidity 파일을 생성하였다.

임의로 코인명을 Mingty - 약어 MGT로 설정하였다.

 

/contracts/Mingty.sol
pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract Babkorea is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("Mingty", "MGT") {}

    function publishItem(address creator, string memory tokenURI) public returns (uint256) {
        _tokenIds.increment(); // 1

        uint256 newTokenId = _tokenIds.current(); //: 현재 Count 값

        _mint(creator, newTokenId);
        _setTokenURI(newTokenId, tokenURI);

        return newTokenId;
    }
}

 

위와 같이 작성하고, 해당 솔리디티 파일을 배포하기 위한 파일을 하나 더 생성하여야한다,

.

/migrations/2_contract_migration.js 파일을 생성하였다.

 

/migrations/2_contract_migration.js 
const Mingty = artifacts.require("Mingty");

module.exports = function (deployer) {
    deployer.deploy(Mingty);
}

 

/test/Mingty.test.js
const Mingty = artifacts.require('Mingty');

contract("Mingty", async function(accounts) {
    const [owner] = accounts;

    beforeEach(async function() {
        this.token = await Mingty.new();
    })

    it("publish item", async function() {
        const tokenId = await this.token.publishItem(owner, "http://dev.sample.com/a/b/abc.jpg");

        console.log(tokenId);
    })
})

다양한 테스트케이스 방식 중 하나의 소스이다.

이 후, truffle test 명령어를 이용하여, 테스트 할 수 있다.

truffle test ./test/Mingty.test.js

 

테스트케이스를 실행하게 되면,

트랜잭션, 블럭, 가스 스테이터스 정보들이 터미널에 보여진다.

현재는 로컬에서 테스트하였지만, 테스트넷에서 API, SDK 등을 이용하여 배포하게되면, tokenId도 정보들이 같이 보여지게 될 것이다...

 

올려놓은 소스 참고 URL => https://github.com/rkdalsrbs0/public-mingty-nft

 

GitHub - rkdalsrbs0/public-mingty-nft

Contribute to rkdalsrbs0/public-mingty-nft development by creating an account on GitHub.

github.com

 

728x90

댓글