본문 바로가기

[BLOCKCHAIN]

Truffle을 이용한 ERC-721 개발

Truffle 이란?

트러플(Truffle)은 이더리움 기반 디앱(DApp)을 쉽게 개발할 수 있도록 도와주는 블록체인 프레임워크이다.

스마트 컨트랙트 컴파일, 배포, 관리, 테스트까지 쉽게 할 수 있다.

 

ERC-721 이란?

ERC-721 (Ethereum Request for Comment721)은 NFT의 표준안이다. NFT는 대체불가토큰(Non Fungible Token)의 약자로 대체 불가능한 토큰이라는 의미이다. 따라서 ERC-721로 발행되는 토큰은 대체 불가능하며 모두 제 각각의 가치(Value)를 가지고 있다.

 

0.개발 환경 구축

로컬에서 NFT를 개발하기 위해선 Truffle과 Ganache를 사용먼저, 새로운 폴더를 생성하고 Truffle을 이용한 개발 환경을 준비한다.

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

Truffle 초기화 완료 화면

 

 

 

 

 

 

 

 

 

 

 

 

 

개발 환경 구축을 끝냈다면, VScode를 실행

VScode에서 세팅을 더 해야한다.

 

truffle-config.js를 오픈

 

 

 

ㄹㅇ

 

 

 

 

 

 

 

 

 

solc설정

solc는 Soliditym Compliler의 버전 등을 설정한다

여기서는 Solidity 버전 0.8.7

 

 

 

Network 설정

Ganache를 이용해 로컬 환경에서 사용할 것이기때문에 Ganache 등록

 

 

1. Contract 코드 작성

코드작성에 앞서 openzeppelin 을 설치한다.

npm install @openzeppelin/contracts

OpenZeppelin 이란?

솔리디티 기반의 스마트 컨트랙트 개발 프레임워크이다.

안전한 스마트 계약 개발을 위한 패키지이다. ERC20 및 ERC721과 같은 표준 구현을 제공하여 필요에 따라 그대로 배치하거나 확장할 수 있을 뿐만 아니라 맞춤형 계약 밑보다 복잡한 분산 시스템을 구축하기 위한 Solidity 구성 요소를 제공한다.

 

 

OpenZeppelin 설치 후, contract/ 폴더 안에 MyNFTs 파일을 생성

아래의 코드를 작성한다.

 

Ethereum NFT Tutorials의 STEP10 에서 CLI 환경에서 보다 편리하게 다루기위해 address recipient 삭제, address recipient를 사용하는 _mint 함수 인자 recipient를 msg.sender 로 변경

 

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

이렇게 변경하면, 오너의 지갑 주소에서만 함수 mintNFT 를 실행할 수 있으며, 새롭게 발행하는 NFT는 항상 오너의 지갑 주소에서 발행된다.

 

작성한 코드가 정상적으로 배포되기 위해선, 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를 배포에 추가
};

 

3. Truffle로 ERC-721 배포하기

 

로컬 환경에서 Truffle을 이용하여 컨트랙트를 배포한다.

sudo truffle migrate --compile-all --network ropsten

전부 컴파일하고 Ganache 네트워크에 배포

배포한 컨트랙트의 정보를 볼 수 있다

 

sudo truffle console --network ganache

 

작성한 함수가 잘 작동하는지 확인.

 

Ganache에 있는 첫번째 지갑의 주소에서 컨트랙트를 배포

발행된 NFT tokenURI를 확인해보면 mintNFT 함수를 통해 넣어줫던 json이 적용된 것을 볼 수 있다.

 

개발 회고

이번 글을 작성하면서 많이 이해가 된 것 같다. (하지만 안써본 기능이 더 많을것 같은..)

아직 공부해야 할 것이 많은것 같다. 

openzeppelin, truffle, ganache 등등...

 

시간날때 요즘 뜨고 있는 ERC-721A를 공부해봐야겠다.

그리고 NFT 발행도 더 많은 수량으로 다른 지갑과 연결하여 시도해보면 재미있을것같다.

 

'[BLOCKCHAIN]' 카테고리의 다른 글

solidity 패턴 분석 - Guard Check  (0) 2022.06.04
Opensea 클론코딩  (0) 2022.02.19
Mnemonic Wallet - 개발  (0) 2022.02.09
Mnemonic Wallet - 개발이론  (0) 2022.02.08
블록체인과 암호화폐  (1) 2021.12.30