(9)ERC721详细介绍

server/2025/1/18 12:52:00/

ERC721 是以太坊上的一种非同质化代币(NFT,Non-Fungible Token)标准,由 William Entriken、Dieter Shirley、Jacob Evans 和 Nastassia Sachs 在 2018 年提出。与 ERC20 代币不同,ERC721 代币是独一无二的,每个代币都有唯一的标识符(Token ID),因此适用于表示独一无二的资产,如数字艺术品、收藏品、游戏道具等。


ERC721__4">ERC721 标准的完整定义

ERC721 标准定义了 NFT 合约必须实现的最小接口,包括函数和事件。以下是 ERC721 标准的详细内容。


1. 必须实现的函数

ERC721 标准规定了以下 9 个必须实现的函数

1.1 balanceOf
  • 功能: 返回指定地址拥有的 NFT 数量。
  • 函数签名:
    solidity">function balanceOf(address owner) external view returns (uint256);
    
1.2 ownerOf
  • 功能: 返回指定 tokenId 的所有者地址。
  • 函数签名:
    solidity">function ownerOf(uint256 tokenId) external view returns (address);
    
1.3 safeTransferFrom
  • 功能: 将 NFT 从当前所有者转移到另一个地址。如果目标地址是合约,则必须实现 onERC721Received 函数。
  • 函数签名:
    solidity">function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
    
1.4 transferFrom
  • 功能: 将 NFT 从当前所有者转移到另一个地址。不检查目标地址是否是合约。
  • 函数签名:
    solidity">function transferFrom(address from, address to, uint256 tokenId) external;
    
1.5 approve
  • 功能: 授权另一个地址(approved)管理指定的 tokenId
  • 函数签名:
    solidity">function approve(address approved, uint256 tokenId) external;
    
1.6 setApprovalForAll
  • 功能: 授权或取消授权另一个地址(operator)管理调用者所有的 NFT。
  • 函数签名:
    solidity">function setApprovalForAll(address operator, bool approved) external;
    
1.7 getApproved
  • 功能: 返回被授权管理指定 tokenId 的地址。
  • 函数签名:
    solidity">function getApproved(uint256 tokenId) external view returns (address);
    
1.8 isApprovedForAll
  • 功能: 检查 operator 是否被授权管理 owner 的所有 NFT。
  • 函数签名:
    solidity">function isApprovedForAll(address owner, address operator) external view returns (bool);
    
ERC721Received_70">1.9 onERC721Received
  • 功能: 当 NFT 被转移到合约地址时,目标合约必须实现此函数以接收 NFT。
  • 函数签名:
    solidity">function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
    

2. 必须实现的事件

ERC721 标准规定了以下 3 个必须实现的事件

2.1 Transfer
  • 触发条件: 当 NFT 的所有权从一个地址转移到另一个地址时触发。
  • 事件签名:
    solidity">event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    
2.2 Approval
  • 触发条件: 当某个地址被授权管理指定的 tokenId 时触发。
  • 事件签名:
    solidity">event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    
2.3 ApprovalForAll
  • 触发条件: 当 owner 授权或取消授权 operator 管理其所有 NFT 时触发。
  • 事件签名:
    solidity">event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    

3. 可选的功能

除了必须实现的函数和事件外,ERC721 标准还建议实现以下 可选功能

3.1 name
  • 功能: 返回 NFT 集合的名称(例如 “MyNFT”)。
  • 函数签名:
    solidity">function name() external view returns (string memory);
    
3.2 symbol
  • 功能: 返回 NFT 集合的符号(例如 “MNFT”)。
  • 函数签名:
    solidity">function symbol() external view returns (string memory);
    
3.3 tokenURI
  • 功能: 返回指定 tokenId 的元数据 URI(通常是 JSON 文件链接)。
  • 函数签名:
    solidity">function tokenURI(uint256 tokenId) external view returns (string memory);
    

ERC721__133">4. 完整的 ERC721 实现示例

以下是一个简单的 ERC721 代币实现示例:

solidity">// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";contract MyNFT is ERC721 {using Counters for Counters.Counter;Counters.Counter private _tokenIds;constructor() ERC721("MyNFT", "MNFT") {}function mint(address to) public returns (uint256) {_tokenIds.increment();uint256 newTokenId = _tokenIds.current();_mint(to, newTokenId);return newTokenId;}function tokenURI(uint256 tokenId) public view override returns (string memory) {require(_exists(tokenId), "Token does not exist");return string(abi.encodePacked("https://mynft.com/token/", Strings.toString(tokenId)));}
}

ERC721__166">5. ERC721 的重要注意事项

  1. 唯一性:

    • 每个 tokenId 必须是唯一的,不能重复。
  2. 元数据:

    • tokenURI 返回的元数据通常是一个 JSON 文件链接,包含 NFT 的名称、描述、图像等信息。
  3. 安全转账:

    • 使用 safeTransferFrom 时,如果目标地址是合约,则必须实现 onERC721Received 函数,否则转账会失败。
  4. 授权管理:

    • approve 用于授权单个 NFT,而 setApprovalForAll 用于授权所有 NFT。
  5. Gas 费用:

    • NFT 的转账和授权操作可能会消耗较多的 Gas,尤其是在链上存储大量元数据时。

6. 总结

ERC721 标准是以太坊上用于非同质化代币(NFT)的核心标准,适用于表示独一无二的资产。通过实现 ERC721 标准,开发者可以创建与其他以太坊应用程序(如钱包、市场和游戏)兼容的 NFT。完整的 ERC721 实现不仅包括必须实现的函数和事件,还应遵循最佳实践,确保 NFT 的安全性和互操作性。


http://www.ppmy.cn/server/159355.html

相关文章

2025-1-15-十大经典排序算法 C++与python

文章目录 十大经典排序算法比较排序1. 冒泡排序2. 选择排序3. 插入排序4. 希尔排序5. 归并排序6. 快速排序7. 堆排序 非比较排序8. 计数排序9. 桶排序10. 基数排序 十大经典排序算法 十大经典排序算法可以分为比较排序和非比较排序: 前者包括冒泡排序、选择排序、插入排序、希…

文件上传 分片上传

分片上传则是将一个大文件分割成多个小块分别上传,最后再由服务器合并成完整的文件。这种做法的好处是可以并行处理多个小文件,提高上传效率;同时,如果某一部分上传失败,只需要重传这一部分,不影响其他部分…

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说,如果在电脑上新建了一个空白文档&#xff0…

React进阶之react.js、jsx模板语法及babel编译

React React介绍React官网初识React学习MVCMVVM JSX外部的元素props和内部的状态statepropsstate 生命周期constructorgetDerivedStateFromPropsrendercomponentDidMount()shouldComponentUpdategetSnapshotBeforeUpdate(prevProps, prevState) 创建项目CRA:create-…

Python在多个Excel文件中找出缺失数据行数多的文件

本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件内、某一列数据的特征,对其加以筛选,并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法。 首先,我们来明确一下本…

学习AI大模型的小白入门建议和具体的学习方法推荐

深度思考我是一名在汽车行业工作的嵌入式系统工程师,现在我想进入人工智能领域,特别是大型语言模型。说到人工智能,我是一个完全的新手,所以我需要弄清楚从哪里开始。让我们把它分解一下。 首先,我知道嵌入式系统涉及许多低级编程、微控制器、实时操作系统等。人工智能,…

Open FPV VTX开源之ardupilot配置

Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…

uniapp小程序开发,配置开启小程序右上角三点的分享功能

直接全局配置一个分享的功能,要不然需要一个一个页面去单独配置就太麻烦了!!! 1.新建一个share.js文件,并配置代码,调用onShareMessage()和onShareTimeline()两个函数。 其中: title&#xff1…