当前位置: 首页 > news >正文

区块链 | 一文了解 NFT 的生态系统(上)

🐶原文: Understanding Security Issues in the NFT Ecosystem

🐶写在前面: 本博客只摘取了原论文的第二、三节。



技术背景知识

在本节中,我们将介绍以太坊生态系统的构建模块,重点关注「NFT,非同质化代币」以及围绕它们成长起来的经济体系。



1 以太坊区块链

以太坊是推动加密货币「ETH,以太币」和数千个「dApp,去中心化应用程序」的技术。以太坊区块链是一个分布式、公共账本,其中交易由解决「PoW,加密工作量证明」挑战的矿工挖掘到区块中。

早在 2022 年,以太坊就从工作量证明过渡到权益证明了。

在这个生态系统中,一个账户是由一个地址表示的实体,能够提交交易。以太坊中有两种类型的账户:

  • 外部所有账户(EOA):由持有相应私钥的任何人控制;
  • 合约账户:其中包含可执行的代码片段,称为智能合约;

智能合约是由「EVM,以太坊虚拟机」运行的程序,它利用区块链来存储其持久状态。交易是账户之间资金的转移,或对合约的公共方法的调用。发送资金或与合约交互的地址表示为 msg.sender



2 非同质化代币 NFT

在以太坊中,代币是基于区块链的数字资产。不同于以太坊区块链本地的、内置的加密货币以太币,代币是通过专门的智能合约实现的。代币主要有两种类型:同质化代币和非同质化代币。

一方面,同质化代币的所有副本通常是符合 ERC-20 接口的,都是相同的且可以互换。另一方面,非同质化代币的所有副本通常是符合 ERC-721 接口的,都是独一无二的,每个代币代表某人对特定数字资产的所有权,例如 ENS 域名和 CryptoKitties,或者实体资产,如金条。

ENS 类似于中心化网络中的 DNS,都是用于提高地址的可读性,区别在于 ENS 针对的是去中心化网络。



3 ERC-721

ERC-721 是目前在以太坊上实现非同质化代币的最受欢迎的标准。这个标准接口定义了一组必须实现的和可选的 API 方法,用于代币合约。与我们的讨论相关的几个 API 方法如下:

/// 授予地址_operator具有所有NFT的控制权
setApprovalForAll (address _operator, bool _approved) external/// 授予地址_approved具有_tokenId控制权
approve (address _approved, uint256 _tokenId) external payable/// 地址_from将对tokenId的所有权转移给地址_to
transferFrom (address _from, address _to, uint256 tokenId) external payable/// 获取_tokenId的元数据链接
tokenURI (uint256 _tokenId) external view returns (string)

智能合约应该是用 Solidity 语言编写的,可惜 CSDN 没有这款语言的语法高亮。

每个 NFT 都有它自己的 ID,ID 用于追踪这些独特的代币,这个 ID 被称为 _tokenId



3.1 setApprovalForAll 方法

在 ERC-721 中, o p e r a t o r \mathsf{operator} operator 是一个可以管理 NFT 的 o w n e r \mathsf{owner} owner 的所有资产的实体。换句话说,NFT 的 o w n e r \mathsf{owner} owner 可以将对自己的资产采取行动的权限委托给 o p e r a t o r \mathsf{operator} operator

针对 setApprovalForAll() 方法:

  • 若设置了 _approved 参数,则将地址 _operator 添加到 msg.sender 授权的 o p e r a t o r \mathsf{operator} operator 集合中;
  • 若未设置 _approved 参数,则将地址 _operatormsg.sender 授权的 o p e r a t o r \mathsf{operator} operator 集合中移除;

其中 msg.sender 是指 NFT 的 o w n e r \mathsf{owner} owner



3.2 approve 方法

与可以操作 o w n e r \mathsf{owner} owner 的所有资产的 o p e r a t o r \mathsf{operator} operator 不同,ERC-721 定义了一个 c o n t r o l l e r \mathsf{controller} controller 作为被授权操作一个单一资产的实体。approve() 方法将地址 _approved 批准为资产 _tokenId c o n t r o l l e r \mathsf{controller} controller



3.3 transferFrom 方法

o p e r a t o r \mathsf{operator} operator c o n t r o l l e r \mathsf{controller} controller o w n e r \mathsf{owner} owner 可以调用 transferFrom() 方法将代币 _tokenId 从当前 o w n e r \mathsf{owner} owner_from 地址转移到 _to 地址。



3.4 tokenURI 方法

在创建 NFT 时, c r e a t o r \mathsf{creator} creator 可以选择性地关联一个 URL,这个 URL 被称为 m e t a d a t a _ u r l \mathsf{metadata\_url} metadata_url,它指向一个符合 ERC-721 元数据标准的 JSON 文件。这个 JSON 文件存储了资产的详细信息,例如其名称和描述,并且包含一个名为 i m a g e _ u r l \mathsf{image\_url} image_url 的字段,它是指向资产的 URL 。以下是一个示例:

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

如此一来,NFT 就将资产与记录其所有权的记录连接起来了。给定一个 _tokenId,可以通过合约的 tokenURI() 方法来检索所关联的 m e t a d a t a _ u r l \mathsf{metadata\_url} metadata_url

有趣的是,NFT 的创建和销毁 ( \mathsf{(} ( m i n t i n g \mathsf{minting} minting b u r n i n g \mathsf{burning} burning ) \mathsf{)} ) 并不是标准要求的一部分。通常,mint() 被定义为一个公共函数,仅限于合约的 c r e a t o r \mathsf{creator} creator 使用,通过传递 m e t a d a t a _ u r l \mathsf{metadata\_url} metadata_url 作为参数来调用。铸币还可以在合约创建过程中通过调用 mint() 来实现,即通过合约的构造函数。



4 IPFS

IPFS 是一个去中心化、点对点、无需权限的文件系统。任何人都可以加入 IPFS 覆盖网络。每个数据项 d d d 都将被分配一个唯一的不可变地址,该地址被称为「CID,内容标识符」,计算公式如下:

C I D = H ( d ) CID=H(d) CID=H(d)

即 CID 就是文件内容 d d d 的哈希 H H H。因此,当文件内容发生变化时,CID 也会发生变化。

在 IPFS 中存储文件时,文件的内容首先被分成块。所有的存储元素,即目录、目录中的文件以及这些文件中的块,都被存储在一个称为 M e r k l e D A G \mathsf{Merkle DAG} MerkleDAG 的有向无环图结构中。

IPFS 维护一个分布式哈希表 D H T \mathsf{DHT} DHT 存储关于 p r o v i d e r \mathsf{provider} provider 的记录,即这些记录用于定位那些存储了被请求内容的对等节点。要检索数据项 d d d,节点首先在 DHT 中查找 d d d 的提供者 P ( d ) P(d) P(d),然后节点向提供者 P ( d ) P(d) P(d) 中的一个发出对 d d d 的请求。

这段主要介绍了 IPFS 存储数据、请求数据的方式。



相关文章:

区块链 | 一文了解 NFT 的生态系统(上)

🐶原文: Understanding Security Issues in the NFT Ecosystem 🐶写在前面: 本博客只摘取了原论文的第二、三节。 技术背景知识 在本节中,我们将介绍以太坊生态系统的构建模块,重点关注「NFT,…...

为什么centos官方版不支持arm架构?

为什么centos官方版不支持arm架构? 1、资源限制:CentOS是由社区维护的开源操作系统,其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少,社区资源有限,因此官方版CentOS选择集中精力在x86架构上进行开发…...

awk小尝试2(随手记)

文章目录 需求1解法 需求2解法(3种-grep/sed/awk) 需求1 使用hostname -I创建文件名 echo hostname -I.txt 10.0.0.124 .txt # 需要注意,这里的.txt前有一个空格,需要去掉,不然就是两个文件名解法 echo hostname -I…...

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目,默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中,找到package.json 双击打开,找到scripts部分 在scripts部分,有一个"serve"键值对,这里的…...

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳,今年4月才开门营业,但从开业到今天,刮刮乐总共就来了一回货——开业时发的20本。 那之后,刮刮乐就彻底断供了。原本,陆诗想把刮刮…...

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式,下面详细解释并提供相应的举例: 使用var关键字声明的全局变量: var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量(不推荐使用&…...

docker部署的nacos2.2x开启鉴权功能

注意在2.2.0版本之后如果不开启鉴权,那么默认不需要登录就可以访问 所以我们需要手动开启鉴权,nacos启动好以后来到容器内部修改 docker exec -it nacos /bin/shvim conf/application.properties在第34行下面添加 nacos.core.auth.enabledtrue nacos.cor…...

【数据结构与算法】之五道链表进阶面试题详解!

目录 1、链表的回文结构 2、相交链表 3、随机链表的复制 4、环形链表 5、环形链表(||) 6、完结散花 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知…...

vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)

<template><divstyle"display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model"url" placeholder"输入链接" ty…...

Redis之字符串类型深入之SDS底层结构

作为一名程序员不可能不知道redis 知道redis不可能不知道redis的字符串 如果你真的熟悉redis不能不知道sds, 我们探究一下redis字符串的底层结构 sds翻译过来就是动态扩容(Simple Dynamic String)、先看一下最早版本redis的sds结构体 struct sdshdr{int len; //记录数组中…...

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果:...

C++可变参数模板中的省略号

看可变参数模板代码时常会遇到省略号的使用&#xff0c;这类奇特的“...”出现位置还不固定&#xff0c;容易引起困惑。C最近一直不用都快废了&#xff0c;在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧&#xff0c;表示“…...

uni-ui 使用uni-icons有些图标显示不出来,如down,up图标

问题描述 我使用的是uni创建时勾选的uni-ui模板&#xff0c;一次偶然机会发现down图标显示不出&#xff0c;left&#xff0c;right等其他图标又可以。 最后发现使用uni-icons不是最新版本导致的&#xff0c;使用模板生成的icons是1.3.5版本&#xff0c;我在插件市场找到的是2.0…...

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…...

Java-(乘法表之后)增强for循环

这里我们先做个了解&#xff0c;之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句&#xff1a;表达式&#xff09;{ //代码语句 } 声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型…...

Celery(分布式任务队列)入门学习笔记

Celery 的简单介绍 用 Celery 官方的介绍&#xff1a;它是一个分布式任务队列; 简单&#xff0c;灵活&#xff0c;可靠的处理大量消息的分布式系统; 它专注于实时处理&#xff0c;并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话&#xff0c;整个应用体系就是下…...

【网络】tcp协议如何保证可靠性

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议&#xff0c;为网络通信提供了可靠性和连接稳定性。本文将详细介绍 TCP 协议如何保证数据的可靠传输和连接的稳定性&#xff0c;并分析其优缺点。 可靠性保证 序号和确认机制&…...

select,poll,epoll

在 Linux Socket 服务器短编程时&#xff0c;为了处理大量客户的连接请求&#xff0c;需要使用非阻塞I/O和复用&#xff0c;select&#xff0c;poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…...

【48天笔试强训】day18

题目1 描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…...

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…...

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展&#xff0c;市场经济的信息化&#xff0c;让企业之间的竞争变得&#xff0…...

【动态规划-最长上升子序列模型part2】:拦截导弹、导弹防御系统、最长公共上升子序列【已更新完成】

1、拦截导弹 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于…...

Spring 如何解决 Bean 循环依赖

循环依赖解释 bean A 属性注入时依赖bean B &#xff0c;并且bean B属性注入时也依赖bean A &#xff0c;造成 bean A 和bean B 都无法完成初始化问题&#xff0c;形成了闭环。 注意 项目中存在Bean的循环依赖&#xff0c;是Bean对象职责划分不明确、代码质量不高的表现&#…...

【driver4】锁,错误码,休眠唤醒,中断,虚拟内存,tasklet

文章目录 1.互斥锁和自旋锁选择&#xff1a;自旋锁&#xff08;开销少&#xff09;的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码&#xff1a;64位系统内核空间最后一页地址为0xfffffffffffff000~0xffffffffffffffff&#xff0c;这段地址是被保留的&#xff0c;如果…...

python之 函数相关知识解析

01 函数的注释与嵌套 1.函数的注释 函数的注释与普通注释的区别&#xff1a;用来说明当前函数的参数含义 param 参数名: 参数的注释信息 return: 函数的返回值 例如&#xff1a; def fun1(name):""":param name: 参数的注释信息:return: 函数的返回值"…...

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别&#xff0c;你真的知道吗&#xff1f; 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要环节&#xff0c;显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要…...

Linux:升级OpenSSL和OpenSSH

原因是现有版本存在安全漏洞&#xff0c;需要升级到新版本 原有版本和升级后的版本 OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSL 1.1.1w 11 Sep 2023OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023目录 查看现有版…...

方法的入栈和出栈

一.作用域问题 1.全局作用域 在全局都能进行访问的变量 var a 10;function fn() {var b 20;return a b;}console.log(fn()); 2.局部的作用域 只能在限定的范围内进行访问 function fn() {var b 20;}console.log(b); b is not defined 打印的结果是b这个变量没用定义 3…...

PHP介绍

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;PHP❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、PHP是什么&#xff1f; 二、 PHP 文件是什么&#xff1f; 三、PHP能做什么&#xff1f; 四、P…...

接口自动化测试之-requests模块详解

一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动确定响应内容的编码&#xff0c;支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…...

邯郸专业做wap网站/网络市场调研

第一步&#xff1a;下载detours3.0&#xff0c;安装detours 第二步&#xff1a;构建库文件&#xff0c;nmake编译 第三步&#xff1a;包含库文件和头文件 #include “detours.h” //载入头文件 #pragma comment(lib,”detours.lib”) //表明要使用静态库 第四步&#xff1…...

网站建设企业关键词/推广吧

hexdump 语法SYNOPSIS hexdump [options] file [...]-n length (Interpret only length bytes of input.) -s offset Skip offset bytes from the beginning of the input. -x 两字节的十六进制显示 # 查看整个文件 hexdump mapper2# 查看前100个字节 hexdump mapper2 -n 100…...

wordpress不能更新/武汉搜索推广

导读&#xff1a;管理者最喜欢开会&#xff0c;但是开会只能意味着你比较忙碌&#xff0c;不能意味着开会是有价值的。如果开会不能产生价值&#xff0c;它就没有意义&#xff0c; 我称之为“虚假繁忙”。会议工作的方法是一个很普通的技能&#xff0c;但是很多人不太会。本文给…...

用其他商标在自己网站做宣传/南京百度竞价推广公司排名

1.http协议组成 大家可以通过抓包工具Fiddler或者其他抓包工具去抓取一个请求&#xff0c;然后可以看到如下请求数据和响应数据。分为两部分&#xff0c;一个是客户端的请求信息&#xff0c;一个是服务端的响应信息。抓取到的信息如下&#xff1a; request POST https://re.c…...

网站在线布局/html网页制作软件有哪些

本文同样从整体&#xff08;菜鸟水平的整体视角&#xff09;去思考Python的数据类型。 和前面对Python基本的运算符理解相似&#xff0c;首先我的思考路径是—— &#xff08;1&#xff09;什么是Python内置的数据类型&#xff1f; &#xff08;2&#xff09;六种内置的基本数据…...

天津单位网站建设/网站推广论坛

版本3问题&#xff1a; 不支持参数不同的构造函数。 版本4 设计&#xff1a; 通过可变参数模板来解决。可变参数模板可以支持不同参数的构造函数来创建对象。 #define LOG(info) \cout << __FILE__ << ":" << __LINE__ << " " \&l…...