๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Blockchain

[ERC721] NFT ๋ฐœํ–‰๋ถ€ํ„ฐ OpenSea ๋“ฑ๋ก, ํŒ๋งค๊นŒ์ง€ ์ „์ฒด NFT ๋ฐœํ–‰ ํ”Œ๋กœ์šฐ

by clolee 2025. 5. 30.

๐Ÿงพ NFT ๋ฐœํ–‰๋ถ€ํ„ฐ OpenSea ๋“ฑ๋ก๊นŒ์ง€: ์ „์ฒด ๊ณผ์ • ์™„์ „ ์ •๋ฆฌ

์ด ๋ฌธ์„œ๋Š” NFT ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ์ด๋ฏธ์ง€ ์ค€๋น„ → ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ → Pinata ์—…๋กœ๋“œ → Remix ๋ฐฐํฌ → OpenSea์— ๋“ฑ๋ก ๋ฐ ํŒ๋งค๊นŒ์ง€์˜ ์ „์ฒด ๊ณผ์ •์„ ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์Šต ์˜ˆ์ œ๋Š” ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์–ด ๋ˆ„๊ตฌ๋‚˜ ์‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 1. NFT ์ด๋ฏธ์ง€ ์ค€๋น„

NFT๋Š” ์ด๋ฏธ์ง€, ์˜์ƒ, ์˜ค๋””์˜ค ๋“ฑ ๋””์ง€ํ„ธ ์ž์‚ฐ์„ ๊ณ ์œ ํ•œ ํ† ํฐ์œผ๋กœ ๋ฐœํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋Š” .png ๋˜๋Š” .jpg ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

  • ๊ถŒ์žฅ ์‚ฌ์ด์ฆˆ: 500x500px ์ด์ƒ
  • ๊ถŒ์žฅ ํฌ๊ธฐ: 1MB ์ดํ•˜ (OpenSea ๋กœ๋”ฉ ์†๋„ ๊ณ ๋ ค)
  • ํ™•์žฅ์ž: .png, .jpg, .gif, .svg ๋“ฑ

์ด๋ฏธ์ง€๊ฐ€ ์ค€๋น„๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„์ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ž‘์„ฑ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.


โœ… 2. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(JSON) ์ƒ์„ฑ

NFT์˜ ์„ค๋ช…, ์†์„ฑ, ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š” JSON ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด JSON์€ IPFS์— ์—…๋กœ๋“œ๋˜์–ด tokenURI๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ (metadata.json)

{
  "name": "My First NFT",
  "description": "A unique digital collectible.",
  "image": "ipfs://<IPFS_IMAGE_CID>",
  "attributes": [
    { "trait_type": "Background", "value": "Blue" },
    { "trait_type": "Rarity", "value": "Rare" }
  ]
}

โœ… 3. Pinata๋กœ ์ด๋ฏธ์ง€ & ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ

๐Ÿ“Œ Pinata๋ž€?

IPFS(InterPlanetary File System) ๊ธฐ๋ฐ˜์˜ ์—…๋กœ๋“œ ํ”Œ๋žซํผ์œผ๋กœ, NFT ์ด๋ฏธ์ง€์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋กœ๋“œ ์ ˆ์ฐจ

  1. ์ด๋ฏธ์ง€ ํŒŒ์ผ ์—…๋กœ๋“œ → CID ๋ณต์‚ฌ
  2. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ image ํ•ญ๋ชฉ์— ipfs://<์ด๋ฏธ์ง€_CID> ์‚ฝ์ž…
  3. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(JSON) ์—…๋กœ๋“œ → ์ตœ์ข… CID ํ™•๋ณด
  4. ์ตœ์ข…์ ์œผ๋กœ ipfs://<๋ฉ”ํƒ€๋ฐ์ดํ„ฐ_CID>๋ฅผ tokenURI์— ์‚ฌ์šฉ

โœ… 4. Remix๋กœ ERC-721 NFT ์Šค๋งˆํŠธ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ

๐Ÿ“ฆ Remix ์ค€๋น„

๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ (ERC721.sol)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyNFT is ERC721URIStorage, Ownable {
    uint256 public tokenCounter;

    constructor() ERC721("MyNFT", "MNFT") {
        tokenCounter = 0;
    }

    function mintNFT(address to, string memory tokenURI) public onlyOwner {
        _safeMint(to, tokenCounter);
        _setTokenURI(tokenCounter, tokenURI);
        tokenCounter++;
    }
}

โ— Ownable์€ ๊ผญ ์จ์•ผ ํ•˜๋‚˜์š”?

  • Ownable์€ onlyOwner ์ œํ•œ์„ ํ†ตํ•ด ๋ฏผํŒ… ๊ถŒํ•œ์„ ๋ฐฐํฌ์ž์—๊ฒŒ๋งŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค๋ฌด์—์„œ ๊ถŒํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์‚ฌ์šฉ์„ ์ถ”์ฒœํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ๋‚˜ ํผ๋ธ”๋ฆญ ๋ฏผํŒ…์„ ์—ด์–ด๋‘๋ ค๋ฉด ์ œ๊ฑฐํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๊ฑฐ ์‹œ mintNFT() ํ•จ์ˆ˜ ์•ž์˜ onlyOwner๋ฅผ ์‚ญ์ œํ•˜๊ณ  Ownable import๋„ ์ œ๊ฑฐํ•˜์„ธ์š”.

โœ… 5. Remix์—์„œ ๋ฐฐํฌ ๋ฐ NFT ๋ฏผํŒ…

๋ฐฐํฌ ์ ˆ์ฐจ

  1. Solidity ์ปดํŒŒ์ผ ํƒญ์—์„œ ์ปดํŒŒ์ผ
  2. Deploy & Run ํƒญ → ํ™˜๊ฒฝ: Injected Provider - MetaMask
  3. Deploy ํด๋ฆญ → MetaMask ์„œ๋ช… → ๋ฐฐํฌ ์™„๋ฃŒ

๋ฏผํŒ… (NFT ๋ฐœํ–‰)

  1. ๋ฐฐํฌ๋œ ์ปจํŠธ๋ž™ํŠธ์—์„œ mintNFT() ํ•จ์ˆ˜ ์ž…๋ ฅ:
    • to: NFT ๋ฐ›์„ ์ฃผ์†Œ (๋ณธ์ธ ๋ฉ”ํƒ€๋งˆ์Šคํฌ ์ฃผ์†Œ)
    • tokenURI: ipfs://<๋ฉ”ํƒ€๋ฐ์ดํ„ฐ_CID>
  2. Transact ํด๋ฆญ → MetaMask ์„œ๋ช…

tokenId ํ™•์ธ

  • ์ด ์˜ˆ์ œ์—์„œ๋Š” tokenCounter๊ฐ€ ์ž๋™ ์ฆ๊ฐ€ํ•จ
  • ์ตœ์ดˆ ๋ฏผํŒ…์˜ tokenId๋Š” 0, ๋‹ค์Œ์€ 1, 2...
  • Remix์—์„œ tokenCounter() ํ˜ธ์ถœ → ํ˜„์žฌ ๊ฐ’์ด 3์ด๋ฉด ๋งˆ์ง€๋ง‰ tokenId๋Š” 2

โœ… 6. OpenSea์—์„œ NFT ํ™•์ธ ๋ฐ ํŒ๋งค

NFT ์ž๋™ ์ธ์‹

OpenSea๋Š” ๋ธ”๋ก์ฒด์ธ์„ ์Šค์บ”ํ•˜์—ฌ ๋ฏผํŒ…๋œ NFT๋ฅผ ์ž๋™์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๋“ฑ๋ก ์—†์ด๋„ tokenURI์— ์œ ํšจํ•œ IPFS JSON๋งŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ช‡ ๋ถ„ ๋‚ด๋กœ OpenSea์—์„œ ์กฐํšŒ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

ํ™•์ธ ๋งํฌ

https://testnets.opensea.io/assets/sepolia/<์ปจํŠธ๋ž™ํŠธ์ฃผ์†Œ>/<ํ† ํฐId>

์˜ˆ์‹œ:

https://testnets.opensea.io/assets/sepolia/0x123...abcd/0

์ด๋ฏธ์ง€ ์•ˆ ๋œฐ ๋•Œ ๋Œ€์ฒ˜

  • OpenSea ํŽ˜์ด์ง€ ์ƒ๋‹จ โž Refresh metadata ํด๋ฆญ
  • IPFS์—์„œ JSON ๊ตฌ์กฐ ๋ฐ ์ด๋ฏธ์ง€ CID ๋‹ค์‹œ ํ™•์ธ

ํŒ๋งค ๋“ฑ๋ก

  1. OpenSea ์ ‘์† → ์šฐ์ธก ์ƒ๋‹จ [Profile] → NFT ์„ ํƒ
  2. [Sell] ๋ฒ„ํŠผ ํด๋ฆญ
  3. ๊ฐ€๊ฒฉ ๋ฐ ํŒ๋งค ๊ธฐ๊ฐ„ ์„ค์ •
  4. MetaMask ์„œ๋ช… → ํŒ๋งค ์™„๋ฃŒ

โœ… ๋ณด์ถฉ ๊ฐœ๋… ์ •๋ฆฌ

๊ฐœ๋… ์„ค๋ช…
IPFS InterPlanetary File System: ํƒˆ์ค‘์•™ ํŒŒ์ผ ์ €์žฅ์†Œ
CID Content Identifier: IPFS์˜ ๊ณ ์œ  ์ฃผ์†Œ
tokenURI NFT๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ URI (๋ณดํ†ต ipfs:// ํ˜•์‹)
ERC-721 NFT๋ฅผ ์œ„ํ•œ ์ด๋”๋ฆฌ์›€ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค
OpenSea NFT ๊ฑฐ๋ž˜/์กฐํšŒ ํ”Œ๋žซํผ. ๋ฏผํŒ…๋œ NFT ์ž๋™ ์ธ์‹

๐Ÿ ๋งˆ๋ฌด๋ฆฌ ํŒ

  • ํ…Œ์ŠคํŠธ๋„ท์—์„œ ์ถฉ๋ถ„ํžˆ ์‹คํ—˜ ํ›„ ๋ฉ”์ธ๋„ท์œผ๋กœ ํ™•์žฅํ•˜์„ธ์š”.
  • IPFS ์—…๋กœ๋“œ ์ˆœ์„œ (์ด๋ฏธ์ง€ → JSON)๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ์ •์ƒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฏผํŒ… ํ›„ tokenId๋Š” ์ž๋™ ์ฆ๊ฐ€ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ tokenCounter - 1๋กœ ํŒ๋‹จํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํŒ๋งค๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ ค๋ฉด MetaMask ์ง€๊ฐ‘๊ณผ OpenSea ๊ณ„์ • ์—ฐ๋™ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€