区块链 | 一文了解 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参数,则将地址_operator从msg.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++可变参数模板中的省略号
看可变参数模板代码时常会遇到省略号的使用,这类奇特的“...”出现位置还不固定,容易引起困惑。C最近一直不用都快废了,在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧,表示“…...
uni-ui 使用uni-icons有些图标显示不出来,如down,up图标
问题描述 我使用的是uni创建时勾选的uni-ui模板,一次偶然机会发现down图标显示不出,left,right等其他图标又可以。 最后发现使用uni-icons不是最新版本导致的,使用模板生成的icons是1.3.5版本,我在插件市场找到的是2.0…...
动态增删表格
期望目标:实现一个能通过按钮来动态增加表格栏,每次能添加一行,每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…...
Java-(乘法表之后)增强for循环
这里我们先做个了解,之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句:表达式){ //代码语句 } 声明语句:声明新的局部变量,该变量的类型…...
Celery(分布式任务队列)入门学习笔记
Celery 的简单介绍 用 Celery 官方的介绍:它是一个分布式任务队列; 简单,灵活,可靠的处理大量消息的分布式系统; 它专注于实时处理,并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话,整个应用体系就是下…...
【网络】tcp协议如何保证可靠性
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,为网络通信提供了可靠性和连接稳定性。本文将详细介绍 TCP 协议如何保证数据的可靠传输和连接的稳定性,并分析其优缺点。 可靠性保证 序号和确认机制&…...
select,poll,epoll
在 Linux Socket 服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select,poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…...
【48天笔试强训】day18
题目1 描述 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子,假如兔子都…...
链表经典面试题01
目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
