# ERC721 **Published by:** [un.Block](https://paragraph.com/@un-block/) **Published on:** 2021-10-09 **URL:** https://paragraph.com/@un-block/erc721 ## Content NFT 背后的技术是 ERC721 或 ERC1155, 今天我们就来学习一下 ERC721 的开发,说不定过两周 un.Block 就有自己的 NFT 了NFT 的组成首先,在 ERC721 的合约中,每个 NFT 都有以下内容name: 代币名字symbol: 代币符号tokenID: 代币编号URI: NFT元数据其中,元数据是 NFT 最重要的部分,它直接决定了 NFT 里面存放的内容。对于一些图片类的 NFT ,元数据通常都会存放图片的链接字符串,这个链接可能是中心化网站的链接(就像我们日常用的图床链接一样),或者是 ipfs 链接。 实际上,元数据可以存放的不只有字符串,以下是在 EIP-721 中给出的元数据示例: 关于 NFT 元数据的存储问题,在之前的周报 #12#13 已经解释过了,大家有兴趣可以自行阅读。 漫游 ERC721 EIP-721 给了关于 ERC721 的 3 个接口,分别是:IERC721: 核心 ERC721IERC721Metadata: ERC721 元数据IERC721Enumerable: 关于 ERC721 的供应量、序号之类的数字接口其中,IERC721 是唯一必须实现的接口,但这个接口过于简单,几乎没有项目会只实现一个 IERC721 就发布。 因此,我们将和大家分享多一些关于 ERC721 实用接口。 除了上述的 3 个接口之外,还有以下功能可以让 ERC721 锦上添花:ERC721Pausable: 暂停 ERC721 代币交易ERC721Burnable: 摧毁代币!AccessControl: 合约权限管理OpenZepplin 给出了一个功能较为完善的 ERC721 合约范例 —— ERC721PresetMinterPauserAutoId 这个范例能在 ERC721 的基础上实现以下功能:允许用户摧毁掉自己的代币一个铸造者 (minter) 角色来负责铸造代币一个交易管理员角色 (pauser),有权暂停代币转账自动生成代币编号(tokenID) 和 元数据 (URI)ERC721: 元数据与铸币 ERC721 在某些功能,如查询余额、授权、转账,与 ERC20 如出一辙(我们在 #9 跟大家介绍过 ERC20),值得深入了解的就是 ERC721 的元数据与铸币过程 1⃣️元数据以 mapping 的形式存储1⃣️ 通过 _setTokenURI 函数,我们可以设置 URI,这里需要传入 tokenID 和 URI元数据3⃣️ ERC721 的 _mint 函数和 ERC20 很相似,本质就是将代币分发给用户,由于 tokenID 代表了 NFT 代币,因此调用 mint 函数的时候只需要指定用户和 tokenID 即可值得一提的是,OpenZepplin 并不推荐我们直接使用 _mint,而是推荐使用 _safeMint 来铸造代币 _safeMint 会在铸造前进行检查,要求如下:tokenID 需要不存在,可以理解为这个 tokenID 对应的 NFT 还没有被铸造收款地址需要有接受 ERC721 代币的能力,这个检查主要是针对为了合约接收代币相关阅读:How to create and deploy an ERC-721 (NFT)ERC-721 NON-FUNGIBLE TOKEN STANDARD ## Publication Information - [un.Block](https://paragraph.com/@un-block/): Publication homepage - [All Posts](https://paragraph.com/@un-block/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@un-block): Subscribe to updates