区块链学习第十一期

myBlog

Contracts解读

[toc] ---

ERC721 导读

什么是 ERC721

Non-Fungible Tokens 非同质化代币

非同质代表独一无二,谜恋猫为例,每只猫都被赋予拥有基因,是独一无二的(一只猫就是一个 NFTs),猫之间是不能置换的。这种独特性使得某些稀有猫具有收藏价值,也因此受到追捧。

ERC20 代币是可置换的,且可细分为 N 份(1 = 10 * 0.1), 而 ERC721 的 Token 最小的单位为 1,无法再分割。

如果同一个集合的两个物品具有不同的特征,这两个物品是非同质的,而同质是某个部分或数量可以被另一个同等部分或数量所代替。

有哪些特点

非同质代币(NFT)是一种具有唯一性识别的代币 ,ERC-20 Token 可以无限细分为 10^18 份,而 ERC721 的 Token 最小的单位为 1,无法再分割
由于 ERC721 代币具有唯一性,不可分割的特点,所以很容易和一些具体的物品关联起来

有哪些方法

具体方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 name() external pure returns (string _name);
function symbol() external pure returns (string _symbol);
function tokenURI(uint256 _tokenId) external view returns (string)

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);
}

方法解释

  1. balanceOf(): 返回由_owner 持有的 NFTs 的数量。

  2. ownerOf(): 返回 tokenId 代币持有者的地址。

  3. approve(): 授予地址_to 具有_tokenId 的控制权,方法成功后需触发 Approval 事件。

  4. setApprovalForAll(): 授予地址_operator 具有所有 NFTs 的控制权,成功后需触发 ApprovalForAll 事件。

  5. getApproved()、isApprovedForAll(): 用来查询授权。

  6. safeTransferFrom(): 转移 NFT 所有权,一次成功的转移操作必须发起 Transer 事件。函数的实现需要做一下几种检查:

    • 调用者 msg.sender 应该是当前 tokenId 的所有者或被授权的地址
    • _from 必须是 _tokenId 的所有者
    • _tokenId 应该是当前合约正在监测的 NFTs 中的任何一个
    • _to 地址不应该为 0
    • 如果_to 是一个合约应该调用其 onERC721Received 方法, 并且检查其返回值,如果返回值不为 bytes4(keccak256(“onERC721Received(address,uint256,bytes)”))抛出异常。
  7. transferFrom(): 用来转移 NFTs, 方法成功后需触发 Transfer 事件。调用者自己确认_to 地址能正常接收 NFT,否则将丢失此 NFT。此函数实现时需要检查上面条件的前 4 条。

  8. name(): 返回合约名字,尽管是可选,但强烈建议实现,即便是返回空字符串。

  9. symbol(): 返回合约代币符号,尽管是可选,但强烈建议实现,即便是返回空字符串。

  10. tokenURI(): 返回_tokenId 所对应的外部资源文件的 URI(通常是 IPFS 或 HTTP(S)路径)。外部资源文件需要包含名字、描述、图片,其格式的要求如下:

补充说明

NTF IDs
NTF ID,即 tokenId,在合约中用唯一的 uint265 进行标识,每个 NFT 的 ID 在智能合约的生命周期内不允许改变。推荐的实现方式有:

  • 从 0 开始,每新加一个 NFT,NTF ID 加 1
  • 使用 sha3 后 uuid 转换为 NTF ID