NFT是non-fungible tokens的缩写,与之对应的是可互换代币fungible tokens
NFT标准草案ERC721是可互换代币标准ERC20的扩展,了解ERC20有利于了解ERC721。
本文主要内容
- ERC20接口简介
- ERC721接口简介
ERC20
1 | function name() public view returns (string) |
- name()
代币名称,比如“人民币” - symbol()
代币符号,比如RMB - decimals()
代币小数位,代币都是以uint256表示的,小数位只影响显示 - totalSupply()
代币的发行总量 - balanceOf()
某人(某地址)拥有的代币数量 - transfer()
代币拥有者向某人(某地址)转若干代币 - transferFrom
代币拥有者的代理人,想某人(某地址)转若干代币。注意这里的代理人 - approve()
代币拥有者授权某人(某地址)为代理人,同时指定代理额度。 - allowance()
查询某代理人的剩余代理额度
所谓代理人,是代替代币拥有者进行操作的人,在ERC721也延续了这类接口。
ERC721
开始了解ERC721的时候,容易有两个疑问:
- approve是什么意思
- 为什么没有用来mint的接口
下面来试着解答这两个问题
Methods
1 | function balanceOf(address _owner) external view returns (uint256); |
Events
1 | event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); |
了解ERC20后,也就了解了ERC721中很多接口。如balanceOf
、Transfer 、
trasferFrom、
approve`等。
- balanceOf()
获取某人(某地址)拥有的所有NFT - ownerOf()
查看某NFT的拥有者 - transfer()
转移NFT - safeTransferFrom()
安全转移,会检查to、tokenId等参数的有效性 - approve()
NFT拥有者将某NFT授权给某代理人 - getApproved()
查询某NFT的代理人 - setApprovalForAll
撤销/指定某代理人的权限 - approveForAll()
NFT拥有者将自己所有NFT授权给某代理人
答案
现在,第1个问题很容易回答了,approve其实是在做授权操作,授权给代理人进行操作。
至于第2个问题,ERC721本身没有加入mint操作,需要在编写合约的时候按需加入。
比如cryptopunks项目,其“mint”函数是:
1 | function getPunk(uint punkIndex) { |
也就是通过调用该函数直接免费认领NFT
笔者写文章时,下图NFT价值两千三百多万美元,
早知今日,悔不当初,猛狗落泪……
在比如房产NFT otherside的mint函数,采用了白名单的方式
1 | function mintLands(uint256 numLands, bytes32[] calldata merkleProof) external whenPublicSaleActive nonReentrant { |
当然也可以采用和上述不同的方案,看合约需求而定。