본문 바로가기

CHALLENGER : BNB 체인 해커톤

3회차 강의 정리 | NFT 스탠다드 | BEP-721이란? | OpenZeppelin 사용하기 | 민팅 구현하기 | 민팅해보고 OpenSea에서 확인하기

수업 실습 내용 + 추가 공부 내용 정리

# NFT 스탠다드, BEP-721 이란?

BEP-721 을 알기 위해서는 ERC-20 을 먼저 봐야할 것 같다. ERC-20은 Ethereum Request for Comment 20의 약자로, 이더리움 블록체인 네트워크에서 정한 표준 토큰 스펙이다. 이 스펙을 맞춰야 이더리움과 쉽게 교환할 수 있고, 표준 이더리움 지갑에 자유롭게 전송할 수 있다. 해당 표준을 사용하면 토큰끼리 호환이 가능하다. 다만 이 ERC-20이 가지고 있는 결함으로, ERC-233, ERC-777등이 제안되었고, ERC-721 은 토큰에 Unique Identifier를 붙여줌으로써 유일한 (대체 불가능한) 토큰을 가능하게 해준다.

 

BEP-721은 Binance Smart Chain의 표준 스펙으로, 이더리움 네트워크의 ERC-721의 확장판이다. BEP-721 역시 NFT를 발급하게 해준다. 이러한 기술 스펙은 인터페이스 형식으로 구현되어있어서, 인터페이스를 상속하여 스마트 컨트랙트를 구현하면 된다.

 

NFT Standard doc : https://eips.ethereum.org/EIPS/eip-721

 

ERC-721 sample

pragma solidity ^0.4.20;

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

 

# OpenZeppelin 사용하기

위와 같은 표준 규격 인터페이스들을 포함하여 블록체인 어플을 개발할 수 있는 라이브러리를 제공하는 OpenZeppeline을 사용한다. 개발 시 필요한 Docs도 잘 정리되어 있다. NFT 를 개발하고 싶기 때문에 ERC721 API를 찾아보았다.

https://www.openzeppelin.com/

 

링크에 보면 Openzeppline을 Import 하라고 나온다.

 

지난번 예습 상황과 같이 Remix IDE를 켜서, 문서대로 import 해준다. ERC721Enumerable 은 ERC721에서 토큰 아이디를 셀 수 있도록 몇가지 함수들을 추가한 확장버전이다.

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

 

# 민팅 구현하기

 

1. 컨트랙트 구현

contract MintNFT{}

 

2. ERC721Enumerable interface 상속받기

contract MintNFT is ERC721Enumerable {}

 

3. 생성자 구현
생성자는 스마트 컨트랙스 배포 시점에 딱 한 번 실행된다.

contract MintNFT is ERC721Enumerable {
    constructor() ERC721("contractName", "constractSymbol"){} // do nothing ㅎㅎ
}

 

4. Mint 함수 구현

contract MintNFT is ERC721Enumerable {
    constructor() ERC721("contractName", "constractSymbol") {}
    
    function mintNFT() public {
        // totalSupply() 는 NFT 프로젝트 총 개수를 return
        // 따라서 tokenId는 내가 몇번째 토큰을 발행하는지 알려준다.
        uint tokenId = totalSupply() + 1;
        
        // _mint(address to, uint256 tokenId) 
        // msg.sender 는 함수를 실행하는 사람 
        _mint(msg.sender, tokenId);
    }
}

 

# 민팅해보고 OpenSea 에서 확인하기 

deploy버튼을 누르고, mintNFT 함수를 실행한다.

 

그리고 OpenSea의 테스트네트워크에 연결해서 지갑을 연결하면 민팅한 NFT 토큰을 확인할 수 있다. 비록 아무 테이터도 없고, 사진도 없지만, 잘 들어가 있다. testProject라고 이름을 넣어서 Minting했더니 저렇게 이름이 보인다. 1, 2 는 tokenId 인거같다. 

 

 

처음으로 바이낸스 네트워크에 스마트 컨트랙트를 작성해서 NFT를 발행해보았다. 

생각보다 뿌듯하고 재미있다~

반응형