# Week10-NFT 标准 近两年NFT,元宇宙发展如火如荼,那么到底什么是NFT ? NFT 又称非同质化代币,核心特性是每个代币都是独一无二的,跟其他代币是不相同的。在以太坊标准里 NFT 是通过一系列 EIP 来定义的,本周来带领大家了解一下主流的标准 ### Day1 - ERC721 [ERC-721](https://eips.ethereum.org/EIPS/eip-721) 是最早的 NFT 标准, 早期 CryptoKitties 等项目均采用该标准。与 20 代币最大的区别是:`每个 token 都有唯一的 ID,且 token 不可进行拆分`。 其核心接口如下: ```js interface ERC721 /* is ERC165 */ { // events event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); 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. transferFrom 2. safeTransferFrom 3. approve 4. setApprovalForAll 读接口则包含: 1. balanceOf 2. ownerOf 3. getApproved 4. isApprovedForAll 另外 ERC721 还有一些常用的扩展,包括: 1. metadata 扩展 2. 枚举扩展 3. 可暂停扩展 4. 可销毁扩展 ### Day2 ERC1155 [ERC1155](https://eips.ethereum.org/EIPS/eip-1155) 是另外一个采用较多的标准, 该标准 `与 ERC20` 的区别是,在一个合约中可以同时包含多个 token,与 ERC721 的区别在于,每个 tokenId 的数量,可以不止有一个。 另外 ERC1155 支持批量操作,比如批量转账,批量mint,批量查询余额 ```js interface ERC1155 /* is ERC165 */ { event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value); event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); event URI(string _value, uint256 indexed _id); function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external; function balanceOf(address _owner, uint256 _id) external view returns (uint256); function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); function setApprovalForAll(address _operator, bool _approved) external; function isApprovedForAll(address _owner, address _operator) external view returns (bool); } ``` ### Day3 ERC2981 [ERC2981](https://eips.ethereum.org/EIPS/eip-2981) 主要用于实现 NFT 版税功能,可以实现在 NFT 每次转移时,支付一定收益给 NFT 的创造者或者版权所有者。该标准适用于 ERC721 或 ERC1155 token. 该标准主要包含一个方法 `royaltyInfo` 用于确认某 tokenId 在某售价情况下,应该给谁支付多少的版税: ```js interface IERC2981 is IERC165 { function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view returns ( address receiver, uint256 royaltyAmount ); } ``` ### Day4 SBT 灵魂绑定代币 SBT 又称灵魂绑定 Token,简单来说可以理解为 不可转移 NFT。其应用场景包含:身份认证,投票, KYC 等 目前能够支持 SBT 的 EIP 提案,我们已经看到的有 EIP-4973、EIP-5114、ERC721S 等,还有 Solv Protocol 提出的 EIP-3525。 [SBT 综述 - 孟岩](https://mp.weixin.qq.com/s/wUIwwBFtCQ0cl5ZibND-PQ) ### Day5 ERC3525 半匀质化通证代币 这是一个通用标准,适用面非常广阔。它可以把多个相似但并不相同的通证识别为“同类”,然后允许同类之间进行相互转账等特殊操作。从效果上,相当于同类之间可以进行合并、拆分、碎片化等数学操作 [直截了当地解释 ERC-3525 与 ERC-1155 的差别 - 孟岩](https://mp.weixin.qq.com/s/gTqMz3E2kzAc8g3jWBDnow) ### 概览 除此之外 NFT 相关的 标准还有很多,[NFT 协议全览:标准协议、流动性协议和跨链协议](https://foresightnews.pro/article/detail/12944) 对他们进行了全面的梳理和总结