Klaytn NFT ๊ฐ๋ฐ(feat. truffle)
์ฐธ๊ณ > ๊ณต์ klaytn github repository
์์ํ๊ธฐ์ ์์
- ์ค๊ฐ์ค๊ฐ ๋งํฌ๋ฅผ ๊ฑธ์ด ๋์์ผ๋ ์ฐธ๊ณ ํ์ธ์.
- solidity ๋ฌธ๋ฒ๊ณผ openzeppelin ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ค๋ ๊ฐ์ ํ์ ์งํ๋ฉ๋๋ค.
- ์๋ชป๋๊ฑฐ๋ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๋๊ธ ๋ฌ์์ฃผ์ธ์.
1. ๋ก์ปฌ์์ ๊ฐ๋ฐ
1-1. ํ๋ก์ ํธ ์์ฑ & ์ค์
npm install -g truffle@5.1.23
- ์ฐธ๊ณ >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.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค