Skip to main content

Week10-NFT 标准

近两年NFT,元宇宙发展如火如荼,那么到底什么是NFT ? NFT 又称非同质化代币,核心特性是每个代币都是独一无二的,跟其他代币是不相同的。在以太坊标准里 NFT 是通过一系列 EIP 来定义的,本周来带领大家了解一下主流的标准

Day1 - ERC721

ERC-721 是最早的 NFT 标准, 早期 CryptoKitties 等项目均采用该标准。与 20 代币最大的区别是:每个 token 都有唯一的 ID,且 token 不可进行拆分

其核心接口如下:

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 是另外一个采用较多的标准, 该标准 与 ERC20 的区别是,在一个合约中可以同时包含多个 token,与 ERC721 的区别在于,每个 tokenId 的数量,可以不止有一个。

另外 ERC1155 支持批量操作,比如批量转账,批量mint,批量查询余额

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 主要用于实现 NFT 版税功能,可以实现在 NFT 每次转移时,支付一定收益给 NFT 的创造者或者版权所有者。该标准适用于 ERC721 或 ERC1155 token.

该标准主要包含一个方法 royaltyInfo 用于确认某 tokenId 在某售价情况下,应该给谁支付多少的版税:

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 综述 - 孟岩

Day5 ERC3525 半匀质化通证代币

这是一个通用标准,适用面非常广阔。它可以把多个相似但并不相同的通证识别为“同类”,然后允许同类之间进行相互转账等特殊操作。从效果上,相当于同类之间可以进行合并、拆分、碎片化等数学操作

直截了当地解释 ERC-3525 与 ERC-1155 的差别 - 孟岩

概览

除此之外 NFT 相关的 标准还有很多,NFT 协议全览:标准协议、流动性协议和跨链协议 对他们进行了全面的梳理和总结