💡Local 에서 ERC-721 개발하기
로컬에서 Truffle과 Ganache를 이용하여 NFT를 개발해보자. 먼저 새로운 폴더를 생성하고 Truffle을 이용한 개발환경을 준비하자.
#폴더 생성
mkdir erc721
#폴더 진입
cd erc721
#truffle 초기화
truffle init
#npm 초기화
npn init
개발 환경 준비를 마쳤다면, VSCODE를 실행해보자. VScode에 나타나는 폴더와 파일의 구조는 다음과 같다.
먼저 몇 가지 세팅을 진행해보자.
truffle-config.js 를 열고 solc를 설정한다. solc는 solidity, compiler의 버전 등을 설정할 수 있다. 이 예시에서 사용하는 Solidity 의 버전은 0.8.7이고 Compiler 버전은 london 이다.
다음은 네트워크 설정을 편집해야 한다. Ganache를 통해 로컬 환경에서 테스트할 예정이므로, 먼저 Ganache를 등록한다. 다음과 같이 주석을 제거하고, development를 ganache로 변경한다.
이제 로컬 환경에서 Truffle과 Ganache를 이용해 개발하는 환경을 구축했다. 이제 MyNFTs.sol이라는 파일을 생성하고 아래 코드를 붙여 넣는다.
//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;
}
}
이 파일은 OpenZeppelin의 파일을 참조하고 있기 때문에 만약 openzeppelin이 로컬 PC에 설치되지 않았다면 설치해주어야 한다.
npm install @openzeppelin/contracts
붙여 넣은 코드가 정상적으로 배포되기 위해서는 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를 배포에 추가
};
이걸로 ERC 721 을 이용한 개발은 끝이 났다. 이제 배포 콘텐츠를 통해 작성한 컨트랙트를 로컬에서 Truffle과 Ganache로 배포하면 된다.
✓ Truffle로 ERC-721 배포하기
먼저, 새로운 터미널을 열고 ganache-cli를 실행한다.
# 새로운 터미널에서 ganache-cli 실행
ganache-cli
기존의 터미널에서 truffle로 배포한다. 이때, truffle-config.js 파일의 network에 설정한 ganache로 실행해야 한다.
truffle migrate --compile-all --network ganache
위 명령어를 통해 로컬의 ganache-cli와 연결하고 컨트랙트를 배포한다.
컨트랙트의 배포가 잘 이루어졌다면, Truffle console을 이용해 컨트랙트를 조작할 수 있다. 다음의 명령어를 터미널 프롬프트에 입력하고 truffle console에 진입한다.
truffle console --network ganache
Truffle console에 접속해서 배포한 컨트랙트의 인스턴스를 받아와 아래와 같이 확인해보자.
instance = await MyNFTs.deployed()
instance.name()
instance.symbol()
배포된 컨트랙트에 대한 확인을 마쳤으면, 작성한 함수가 잘 도착하는지 확인한다. 이 때 함수의 마지막 파라미터로 실행할 지갑 주소를 함께 전달해야한다. 이 지갑의 주소는 ganache-cli의 첫 번째 지갑 주소이다. Ganache를 이용해 컨트랙트를 배포할 때에는, default로 첫번째지갑의 주소에서 컨트랙트를 배포한다.
instance.mintNFT("https://urclass-images.s3.ap-northeast-2.amazonaws.com/beb/section4/unit4/test.json", { from: accounts[0] })
그 다음 발행된 NFT로부터 tokenURI를 확인해보면 아래와 같은 결과를 얻을 수 있다.
instance.tokenURI(1)
앞으로 다른 네트워크에 배포할 때에는 truffle-config.js 에 네트워크 정보를 추가하고 Truffle 명령어 중 옵션 --network와 함께 네트워크의 정보를 담고있는 키를 입력하면 된다.
'블록체인 > WEB3 개발' 카테고리의 다른 글
DID를 활용한 졸업증명서에 기능 추가하기 (0) | 2022.07.27 |
---|---|
DID를 활용한 졸업증명서 개발하기 (0) | 2022.07.27 |
Remix에서 ERC-721 개발하기 (0) | 2022.07.20 |
Truffle(트러플), Truffle Develop, Truffle과 Ganache 연동 (0) | 2022.07.15 |
Ganache/Ganache-cli 설치하기, Ganache와 Remix 연동, Ganache Network에 스마트 컨트랙트 배포 (0) | 2022.07.15 |
댓글