블록체인 Block-Chain - ERC-721 NFT 발행 ( open-zeppelin )

dev_swan·2022년 7월 25일
0

블록체인

목록 보기
27/36
post-thumbnail

ERC-20 과 ERC-721 차이점

  • ERC-20과 ERC-721로 만든 Token은 모두 이더리움 기반 토큰이라는 공통점을 가지고 있지만, 가장 큰 차이점은 대체 가능성(fungible)입니다.
  • ERC-20으로 발행한 Token은 대체 가능한 토큰입니다. A가 가진 1 토큰의 가격이 500원이라고 가정할때 B가 가진 1 토큰도 마찬가지로 500원인 동일하 가치를 지니고, 이는 A의 토큰과 B의 토큰이 서로 대체 할 수 있는것입니다.
  • 반대로 ERC-721로 발행한 Token은 대체 불가능한 토큰입니다. ERC-721로 발행한 토큰은 각 토큰마다 고유한 값을 가지고 식별할 수 있는 토큰입니다. 즉 NFT는 각 토큰마다 동일한 토큰양을 가지고는 있지만 서로 고유한 값을 가지고 있기때문에 서로 대체 할 수는 없습니다.

ERC-721 토큰 예시

OpenSea NFT Market에 NFT 발행하기

기본 세팅

  • 오늘은 remix IDE를 사용하여 작업을 할것입니다.
  • 또한 openzeppelin 라이브러리를 사용하여 NFT를 만들어볼 것입니다.
  • mkdir truffle
  • cd truffle
  • truffle init
  • npm init -y
  • npm install openzeppelin-solidity
  • npm install -g @remix-project/remixd
  • cd contracts
  • remixd -s . --remix-ide https://remix.ethereum.org => 아래와 같이 버전 나오면 잘 실행된겁니다.
  • 브라우저에서 remix IDE 접속후 default workspacelocalhost로 변경합니다.

Rinkeby Test Network

  • 오늘은 Rinkeby Test Network를 통하여 Contract를 배포할 것입니다. 아래와 같이 MetaMask의 네트워크를 Rinkeby로 변경합니다.
  • Rinkeby Test Network에서는 가스비로 RinkebyETH를 지불하는데 아래의 두 사이트를 통해서 RinkebyETH를 24시간마다 0.1RinkebyETH씩 받을 수 있습니다.
    Rinkeby ETH 1
    Rinkeby ETH 2

Contract 작성 및 배포

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

import "openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

contract Minitng is ERC721 {
    constructor(string memory _name,string memory _symbol) ERC721(_name, _symbol) {
        
    }

    // 코드를 실행한 계정에게 토큰을 줄것이다. _tokenId는 ERC721 Token의 고유한
    function _minting(uint _tokenId) public {
        _mint(msg.sender, _tokenId);
    }

    function tokenURI(uint _tokenId) public override pure returns (string memory){
        return "https://gateway.pinata.cloud/ipfs/QmPwjnvWYN4etA5eW4yAbWCTy2ukEC1Jj5417VLGyH5XpU/1/1.json";
    }
}
  • 오늘은 ERC-721을 기반으로 NFT토큰을 생성해줄 것이니 openzeppelin에서 ERC721Enumerable solidity 파일을 불러온 후 상속받아 사용하였습니다.
  • _minting 함수의 인자값에 토큰의 고유한 tokenId를 넣고 함수를 실행하면 실행한 계정에게 고유한 tokenId를 가진 NFT를 지급할 것입니다.
  • tokenURI 함수를 사용하여 지급할 Token에 사용할 이미지와 다른 정보들이 들어있는 json파일을 return 해줍니다.
  • 현재 return해주고있는 json파일은 아래와 같습니다.
{
  "name": "ingoo NFT",
  "description": "ingoo NFT description",
  "image": "https://gateway.pinata.cloud/ipfs/QmVs28uP4MgFMHRrndLDXsoAKMQ4EGjkgFxJUEr1KCPxrU/1/1.jpg",
  "attributes": [
    {
      "trait_type": "Rank",
      "value": 1
    },
    {
      "trait_type": "Type",
      "value": 1
    }
  ]
}
  • 위와 같이 솔리디티 코드를 작성한후 remix IDE에서 작성한 솔리디티 코드가 업데이트 되었는지 확인한 후 우측 세번째 아이콘을 클릭하고 코드가 수정될 때 자동으로 Complie을 진행하도록 Auto Complie을 체크해준후 Compile을 진행합니다. 업데이트가 되지 않는다면 다른파일 클릭하면 업데이트 됩니다.
  • 4번째 아이콘을 클릭하여 ENVIRONMENTMetamask로 변경하고 Deployconstructor에 들어갈 토큰명과 심볼명을 입력하고 Deploy를 클릭하여 로 배포합니다.
  • MetaMask 연동후 아래와 같이 가스비를 확인한 후 Transaction에 내 Contract를 넣고 블록이 생성 완료되었다면 Rinkeby 네트워크에 내 Contract가 배포 완료된 것 입니다.

배포한 Contract로 NFT 발행

  • 배포가 완료되었다면 아래의 Deployed Contracts의 작성한 Contract를 클릭하여 Contract의 메서드들을 확인합니다. getter 함수와 setter 함수가 각각 다른색으로 표시되는 것을 알 수 있습니다.
  • 위의 ACCOUNT에서 Contract를 배포한 account를 복사한후 balanceOf 함수에 넣고 balanceOf를 클릭하면 해당 계정에 몇개의 NFT가 있는지 알 수 있습니다. 아직은 _minting 함수를 실행하여 해당 계정에게 NFT를 발급해주지 않았기에 0개의 NFT를 보유중이라고 나옵니다.

  • _minting 함수에 tokenId로 들어갈 1을 넣고 실행하고 setter 함수이니 가스비를 지불한 후 블록이 마이닝이 되었을때 다시 balanceOf 를 클릭하면 값이 1 올라갑니다.

  • ownerOf 함수에 1을 넣고 실행하면 해당 tokenId를 가진 NFT를 보유하고 있는 account 계정이 나옵니다.

OpenSea NFT Market Test Net에서 발행한 NFT 확인

  • OpenSea Testnets으로 접속한 후 우측에 지갑모양을 클릭하고 metamaskNFT를 보유중인 계정을 연결합니다.
  • Profile에 들어가 해당 계정의 NFT를 확인하고 클릭하면 아래와 같이 내가 발행한 NFT의 자세한 내용을 확인할 수 있습니다.

1개의 댓글

comment-user-thumbnail
2022년 8월 29일

유용한 글 감사합니다.
질문이 있는데, 내용대로 따라서 했는데 opensea Testnets에서 확인이 안되는 이유를 알 수 있을까요??

답글 달기