ERC-721协议发行的货币是非同质化代币,以前搞ICO发的货币,是使用ERC-20发的区块链货币、同质化货币。
2.
ERC-721只是NFT稚嫩合约必须实现的最小接口,它包括代币管理、持有和交易功能。然而它并不包括代币元数据的相关内容,也缺少对一些实用的功能支持。也就是说,单纯的ERC-721上面只记录了一个TOKENID(NFT编号)的归属者,并不具体指明这个TOKENID所指向的物品是个什么东西,它的内容是什么,元数据是什么。一般的NFT合约都要加上其它功能。
因此常用的组合为:
ERC721标准+ IERC721Enumerable + IERC721Metadata,再加上自定义的mintable。
IERC721标准的合约方法:
balanceOf(): 返回由_owner 持有的NFTs的数量。
ownerOf(): 返回tokenId代币持有者的地址。
approve(): 授予地址_to具有_tokenId的控制权,方法成功后需触发Approval 事件。
setApprovalForAll(): 授予地址_operator具有所有NFTs的控制权,成功后需触发ApprovalForAll事件。
getApproved()、isApprovedForAll(): 用来查询授权。
safeTransferFrom(): 安全转移NFT所有权,一次成功的转移操作必须发起 Transer 事件。
transferFrom(): 用来转移NFTs, 方法成功后需触发Transfer事件。调用者自己确认_to地址能正常接收NFT,否则将丢失此NFT。此函数实现时需要检查上面条件的前4条。
approve()和 transferFrom()的意义是什么?
approve()是授权控制权,比如A要卖它的NFT给C,他可以通过transferFrom(from:A,to:C)函数来执行。但是A一般比较忙,他只负责创作NFT,不想参与销售相关,他就可以可以先把这个NFT的控制权使用approve()函数交给B,这样B就可以转给C了。
可选接口IERC721Enumerable的主要合约方法:
totalSupply(): 返回NFT总量
tokenByIndex(): 通过索引返回对应的tokenId,比如获取NFT列表中第五个位置的NFT编号,如果是顺序编号,那tokenld也是5,但是tokenid得是一个uint265标识。
tokenOfOwnerByIndex(): 所有者可以一次拥有多个的NFT, 此函数返回_owner拥有的NFT列表中对应索引的tokenId。
可选接口ERC721Metadata的主要合约方法:
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.”,
}
}
}
奇怪的是,ERC-721里面并没有给出铸币的函数!,铸币方法难道不是必须的吗?必须的为什么不写到接口里边呢?搞不懂了。IERC-720也没有铸币的方法,可能是太简单了。
那么该如何铸币呢?
好像需要自己实现。
一个简单的铸币函数:如何创建 ERC-721 NFT?
openzepplin是以太坊开发者的宝库,OpenZeppelin代码库包含了经过社区审查的ERC代币标准、安全协议以及很多的辅助工具库,这些代码可以帮助开发者专注业务逻辑的,而无需重新发明轮子。它提供了 ERC20 和 ERC721 等ERC标准的实现。
一个完整合约的实现,基于openzepplin的。来自于崔棉大师,讲得非常好。bilibili无敌!
花式发币法21-发行NFT非同质化虚拟货币
openzepplin提供了IERC(I指的是接口),ERC721Metadata,IERC721Enumerable。
在21:50,可以看到,铸币的方法。
这个铸币并没有涉及到NFT的URL?
答:在27:12处有设置URI的。
参考:剖析非同质化代币ERC721-全面解析ERC721标准
全面理解ERC721的实现机制