ERC-721 文档翻译(上)

作者: 唠嗑008 | 来源:发表于2018-06-22 09:54 被阅读1次

前言

在之前的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。

相关文章

网友评论

    本文标题:ERC-721 文档翻译(上)

    本文链接:https://www.haomeiwen.com/subject/wsihyftx.html