[ERC721] NFT 소스분석

개발개발·2022년 9월 27일
0

블록체인 관련

목록 보기
1/4

hyperledger 예제 코드를 받아보니 erc721, erc20, erc1155에 대한 예제 소스들이 있었다. 공부해야지 마음먹은지는 오래되었고 실행으로 옮겨야 할 때가 된것같다.

ERC721은 NFT와 관련된 내용이다. NFT를 간단하게 설명하면 아래와 같다.

  1. 블록체인은 위변조 불가능한 원장
  2. 누가 무엇을 누구에게 주었는지 원장에 기록한다.
  3. '무엇'이 바로 흔히 말하는 NFT가 된다.
  4. 블록체인 네트워크에 파일을 업로드하기에는 용량이 크니 uri를 기록한다.

소스에서 핵심적인 내용들만 간단하게 정리해보려 한다.
GIT주소 : https://github.com/hyperledger/fabric-samples/tree/main/token-erc-721
이전에 설정한 wls2환경에서 예제를 실행할 수 있다. 궁금한 내용은 README.md에 상세하게 설명되어 있다.

// erc721.go
package chaincode

// Define structs to be used by chaincode
type Nft struct {
	TokenId  string `json:"tokenId"`
	Owner    string `json:"owner"`
	TokenURI string `json:"tokenURI"`
	Approved string `json:"approved"`
}

type Approval struct {
	Owner    string `json:"owner"`
	Operator string `json:"operator"`
	Approved bool   `json:"approved"`
}

type Transfer struct {
	From    string `json:"from"`
	To      string `json:"to"`
	TokenId string `json:"tokenId"`
}
/*
	sturct를 보면 nft가 무엇이고 예제에서 무엇을 할 수 있는지 유추할 수 있다.
    1. Nft
    Nft는 무엇(TokenId)이 어디(TokenURI)에 저장되어 있고 소유자가 누구(Owner)인지 알수 있다.
    
    2. Approval
    소유자뿐만 아니라 제 3자가 승인을 받는다면 전송을 할 수 있다.
    
    3. Transfer
    Nft 소유권 전송이력이 기록된다. 전송이력을 거슬러 올라가면 민팅한 사람이 누군지 나올 것이다.
*/

그 다음 EIP에서 실제 solidity 인터페이스를 살펴보았다.

초록을 보면 개인이 소유하고 전송하는 것에 더해 위탁판매가 가능하다는 것을 명시하고 있다.

여기서 가장 중요한 것은 ERC721과 ERC165 인터페이스를 구현해야 한다고 말한다. ERC165는 어떤 표준을 구현한 것인지 확인해주는 인터페이스다.

pragma solidity ^0.4.20;

interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}


하나의 함수만 있고, 특정 contract의 모든 함수 시그니처를 XOR 연산을 통해 확인한다고 알려준다.

EIP721에 정의된 함수는 아래와 같다. 기능을 이해하는데에는 함수 시그니처만 봐도 이해될 것 같아서 상세 주석들은 삭제했다.

pragma solidity ^0.4.20;

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 */ {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

쉽게 이해하자면
NFT는 NFT 기능과 관련한 EIP721과 contract가 올바르게 EIP721를 구현하는지 확인하는 EIP165를 구현한 기능의 집합이다.

EIP들 확인하기
https://eips.ethereum.org/EIPS/eip-721
https://eips.ethereum.org/EIPS/eip-165

profile
청포도루이보스민트티

0개의 댓글