수업 실습 내용 + 추가 공부 내용 정리
# 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를 찾아보았다.
링크에 보면 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를 발행해보았다.
생각보다 뿌듯하고 재미있다~
'CHALLENGER : BNB 체인 해커톤' 카테고리의 다른 글
5회차 해시립스 (hashlips) 사용해서 대량 이미지 만들기 (0) | 2022.11.27 |
---|---|
4회차 강의 정리 | NFT 메타데이터 추가 | NFT 민팅하기 | Pinata 사용하기 | IPFS 란 (2) | 2022.11.16 |
1주차 예습 내용 정리 | 스마트 컨트랙트란? | 솔리디티란? | remix IDE 사용법 | 간단한 컨트랙트 구현 (0) | 2022.11.09 |
BNB 해커톤 1주차 후기 (0) | 2022.11.09 |
[온라인] CHALLENGER : BNB 체인 해커톤 합격 후기 (0) | 2022.11.08 |