区块链 | ERC721 标准

目录

正文

1  ERC721 接口

事件

方法

2  ERC165 接口

3  可选实现接口:ERC721Metadata

4  可选实现接口:ERC721Enumerable

补充说明

1  NTF IDs

2  与 ERC-20 的兼容性

3  交易、挖矿、销毁


🥕原文:剖析非同质化代币 ERC721 标准

🥕写在前面:本文属搬运博客,自己留存学习。

正文

ERC721 作为一个合约标准,提供了在实现 ERC721 代币时必须要遵守的协议,要求每个 ERC721 标准合约需要实现「ERC721」及「ERC165」接口。ERC721 标准的合约一旦被部署,它将负责跟踪在以太坊上创建的代币。

1  ERC721 接口

ERC721 的接口定义如下。

interface ERC721 {
    /// event
    /// function
}

事件

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);
  • Transfer 事件:当任何 NFT 的所有权通过任何机制发生变化时触发此事件。此事件在 NFT 被创建(from == 0)和销毁(to == 0)时触发。例外情况:在合约创建期间,可以创建并分配任意数量的 NFT 而不触发 Transfer 事件。在任何转移时,该 NFT 上的被授权地址将被重置为无。
  • Approval 事件:当 NFT 的被授权地址被更改或确立时触发此事件。零地址表示没有被授权地址。当 Transfer 事件被触发时,这也表示该 NFT 上的被授权地址被重置为无。
  • ApprovalForAll 事件:这个事件在操作员为某个所有者启用或禁用时触发。这个操作员可以管理所有者的所有 NFT 。 

方法

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);

接口说明:

  • balanceOf( ):返回 _owner 持有的 NFTs 的数量。
  • ownerOf( ):返回 _tokenId 对应代币的持有者的地址。
  • approve( ):授予地址 _to 具有 _tokenId 的控制权,方法成功后需触发 Approval 事件。
  • setApprovalForAll( ):授予地址 _operator 具有所有 NFTs 的控制权,成功后需触发 ApprovalForAll 事件。
  • getApproved( ), isApprovedForAll( ):用于查询授权。
  • safeTransferFrom( ):转移 NFT 所有权,一次成功的转移操作必须发起 Transer 事件。
  • transferFrom( ):用来转移 NFTs,方法成功后需触发 Transfer 事件。调用者自己确认 _to 地址能正常接收 NFT,否则将丢失此 NFT 。此函数实现时需要检查下面条件的前四条。

也就是说,transferFrom( ) 满足调用 safeTransferFrom( ) 的条件的前四条即可。

调用 safeTransferFrom( ) 的条件:

  1. 调用者 msg.sender 应该是当前 _tokenId 的所有者或被授权的地址;
  2. _from 必须是 _tokenId 的所有者;
  3. _tokenId 应该是当前合约正在监测的 NFTs 中的任何一个;
  4. _to 地址不应该为 0;
  5. 如果 _to 是一个合约,则应该调用它的 onERC721Received 方法,并且检查其返回值。如果返回值不为 bytes4(keccak256("onERC721Received(address,uint256,bytes)")),则抛出异常。

一个可接收 NFT 的合约必须实现 ERC721TokenReceiver 接口:

interface ERC721TokenReceiver {
    /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
    function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}

2  ERC165 接口

ERC165 的接口定义如下:

interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

ERC165 同样是一个合约标准,这个标准要求合约提供其实现了哪些接口,这样在与合约进行交互的时候可以先调用此接口进行查询。

interfaceID 为函数选择器,计算方式有两种,如:bytes4(keccak256('supportsInterface(bytes4)')); 或 ERC165.supportsInterface.selector,多个函数的接口 ID 为函数选择器的异或值。

就是说可以通过 ERC165 查询 ERC721 实现了哪些接口?

3  可选实现接口:ERC721Metadata

ERC721Metadata 接口用于提供合约的元数据:name,symbol 以及 URI,其接口定义如下:

interface ERC721Metadata {
    function name() external pure returns (string _name);
    function symbol() external pure returns (string _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string);
}

接口说明:

  • 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.",
        }
    }
}

采用的是 JSON 格式。

4  可选实现接口:ERC721Enumerable

ERC721Enumerable 的主要目的是提高合约中 NTF 的可访问性,其接口定义如下:

interface ERC721Enumerable {
    function totalSupply() external view returns (uint256);
    function tokenByIndex(uint256 _index) external view returns (uint256);
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}

接口说明:

  • totalSupply( ):返回 NFT 总量。
  • tokenByIndex( ):通过索引返回对应的 tokenId 。
  • tokenOfOwnerByIndex( ):所有者可以一次拥有多个的 NFT,此函数返回 _owner 拥有的 NFT 列表中对应索引的 tokenId 。

NFT 总量应该就是该 NFT 合约铸造的 NFT 代币的总量吧?

补充说明

1  NTF IDs

NTF 的 ID,即 tokenId,在合约中用唯一的 uint265 进行标识,每个 NFT 的 ID 在智能合约的生命周期内不允许改变。推荐的实现方式有:

  • 第一种:从 0 开始,每新加一个 NFT,NTF 的 ID 加 1 。
  • 第二种:使用 sha3 后 uuid 转换为 NTF 的 ID 。

2  与 ERC-20 的兼容性

ERC721 标准尽可能遵循 ERC-20 的语义,但由于同质代币与非同质代币之间的根本差异,并不能完全兼容 ERC-20 。

3  交易、挖矿、销毁

在实现 transter 相关接口时除了满足上面的的条件外,我们可以根据需要添加自己的逻辑,如加入黑名单等。同时挖矿、销毁尽管不是标准的一部分,我们可以根据需要实现。


官方:ERC-721: Non-Fungible Token Standard

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/572693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx 的漏洞改造

Nginx 的漏洞扫描有很多整改项 资源下载地址:https://download.csdn.net/download/wangzhi291/89216805 资源里面需要conf/modules 需要上传 然后docker镜像文件 配置按下面的修改就行了 整改方法为增加 ngx_http_headers_more_filter_module模块 include /usr…

贪吃蛇详解

Win32 API介绍: 在写贪吃蛇这款游戏时需要用到一些有关Win32 API的知识, 接下来我会将设计到的知识点列举并讲解: 首先我们先了解一下Win32 API是什么,Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外&am…

Unity射线实现碰撞检测(不需要rigbody组件)

使用physic.CapsulCast(); 前面3个参数生成一个胶囊体, 向着发射方向,发射出一串的胶囊(没有最大距离) 有最大距离,可以节约性能开销。 physic.CapsulCast(&#xff0…

类的六个构造函数相关干货

构造函数 特点 1.名字与类名相同 2.无返回值 3.对象实例化的时候编译器自动调用这个函数 4.构造函数可以重载(无参构造函数,拷贝构造等) 5.如果类中没有显式定义构造函数(深拷贝),则编译器会自动生成一个…

IP地址查询API接口怎么对接

IP地址查询API接口又叫IP归属地信息查询API接口,指的是根据IP地址查询归属地定位信息,包含国家、省、市、街道和运营商、区号、邮编、坐标等信息。那么IP地址查询API接口该怎么对接呢? 首先我们找到一家有做IP归属地信息查询API接口的服务商…

Python程序设计教案

文章目录: 一:软件环境安装 第一个软件:pycharm 第二个软件:thonny 第三个软件:IDIE(自带的集成开发环境) 二:相关 1.规范 2.关键字 3.Ascll码表 三:语法基础…

【学习】如何高效地进行集成测试

在软件开发的过程中,测试环节至关重要。而在这其中,集成测试更是保证软件质量的关键步骤之一。本文将探讨如何高效地进行集成测试,以确保软件的稳定性和可靠性。 一、什么是集成测试 集成测试是指在单元测试的基础上,将模块按照设…

JavaScript进阶知识点及案例(续)

编程思想 面向过程介绍 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步的实现,使用的时候再一个一个的依次调用就可以了 面向对象介绍 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作面向对象是以…

word导出或另存为pdf图片不清晰问题解决方案

问题描述: 使用word 2019导出pdf时图片不清晰,即使我已经在“选项 → \to →高级 → \to →图片大小和质量 → \to →不压缩文件中的图像 ”选项卡中关闭掉了图片压缩依然无效。 解决方案: 利用word foxit pdf 软件打印的方案转pdf。 &…

Linux加强篇-存储结构与管理硬盘(三)

目录 ⛳️推荐 磁盘容量配额 VDO虚拟数据优化 软硬方式链接 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 磁盘容量配额 使用磁盘容量配额服务来限制某位用户或某个用户组针…

Java 笔记 07:包机制,JavaDoc 文档的生成方式,Math 工具类,以及字符串连接符相关内容

一、前言 记录时间 [2024-04-25] 系列文章简摘: Java 笔记 01:Java 概述,MarkDown 常用语法整理 Java 笔记 04:Java 数据类型基础,数据类型转换,及其相关场景拓展 Java 笔记 05:变量和常量相关知…

第55篇:创建Nios II工程之Hello_World<一>

Q:本期我们开始介绍创建Platform Designer系统,并设计基于Nios II Processor的Hello_world工程。 A:设计流程和实验原理:需要用到的IP组件有Clock Source、Nios II Processor、On-Chip Memory、JTAG UART和System ID外设。Nios I…

Golang | Leetcode Golang题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; func rotate(matrix [][]int) {n : len(matrix)// 水平翻转for i : 0; i < n/2; i {matrix[i], matrix[n-1-i] matrix[n-1-i], matrix[i]}// 主对角线翻转for i : 0; i < n; i {for j : 0; j < i; j {matrix[i][j], matrix[j][i]…

2024采用JSP的酒店客房管理系统源代码+毕业设计论文+开题报告+答辩PPT

点击下载源码 摘 要 计算机技术发展至今已走过了半个多世纪之久&#xff0c;现在各个阶层、各个领域都使用着计算机&#xff0c;在这个快节奏的时代中它已经成为了社会生活的必需品。它的出现是现代社会进步&#xff0c;科技发展的标志。同时现代化的酒店组织庞大&#xff0c;…

C++: IO流

目录 1、C语言输入输出 流的概念&#xff1a; 2、CIO流 3、C文件IO流 1、C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf () 与 printf() 。 scanf(): 从标准输入设备 ( 键 盘 ) 读取数据&#xff0c;并将值存放在变量中 。 printf(): 将指定的文…

新能源汽车小米su7

小米su7汽车 function init() {const container document.querySelector( #container );camera new THREE.PerspectiveCamera( 20, window.innerWidth / window.innerHeight, 1, 50000 );camera.position.set( 0, 700, 7000 );scene new THREE.Scene();scene.background ne…

深入浅出 Spring Boot 3.x:从原理到实战,全面解锁 Java 后端开发新潮流

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

一分钟教会你使用51cto网课视频下载工具下载51cto视频

想要学习技术知识&#xff0c;提升自己的职业能力&#xff0c;51cto是一个绝佳的选择。然而&#xff0c;有时候我们可能无法随时在线观看这些精彩的视频课程。别担心&#xff01;我将在一分钟内教您如何使用51cto视频下载工具&#xff0c;将这些宝贵的学习资源下载到您的设备上…

物联网鸿蒙实训解决方案

一、建设背景 在数字化浪潮汹涌的时代&#xff0c;华为鸿蒙系统以其前瞻的技术视野和创新的开发理念&#xff0c;成为了引领行业发展的风向标。 据华为开发者大会2023&#xff08;HDC. Together&#xff09;公布的数据&#xff0c;鸿蒙生态系统展现出了强劲的发展动力&#x…

钡铼IOy系列模块在无人值守智能仓库中的成功运用,提升仓储物流效率

随着科技的不断发展&#xff0c;无人值守智能仓库正成为现代物流行业的一个重要趋势。在这个快节奏的时代&#xff0c;提升仓储物流效率是企业追求的目标之一。钡铼IOy系列模块为无人值守智能仓库的成功运作提供了关键支持。本文将探讨钡铼IOy系列模块在无人值守智能仓库中的应…
最新文章