0과 1을 공부하다.

[NFT] Moralis NFT MarketPlace 구축 - Minting 본문

Study/BlockChain

[NFT] Moralis NFT MarketPlace 구축 - Minting

Developer_Jay 2022. 10. 25. 12:53
728x90

본 작품은 12ICV(https://12icv.life/) 작가의 작품입니다. 필자는 저작권 허가를 받았으며, 무단으로 도용, 이용, 활용시 관계법령에 따라 처벌받을 수 있습니다.

 

이전 게시물에서 NFT를 등록할 수 있는 마켓플레이스를 구축했다.  본 게시물에서는 마켓플레이스에 NFT를 등록하게 위해 디지털 자산을 주조하는 행위인 Minting을 구현해본다. 

 

구현에 앞서 해당 글에서 다루는 용어에 대해 간략하게 정리한다. 

 

용어정리

 

  • Minting: 원래의 사전적 의미로 동전 또는 지페의 화페를 주조한다는 의미로 token이 대안화페를 의미하는 것을 착안하여 NFT를 생성하는 것을 민팅이라고 표현한다.
  • ERC721: 이더리움 블록체인에서 대체 할 수 없거나 고유한 토큰을 작성하는 방법을 설명하는 무료 공개 표준이다.
  • IPFS(InterPlanetary File System): 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하기 위한 프로토콜이다. 기존의 HTTP 방식은 데이터가 위치한 곳의 주소를 찾아가서 원하는 콘텐츠를 한꺼번에 가져오는 방식이었지만, IPFS는 데이터의 내용을 변환한 해시값을 이용하여 전 세계 여러 컴퓨터에 분산 저장되어 있는 콘텐츠를 찾아서 데이터를 조각조각으로 잘게 나눠서 빠른 속도로 가져온 후 하나로 합쳐서 보여주는 방식으로 작동한다. 
  • Pinata: 마켓플레이스, 메타버스 등에서 NFT용 콘텐츠를 배포하는 IPFS 기반 클라우드 제공 업체이다.

 

용어를 정리하자면 디지털 자산을 고유한 토큰 값으로 Minting 하기 위해 IPFS 기반의 Pinata 플랫폼에서 ERC721 표준으로 NFT를 생성해준다.

 

IPFS Image 및 MetaData 등록

 

IPFS 서비스 Pinata에 이미지 파일(jpeg, png 등)을 등록.

 

등록한 이미지의 CID(Content IDentifier, Image Hash)를 별도로 메모해둔다.

 

JSON 포맷으로 MetaData를 작성한다. image에는 image의 CID를 기입한다.

{
	"name": "12ICV",
	"description": "12ICV Art Work",
	"image": "ipfs://QmS9SzLFDUAJ9hsADGwJvQCteWRqRdWXvFMKn3JvYiGXeP",
	"attributes": [{"trait_type": "Unknown", "value":"Unknown"}]
}

 

작성한 MetaData를 IPFS에 등록하고 CID를 메모해둔다.

 

 

 

솔리디티 파일 작성 및 스마트 컨트랙트 배포

 

Ethereum NFT Tutorials 예시를 바탕으로 솔리디티 remix IDE에 새로운 워크스페이스에서 작성한다.

MyNFT.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.0;

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 MyNFT is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("MyNFT", "NFT") {}

    function mintNFT(address recipient, string memory tokenURI)
        public onlyOwner
        returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

 

위 코드에서 ERC721함수에 매개변수로 첫 번째 항목에 NFT 이름, 두번째 항목에 NFT 심볼을 기입한다.

constructor() ERC721("MyNFT", "NFT") {}

 

작성한 솔리디티 파일을 컴파일(Compile) 한다. 

 

 

ENVIRONMENT에서 Metamask를 선택하고 ACCOUNT에서 자신의 지갑주소임을 확인하고 Deploy(배포)를 클릭한다.(가스비가 청구됨)

이후 아래 콘솔창에서 contracts가 배포됨을 확인한다.

 

 

Smart Contract가 체결되면 mintNFT 항목에서 recipient 항목에 자신의 지갑주소, tokenURI에 Pinata에 JSON 형태로 업로드한 ipfs://Metadata CID 를 입력한다. 이후 transact 버튼을 클릭하여 NFT 민팅을 수행하고 자신의 지갑으로 전송한다. 아래 콘솔창에서 전송결과를 확인한다.

 

 

 

결과

 

Authentication 으로 자신의 지갑과 연결하고 Your Collection 탭으로 이동하면 Minting 한 NFT를 확인할 수 있다. 

 

아래 View On Vlockexplorer 를 누르면 Etherscan 으로 연결되어 스마트 컨트랙트 정보를 확인 할 수 있다.

 

List NFT for sale 버튼을 누르고 ETH를 기입하면 해당 NFT를 마켓에 등록할 수 있게 된다. 

 

Your Transactions 항목에서 NFT 거래내역을 확인할 수 있다. 

 

Explore Market 항목에서 NFT를 등록하면 Buy Now 항목으로 거래할 수 있는 상태가 된다. 

 

Buy를 클릭하면 등록한 금액에 NFT를 구매할 수 있다.

 

 

 

참고사이트

 

 

 

 

 

 

 

※ 본 게시글의 정보가 잘못 되었거나 부족한 부분에 대한 피드백을 환영합니다.

 

 

* CopyRight 2022. Jay Park All rights reserved.

728x90
Comments