Ethereum | ERC-721

장민우·2023년 1월 5일
0

Solidity

목록 보기
2/6

🙋‍♂️ 들어가기 전에

먼저 ERC-20, ERC-721에서 ERC는 Ethereum Request for Comment RFC(Request for Comment)는 
주로 인터넷 기술에 대해 새로운 기술을 제시하고 비평을 받기 기다리는 문서입니다. 
ERC는 인터넷 기술 대신에 새로운 이더리움 기술이 제시되고 비평을 받게 되며, 다른 사람들의 의견에 따라 표준이 될 수 있습니다.

ERC721

블록체인 사용 사례가 확대됨에 따라 블록체인에 기록된 고유 데이터를 토큰화하고 표현할 필요가 있었습니다.

이를 해결하고자 ERC721 토큰 표준이 탄생합니다. ERC721 표준을 사용하면 대체 불가능(non-fungible) 토큰을 생성할 수 있습니다. 

즉, 각 토큰은 고유한 가치를 가지며, ERC20 토큰처럼 서로 교환하는 것이 불가능합니다. 

대체 불가능 토큰은 검증 가능한 고유 디지털 오브젝트로서 작동합니다.

자, 블록체인에 등록된 디지털 예술 작품을 나타내고자 하는 상황을 가정해 봅시다. 이러한 목적으로 ERC20 토큰을 사용할 수는 없습니다. 

대신에, ERC721 표준 토큰을 사용하여 NFT 예술 작품을 생성할 수 있습니다. 

디지털 예술 작품의 NFT는 손쉽게 작품의 진위 여부와 소유권 기록을 증명할 수 있습니다.

또한, 소유권 기록과 NFT 작품의 신원 정보는 블록체인에 불변의 상태로 저장됩니다. 

따라서 예술가의 작품 원본을 위조하기는 거의 불가능합니다. 

이 처럼 "대채 불가능한 토큰" 이라는 장점을 활용해 게임, 미술, 진위여부 등 여러분야 발 빠르게 넓혀가고 있는 분야 입니다.

ERC-721 기능

  • 중요 기능을 정리한 공간입니다.

balanceOf(address owner) : 해당 계정의 소유하고 있는 NFT 개수를 반환합니다.

ownerOf(uint256 tokenId) : 해당 NFT의 소유자를 반환합니다.

safeTransferFrom(address, address, uint256, bytes) : 소유하고 있는 NFT를 안전하게 타인에게 전송합니다.

safeTransferFrom(address, address, uint256) : 소유하고 있는 NFT를 전송할때 받는 사람이

ERC721 프로토콜을 이행하고 있는지 확인하여 토큰이 잠기는 것을 방지합니다.

transferFrom(address, address, uint256) : 소유하고 있는 NFT를 타인에게 전송합니다.

approve(address to, uint256 tokenId) : 다른 계정으로 NFT를 전송할 수 있는 권한을 승인받습니다.

setApprovalForAll(address operator, bool _approved) : 자신이 소유하고 있는 NFT의 전송할 수 있는 권한을 전체를 승인 받습니다.

👋 더 자세한 자료는 Openzepplin에 기재되어 있습니다. Openzepplin 공식문서

NFT 개발기

  1. 버전설정
    • 원하는 버전과 라이센스를 등록을 합니다. (저는 무료 라이센스로 선언 했습니다.)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
~~~
2. 라이브러리 Import
	- NFT를 개발하기 위해 필요한 라이브러리를 import 합니다.
~~~solidity
import "@openzeppelin/contracts/access/Ownable.sol"; // 배포자만 건들 수 있게 Ownable 사용합니다.
import "@openzeppelin/contracts/utils/Counters.sol"; // 증가, 감소 또는 재설정만 가능한 카운터를 사용합니다.
import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
  1. 스마트컨트랙트 작성하기
    • 필요한 소스, 라이브러리등 이용해서 작성하시면 됩니다.
// 예시 소스
// 옛날에 공부했던 소스입니다. 위에 import 와 다를 수 있으니 주의 부탁드립니다.
contract Maket is ERC721Token {
    constructor (string _name, string _symbol) public ERC721Token(_name, _symbol) {}
     
     // 이벤트 로그 찍기
     event TokenRegistered(address _by, uint256 _tokenId);

    // 토큰생성
    function Maketplace(address _to,uint256 _tokenId,string  _tokenURI) public{
        _mint(_to, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);
        emit TokenRegistered(_to, _tokenId);
    }

  
}
  1. 배포하기
    • 저는 자바에서 직접 Solidity와 연동하여 배포를 진행을 했습니다. (내용이 길어질 것 같으니 자바로 연동하는 법은 포스팅을 따로 하겠습니다.)
  2. 서비스 연동하기
    • 저는 Vue와 연동을 해서 제가 배포한 Dapp과 상호작용을 하는 것을 했습니다.
    • 위와 마찬가지로 따로 연동하는 법을 포스팅하겠습니다.

글을 마치며..

처음 NFT를 만들 때는 자료가 많지 않아 많은 어려움이 있었습니다.
맨날 구글링으로 해외 사이트를 돌아다니면서 이것저것 보면서 제 소스에 넣어서 테스트해 보고 실패도 해보고 성공도
해본 것 같습니다. 그래서 제가 비록 많이 아는 것은 아니지만 적어도 제가 개발할 때 알았던 중요했던 점들을 나누고 싶어서
이렇게 포스팅으로 남기게 되었습니다. 많이 부족할지는 몰라도 이 긴 글 끝까지 봐주셔서 감사합니다.🙇🏻🙇🏻
profile
꿈틀대는꼬마개발자

0개의 댓글