摘要:本文就来剖析下什么是是什么在创建代币一篇,我们讲到过代币,和一样,同样是一个代币标准,官方简要解释是,简写为,多翻译为非同质代币。返回合约代币符号,尽管是可选,但强烈建议实现,即便是返回空字符串。
本文首发于深入浅出区块链社区
原文链接:剖析非同质化代币ERC721-全面解析ERC721标准原文已更新,请读者前往原文阅读
什么是ERC-721?现在我们看到的各种加密猫猫狗狗都是基于ERC-721创造出来的,每只都是一个独一无二的ERC-721代币,不过ERC-721在区块链世界远不止猫猫狗狗,它更大的想象空间在于将物理世界的资产映射到区块链上。本文就来剖析下什么是ERC721.
ERC721是什么在创建代币一篇,我们讲到过ERC20代币,
和ERC20一样,ERC721同样是一个代币标准,ERC721官方简要解释是Non-Fungible Tokens,简写为NFTs,多翻译为非同质代币。
ERC721 是由Dieter Shirley 在2017年9月提出。Dieter Shirley 正是谜恋猫CryptoKitties背后的公司Axiom Zen的技术总监。因此谜恋猫也是第一个实现了ERC721 标准的去中心化应用。ERC721号提议已经被以太坊作为标准接受,但该标准仍处于草稿阶段。本文介绍的ERC721标准基于最新(2018/03/23官方提议。
那怎么理解非同质代币呢?
非同质代表独一无二,谜恋猫为例,每只猫都被赋予拥有基因,是独一无二的(一只猫就是一个NFTs),猫之间是不能置换的。这种独特性使得某些稀有猫具有收藏价值,也因此受到追捧。
ERC20代币是可置换的,且可细分为N份(1 = 10 * 0.1), 而ERC721的Token最小的单位为1,无法再分割。
如果同一个集合的两个物品具有不同的特征,这两个物品是非同质的,而同质是某个部分或数量可以被另一个同等部分或数量所代替。
非同质性其实广泛存在于我们的生活中,如图书馆的每一本,宠物商店的每一只宠物,歌手所演唱的歌曲,花店里不同的花等等,因此ERC721合约必定有广泛的应用场景。通过这样一个标准,也可建立跨功能的NFTs管理和销售平台(就像有支持ERC20的交易所和钱包一样),使生态更加强大。
ERC721标准ERC721最为一个合约标准,提供了在实现ERC721代币时必须要遵守的协议,要求每个ERC721标准合约需要实现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条。
ERC165 标准ERC721标准同时要求必须符合ERC165标准 ,其接口如下:
interface ERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool); }
ERC165同样是一个合约标准,这个标准要求合约提供其实现了哪些接口,这样再与合约进行交互的时候可以先调用此接口进行查询。
interfaceID为函数选择器,计算方式有两种,如:bytes4(keccak256("supportsInterface(bytes4)"));或ERC165.supportsInterface.selector,多个函数的接口ID为函数选择器的异或值。
关于ERC165,这里不深入介绍,有兴趣的同学可以阅读官方提案。
ERC721Metadata 接口用于提供合约的元数据:name , symbol 及 URI(NFT所对应的资源)。
其接口定义如下:
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.", } } }
tokenURI通常是被web3调用,以便在应用层做相应的查询和展示。
可选实现接口:ERC721EnumerableERC721Enumerable的主要目的是提高合约中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。
补充说明 NTF IDsNTF ID,即tokenId,在合约中用唯一的uint265进行标识,每个NFT的ID在智能合约的生命周期内不允许改变。推荐的实现方式有:
从0开始,每新加一个NFT,NTF ID加1
使用sha3后uuid 转换为 NTF ID
与ERC-20的兼容性ERC721标准尽可能遵循 ERC-20 的语义,但由于同质代币与非同质代币之间的根本差异,并不能完全兼容ERC-20。
交易、挖矿、销毁在实现transter相关接口时除了满足上面的的条件外,我们可以根据需要添加自己的逻辑,如加入黑名单等。
同时挖矿、销毁尽管不是标准的一部分,我们可以根据需要实现。
参考实现为订阅用户专有福利,请订阅我的小专栏:区块链技术查看。
EIPS-165
EIPS-721
☛ 深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。
☛ 我的知识星球为各位解答区块链技术问题,欢迎加入讨论。
☛ 关注公众号“深入浅出区块链技术”第一时间获取区块链技术信息。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24089.html
摘要:它和我写的上一篇源码分析介绍的有所不同,最小的单位为无法再分割,代表独一无二的,针对不可置换的的智能合约标准接口。源码分析到这里就结束了。 ERC721 官方简介是:A standard interface for non-fungible tokens, also known as deeds.也叫非同质代币,或者不可置换代币(NFTs)。提到ERC721,一个好理解的例子就是Cry...
摘要:从这节开始,我们将学习代币标准以及加密收集资产等知识。声明一个继承的新合约,命名为。注意目前是一个草稿,还没有正式商定的实现。所以把这一个可能的实现当作考虑,但不要把它作为代币的官方标准。 从这节开始,我们将学习代币, ERC721标准, 以及加密收集资产等知识。 一、代币 代币 让我们来聊聊以太坊上的代币。 如果你对以太坊的世界有一些了解,你很可能听过人们聊到代币——尤其是 ERC2...
摘要:目前市面上,凡是基于以太坊的令牌,在交易所上线交易的均是令牌,那么今天我们就来聊聊令牌的标准方案吧。 0x00 写在前面 众所周知,以太坊在现阶段最大的应用就是令牌发行,而在以太坊中有很多类型的令牌,最著名的当属ERC20了,但是对于其他几种令牌类型,可能还有一些朋友不知道,所以最近规划了一个系列,就是以太坊标准令牌系列。 目前市面上,凡是基于以太坊的令牌,在交易所上线交易的均是ERC...
摘要:是企业与区块链相遇的地方。的框架旨在成为开发区块链解决方案的支柱。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 如果你想将区块链合并到一个Java项目中,现在我们来看看就是这个细分领域中三个最大的OSS玩家。 好的伙计们,我们都听说过比特币,以太坊或其他加密货币,其中有一些时髦的名字围绕着我们常见的新闻,但我们作为Java开发人员知道如何轻松地与这些区块链技术进行交互吗?以...
阅读 1633·2021-09-22 10:02
阅读 1895·2021-09-02 15:40
阅读 2821·2019-08-30 15:55
阅读 2206·2019-08-30 15:44
阅读 3571·2019-08-30 13:18
阅读 3203·2019-08-30 11:00
阅读 1914·2019-08-29 16:57
阅读 536·2019-08-29 16:41