ERC721 官方简介是:A standard interface for non-fungible tokens, also known as deeds.也叫非同质代币,或者不可置换代币(NFTs)。提到 ERC721,一个好理解的例子就是CryptoKitties 迷恋猫,每一只猫都是独一无二的拥有不同基因,有收藏价值属性。ERC721 对于虚拟资产收藏品领域会有很好的应用价值和市场需求。
它和我写的上一篇《OpenZeppelin ERC20 源码分析》介绍的 ERC20 有所不同,ERC721 最小的单位为 1 无法再分割,代表独一无二的,针对不可置换的 Token 的智能合约标准接口。从 ERC721 标准草案中可以看到,兼容 ERC20 的方法有 4 个:name,symbol,totalSupply,balanceOf 添加的新方法:ownerOf,takeOwnership ERC721 还重写了approve和transfer。
分析 OpenZeppelin ERC721 源码前同样我画了一个继承和调用关系的思维导图,可以帮助更容易地看源码。
ERC721Basic.sol pragma solidity ^0.4.23; /** * @title ERC721 标准的基本接口 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic { 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) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns (address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public; } ERC721Basic 合约定义了基本的接口方法:
阅读全文