Klaytn NFT 개발(feat. truffle)

참고>github 링크

참고> 공식 klaytn github repository

시작하기에 앞서

  • 중간중간 링크를 걸어 두었으니 참고하세요.
  • solidity 문법과 openzeppelin 라이브러리는 안다는 가정하에 진행됩니다.
  • 잘못되거나 문의가 있으면 댓글 달아주세요.

1. 로컬에서 개발

1-1. 프로젝트 생성 & 설정

npm install -g [email protected]
mkdir <project_name>
cd <project_name>
truffle init

1-2. 컨트랙트 작성

npm install @klaytn/contracts
  • 주의) 위 명령어를 실행하면 klaytn-contracts 파일들이 다 받아져야 하나 업데이트를 안한건지 ownership/Ownable.sol 파일이 존재하지 않는다. 맨 위에 올려둔 공식 klaytn github repository의 contract 코드로 통째로 교체함. (ownership/Ownable.sol 만 추가 할 경우 다른 코드에 적용 되어 있는 부분까지 찾아서 바꿔줘야함)

  • contract 폴더 안에 작성

pragma solidity 0.5.6;

import "@klaytn/contracts/token/KIP17/KIP17Full.sol";
import "@klaytn/contracts/drafts/Counters.sol";
import "@klaytn/contracts/ownership/Ownable.sol";

contract MyNFTs is KIP17Full, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() public KIP17Full("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;
    }
}

1-3. 배포 스크립트 작성

  • migrations 폴더에 2_initial_mynfts.js 파일 생성 (규칙 - {숫자}_{설명}.js)
    참고>Migrations.sol, 1_initial_migration.js 은 왜 있는지와 Migration 파일명 규칙
    - 요약) migration contract 는 last_completed_migration 에 마지막 배포 스트립트의 번호를 저장하고 나중에 컨트랙트가 수정되거나 새로운 컨트랙트를 배포할 때 기존 스크립트를 중복 실행 하지 않기 위함. 추가로 이미 실행된 migration 을 추적하는데 도움이 됨.
const MyNFTs = artifacts.require('MyNFTs.sol'); // MyNFTs.sol 파일 추가

module.exports = function(deployer) {
	deployer.deploy(MyNFTs); // MyNFTs를 배포에 추가
};

1-4. ganache 네트워크 설정

ganache 의 default port는 7545
ganache-cli 의 default port는 8545

  • klaytn은 이더리움 기반이기에 ganache 사용 가능(코인표시는 ETH로 표현됨)
  • truffle project의 truffle-config.js 파일에서 networks 옵션 설정
    networks: {
        ganache: {				// 이름은 구별하기 쉽게 작성
         host: "127.0.0.1",
         port: 7545,			// ganache-cli 에 연결한다면 8545
         network_id: "*",       // Any network (default: none)
        },
    },

  // Configure your compilers
	compilers: {
		solc: {
			version: "0.5.6",
			settings: {
				evmVersion: "constantinople",
			},
		},
	},

1-5. 컨트랙트 배포

  • ganache 를 실행
	truffle migrate --compile-all --network ganache
  • 모두 컴파일을 하고 ganache 네트워크에 배포한다.
  • 명령어를 실행하면 컴파일을 먼저 한 후 ganache의 첫번째 계정으로 배포를 하는데 숫자 순서대로 배포를 시작한다.


    컨트랙트의 주소와 계정정보, 가스비 등등 다양한 출력을 확인 할 수 있다.

1-6. 컨트랙트 실행

	truffle console --network ganache
  • MyNFTs.deployed() 함수를 통해 MyNFTs 컨트랙트에 접근할 수 있다

  • truffle 이 배포한 MyNFTs 를 알 수 있는 방법 (log로 가지고 있다) (참고)

  • mintNFT 에 준비된 링크를 전달 (일반적으로 NFT는 그림파일의 경로를 담은 metadata의 경로를 넣어준다)
    참고>OpenSea Metadata 구조

instance.mintNFT("https://velog.io/@repedore")

  • 상속한 ERC721 contract의 tokenURI 함수를 사용하여 값 확인하기(KIP17Metadata.sol : 58 line)
instance.tokenURI(1)
  • 넣은 값이 잘 출력되는것을 확인

2. baobab 테스트넷에 배포

2-1. baobab 배포 설정

필수>Truffle과 Klaytn TestNet 연결하기 (feat. baobab)

  • baobab 네트워크와 연결 후 truffle console 로 진입.
truffle console --network baobab

2-2. baobab 배포

  • migrate 명령어를 입력해주면 ropsten 테스트 네트워크에 배포가 완료된다
    - migrate 실행 (온체인이라 시간이 걸림)

    - MyNFTs 의 mintNFT 함수 실행 & 결과 확인

    - 트랜잭션 해쉬값, 컨트랙트 주소, 실행한 계좌 주소 등등을 알 수 있다.

    baobab - Contract 주소
    baobab - TX 주소
  • 발행한 계정의 토큰 목록을 보면 MyNFTs(MNFT)의 TokenID 가 1인 토큰을 소유하고 있음을 알 수 있다.

2-3. (추가) OpenSea 제공 Metadata로 NFT 만들기

  • Opensea 에서 klaytn testnet은 baobab이라 컨트랙트를 바로 사용해서 mint만 해주면 됨
  • 발행한 컨트랙트 불러오기
	instance = await MyNFTs.deployed()
    instance.name()			// 잘 불러왔나 확인
  • OpenSea 제공 Metadata 로 mintNFT 하기 (링크)
	instance.mintNFT('https://opensea-creatures-api.herokuapp.com/api/creature/3')


OpenSea 확인
baobab - Contract 주소(위와 동일)
baobab - TX 주소

회고

Klaytn 이 Ethereum 기반이라 많은 부분이 비슷하여 진행을 수월하게 했다.
klaytn 부분을 정리하면서 Ethereum 방식으로 반복하다보니 truffle 에 더 익숙해진것 같다.
사실 다 하고 나서 생각해보면 비슷한게 아니라 모든게 같았다.
근데 난 이렇게 블로깅으로 정리 하기 전까지 완벽하게 같은 방식으로 할 수 있을거라고 생각을 못했다.
아마 경험이랑 개념이 부족해서 그런것 같다.
그래도 작은 기준을 세웠으니 이걸 바탕으로 더 많은 확장을 이뤄내보자.

PS)아.. klaytn contract code verify 는 구글 폼으로 받는것 같은데....... 왜이렇게 하는건지는 잘 모르겠지만... 그래도 하는방법을 알아봐야 할 것 같다.

좋은 웹페이지 즐겨찾기