区块链学习第十一期
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 | interface ERC721 /* is ERC165 */ { |
方法解释
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)”))抛出异常。
transferFrom(): 用来转移 NFTs, 方法成功后需触发 Transfer 事件。调用者自己确认_to 地址能正常接收 NFT,否则将丢失此 NFT。此函数实现时需要检查上面条件的前 4 条。
name(): 返回合约名字,尽管是可选,但强烈建议实现,即便是返回空字符串。
symbol(): 返回合约代币符号,尽管是可选,但强烈建议实现,即便是返回空字符串。
tokenURI(): 返回_tokenId 所对应的外部资源文件的 URI(通常是 IPFS 或 HTTP(S)路径)。外部资源文件需要包含名字、描述、图片,其格式的要求如下:
补充说明
NTF IDs
NTF ID,即 tokenId,在合约中用唯一的 uint265 进行标识,每个 NFT 的 ID 在智能合约的生命周期内不允许改变。推荐的实现方式有:
- 从 0 开始,每新加一个 NFT,NTF ID 加 1
- 使用 sha3 后 uuid 转换为 NTF ID