Blockchain - ERC-721 실습

김도영·2022년 7월 19일
0

Remix 접속 후 파일 생성

  1. 새로운 프로젝트를 하나 생성 한후 MyNFT.sol을 생성한다.
  2. MyNFT.sol 파일에 ERC-721 컨트랙트 코드를 입력한다. 여기서는 직접 표준을 구현하는 대신, OpenZeppelin에서 제공하는 라이브러리를 import하여 사용한다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyNFTs is ERC721 {
    constructor() public ERC721("MyNFT", "NFT") {}
}

  1. 'complier'탭에서 ERC-721파일을 컴파일한다.

Remix에 MetaMask 연결

  1. 'Deploy & run transactions' 탭을 선택한다.
  2. 'ENVIRONMENT'를 선택하고, InJected Web3를 선택한다.
  3. Metamask가 연결되면 Ropsten 테스트 네트워크가 맞는지 확인하고, 지갑의 주소도 확인한다.

ERC-721 배포

  1. Deploy 파트에서 우리가 배포할 컨트랙트(MyNFT)를 선택한다.

  1. MetaMask에서 팝업창이 뜨면 확인을 누른다.
  2. 배포가 완료되면 'Deployed contracts'에서 컨트랙트 함수를 실행할 수 있다.

그러나, OpenZeppelin에서 제공하는 ERC-721 라이브러리에는 표준 함수9가지만 구현되어 있다. 실제로 우리가 작성한 ERC-721 컨트랙트를 통해 NFT를 민팅하기 위해서는 컨트랙트에 새로운 함수를 추가해야 한다.

새로운 NFT 발행을 위해 다음의 코드를 수정한다.

//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.7;

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

    constructor() public 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;
    }
}

  • solidity version을 사용하는 컴파일러의 버전(^0.8.7)으로 변경한다.
  • 발행할 컨트랙트의 이름을 지정한다. 공식 튜토리얼로부터 복사한 컨트랙트의 이름은 MyNFT이지만, 여기서는 사용한 컨트랙트의 이름은 MyNFTs이다.

위의 코드에서는 NFT를 민팅하는 함수 mintNFT()가 추가되었다. 그리고, 우리가 마든 ERC-721 컨트랙트가 ERC721URIStorageOwnable컨트랙트를 상속받고 있다.

  • ERC721URIStroage 는 토큰의 정보를 저장하는 tokenURI를 관리하는 컨트랙트이다.
    • tokenURI는 이미지 주소 등 NFT의 특성을 저장하는 JSON 객체이다
    • mintNFT() 함수에서는 ERC721URIStorage 컨트랙트를 사용해 tokenURI를 관리한다.
  • Ownable 은 컨트랙트의 소유권을 관리하는 컨트랙트이다.
  • 컨트랙트의 특정 함수는 아무나 실행하는 것이 아니라, 컨트랙트의 소유자만 실행할 수 있어야 하는 경우도 있다. 예를 들어, NFT를 민팅할 때는 아무나 민팅하는 것이 아니라, 컨트랙트를 관리하는 소유자만이 민팅하여 정해진 발행량을 준수하도록 해야한다.
    • 이런 경우, Ownable 컨트랙트의 onlyOwner라는 modifier를 사용하여, 함수를 실행가지 전, 함수를 호출한 계정이 컨트랙트 소유자의 계정인지 확인한다.
    • mintNFT()함수에서도 함수 실행 전 onlyOwner modifier를 통해 함수를 호출한 계정이 컨트랙트 소유자 계정인지 확인한다. 이를 통해 mintNFT()함수를 컨트랙트 소유자만 실행할 수 있도록 한다.

이제 컨트랙트의 컴파일을 진행한다.
마찬가지로, 배포를 완료 한 후 NFT를 발행할 수 있다.

이제는 mintNFT 트랜잭션 생성 함수가 포함된 걸 확인할 수 있다.

NFT 발행

  1. pinata 에서 NFT 이미지를 생성한다.

  2. NFT 이미지를 등록한다.

  1. JSON 파일을 만들어준다.
{
    "attributes" : [ {
      "trait_type" : "Breed",
      "value" : "puppy"
    }, {
      "trait_type" : "Color",
      "value" : "Mocha"
    } ],
    "description" : "puppy designed by bcdy",
    "image" : "ipfs://NFT CID 주소,
    "name" : "Pachu"
}
  1. JSON 파일을 업로드 한 후 CID 주소를 확보한다.

  1. mintNFT 함수에 MetaMask주소와 JSON파일의 CID 주소를 넣고 배포한다.

  1. 이더스캔에서 NFT가 잘 발행되었는지 확인한다.

profile
Blockchain Developer

0개의 댓글