Klaytn NFT 개발(feat. truffle)
참고> 공식 klaytn github repository
시작하기에 앞서
- 중간중간 링크를 걸어 두었으니 참고하세요.
- solidity 문법과 openzeppelin 라이브러리는 안다는 가정하에 진행됩니다.
- 잘못되거나 문의가 있으면 댓글 달아주세요.
1. 로컬에서 개발
1-1. 프로젝트 생성 & 설정
npm install -g [email protected]
- 참고>Truffle 설치 & Ganache 연동
- 프로젝트 폴더 생성 후 truffle 초기화
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")
1-1. 프로젝트 생성 & 설정
npm install -g [email protected]
- 참고>Truffle 설치 & Ganache 연동
- 프로젝트 폴더 생성 후 truffle 초기화
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 는 구글 폼으로 받는것 같은데....... 왜이렇게 하는건지는 잘 모르겠지만... 그래도 하는방법을 알아봐야 할 것 같다.
Author And Source
이 문제에 관하여(Klaytn NFT 개발(feat. truffle)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@repedore/truffle-Klaytn-NFT저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)