본문 바로가기
Blockchain/Ethereum

[Ethereum] ERC-721 소스 분석(3) - 메타 데이터

by AustinProd 2022. 3. 25.

ERC-721 메타 데이터 인터페이스

ERC-721 메타 데이터는 토큰 이름 및 토큰 상세 정보를 제공한다. ERC-721 컨트렉트를 구현할 때 필요에 따라 선택적으로 구현한다.

 

메타 데이터 인터페이스에서 제공하는 데이터

 

  • 토큰 이름 : ERC-721 토큰 풀 네임
  • 토큰 심볼 : ERC-721 토큰 약어
  • 토큰 URI : ERC-721 토큰 이미지 및 상세 정보를 불러오는 URI 주소

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// [Optional] ERC-721 메타 데이터 인터페이스
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
interface ERC721Metadata {

  // 토큰 '이름' 반환
  function name() external view returns (string memory _name);

  // 토큰 '심볼' 반환
  function symbol() external view returns (string memory _symbol);

  // 토큰 'URI' 반환 (URI는 RFC3986 규칙에 맞춰 선언되어 있음)
  //	-> URI는 해당 ERC-721 토큰 메타 데이터를 담고 있는 JSON 파일 경로를 가리킨다.
  function tokenURI(uint256 _tokenId) external view returns (string memory);
}

 

ERC-721 메타 데이터 JSON 스키마

아래 JSON 데이터는 ERC-721 URI을 읽어 토큰 메타 데이터를 불러왔을 때 반환되는 데이터 샘플이다. 토큰 이름, 설명, 이미지 등 컨트렉트에 담지 못한 상세 정보를 외부에 저장해주고 URI를 통해 불러온다.

 

{
    "title": "Asset Metadata",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "description": "Identifies the asset to which this NFT represents"
        },
        "description": {
            "type": "string",
            "description": "Describes the asset to which this NFT represents"
        },
        "image": {
            "type": "string",
            "description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive."
        }
    }
}

 

ERC-721 메타 데이터 컨트렉트

메타 데이터 인터페이스를 구현하여 작성한 메타 데이터 컨트렉트 예제 코드다. 토큰 이름, 심폴, URI를 읽어오는 getter 함수가 선언되어 있으며, 토큰 URI를 수정하거나 삭제하는 내부 함수(Internal)가 구현되어 있다.

 

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Import
import "./NFToken.sol"; // 토큰 컨트렉트
import "./ERC721Metadata.sol"; // 토큰 메타 데이터 인터페이스

// [Optional] 토큰 컨트렉트에 대한 메타 데이터
contract NFTokenMetadata is NFToken, ERC721Metadata {

  // 토큰 이름
  string internal nftName;

  // 토큰 심볼
  string internal nftSymbol;

  // [매핑] 토큰 ID -> 메타 데이터 URI
  mapping (uint256 => string) internal idToUri;

  // 메타 데이터 컨트렉트를 구현할 때, 토큰 이름과 심볼 설정 필수
  constructor() {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata 인터페이스
  }

  // 토큰 '이름' 반환
  function name() external override view returns (string memory _name) {
    _name = nftName;
  }

  // 토큰 '심볼' 반환
  function symbol() external override view returns (string memory _symbol) {
    _symbol = nftSymbol;
  }

  // 토큰 'URI' 반환 (RFC 3986 형식에 따름)
  function tokenURI(uint256 _tokenId) external override view validNFToken(_tokenId) returns (string memory) {
    return _tokenURI(_tokenId);
  }

  // [Internal] 토큰 'URI' 반환
  function _tokenURI(uint256 _tokenId) internal virtual view returns (string memory) {
    return idToUri[_tokenId];
  }

  // [Internal] 토큰 소각 -> 매핑된 토큰 URI 데이터 삭제
  function _burn(uint256 _tokenId) internal override virtual {
    super._burn(_tokenId); // 토큰 소각(상속 받은 토큰 컨트렉트에서 함수 호출)

    delete idToUri[_tokenId]; // 토큰 URI 삭제
  }

  // [Internal] 토큰 'URI' 설정 (RFC 3986 형식에 따름)
  function _setTokenUri(uint256 _tokenId, string memory _uri) internal validNFToken(_tokenId) {
    idToUri[_tokenId] = _uri;
  }
}

 

댓글