ERC-721 文檔翻譯(上)

前言

在之前的2篇文章中,已經講了一些關于ERC-721的基本概念,適用范圍,以及ERC-721與ERC-20的區別。本文是針對ERC-721 NFTS (Non-Fungible Tokens)標準的翻譯,將會更加詳細與準確,由于文章篇幅較長,所以分為上、下2部分來講解。由于本人水平有限,如有錯誤,歡迎大家指正。

原文鏈接https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md

簡介(Simple Summary)

ERC-721是對于不可互換Token的一個標準接口,也稱為契約

摘要(Abstract)

以下標準將允許在智能合約中去實現NFTs的標準API。這些標準提供了一些基本的函數去追蹤和交易NFTs。

我們考慮了以下2種使用案例,NFTs由個人擁有和交易以及向第三方經紀人/錢包/運營商托運。NFTs可以代表數字或者物理資產的所有權。我們考慮了各種各樣的資產,并且我們知道你會想象的更多:

  • 物理資產 — 獨特的藝術品等
  • 虛擬收藏品 — 比如,之前很火的以太坊加密貓,可收藏的卡片等
  • 負資產 — 借貸,負擔或其它責任

一般來說,所有的房子都是獨特的,沒有2只貓是一樣的。NFTs是可區分的,并且你必須單獨追蹤每一個的所有權。

動機(Motivation)

標準接口允許錢包/經紀人/拍賣應用程序在以太坊的任何NFT上運行。我們提供了簡單的ERC-721 智能合約以及追蹤任意數量NFT的合約。其它的應用程序會在后面討論。

ERC-721標準是受ERC-20 token 標準和EIP-20被創造2年來的經驗的啟發。EIP-20不足以追蹤NFTs,因為每個資產都是不同的(不可置換的),然而每一個Token都是相同的(可置換的)。

這個標準和EIP-20的區別如下。

規范(Specification)

在本文檔中的關鍵字,"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL"將會按照RFC 2119中的描述進行解釋。

每個符合ERC-721標準的合約都必須實現ERC721 和 ERC165接口(受以下注意事項的限制)

pragma solidity ^0.4.20;

interface ERC721 /* is ERC165 */ {

    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _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);
}

接口說明:

balanceOf(): 返回由_owner 持有的NFTs的數量。
ownerOf(): 返回tokenId代幣持有者的地址。
approve(): 授予地址_to具有_tokenId的控制權,方法成功后需觸發Approval 事件。
setApprovalForAll(): 授予地址_operator具有所有NFTs的控制權,成功后需觸發ApprovalForAll事件。
getApproved()、isApprovedForAll(): 用來查詢授權。

safeTransferFrom(): 轉移NFT所有權,一次成功的轉移操作必須發起 Transer 事件。函數的實現需要做一下幾種檢查:

調用者msg.sender應該是當前tokenId的所有者或被授權的地址
_from 必須是 _tokenId的所有者
_tokenId 應該是當前合約正在監測的NFTs 中的任何一個
_to 地址不應該為 0
如果_to 是一個合約應該調用其onERC721Received方法, 并且檢查其返回值,如果返回值不為bytes4(keccak256("onERC721Received(address,uint256,bytes)"))拋出異常。
一個可接收NFT的合約必須實現ERC721TokenReceiver接口:

interface ERC721TokenReceiver {
    /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}

transferFrom(): 用來轉移NFTs, 方法成功后需觸發Transfer事件。調用者自己確認_to地址能正常接收NFT,否則將丟失此NFT。此函數實現時需要檢查上面條件的前4條。

對于ERC-721智能合約,元數據擴展(metadata extension)是可選項(參見下面的注意事項)。這可以讓你的智能合約被訊問其名稱以及有關您NFTs資產的詳細信息

interface ERC721Metadata /* is ERC721 */ {
    function name() external pure returns (string _name);
    function symbol() external pure returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

接口說明:

name(): 返回合約名字,盡管是可選,但強烈建議實現,即便是返回空字符串。
symbol(): 返回合約代幣符號,盡管是可選,但強烈建議實現,即便是返回空字符串。
tokenURI(): 返回_tokenId所對應的外部資源文件的URI(通常是IPFS或HTTP(S)路徑)。

外部資源文件需要包含名字、描述、圖片,其格式的要求如下:

{
    "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智能合約,枚舉擴展(enumeration extension)是可選的。這允許您的合約發布完整的NFTs列表并且使其可以被發現。主要目的是提高合約中NTF的可訪問性。

interface ERC721Enumerable /* is ERC721 */ {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

接口說明:
totalSupply(): 返回NFT總量
tokenByIndex(): 通過索引返回對應的tokenId。
tokenOfOwnerByIndex(): 所有者可以一次擁有多個的NFT, 此函數返回_owner擁有的NFT列表中對應索引的tokenId。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容