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
개발 환경 구축을 끝냈다면, 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 |