区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)
🐶原文: Preventing Content Cloning in NFT Collections
🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。
F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT and Blockchains with Native Support of NFTs
为了促进 NFT 集合 c o l l e c t i o n \mathsf{collection} collection 的发展,一些区块链技术,如 A l g o r a n d \mathsf{Algorand} Algorand,通过第 0 层 l a y e r 0 \mathsf{layer\ 0} layer 0 的功能实现 NFT 的交易。
区块链层次结构参考:
关于区块链如何分层这件事,网上的博客各有各的说法。根据后文采用的 Merkle Tree 方案,文中的第 0 层可能指的是上图中的 D a t a L a y e r \mathsf{Data\ Layer} Data Layer 数据层😇
与基于以太坊的区块链不同,后者在账本中只存在两种类型的交易:
- 由用户发行 i s s u e \mathsf{issue} issue 的交易;
- 由智能合约发行 i s s u e \mathsf{issue} issue 的交易;
A l g o r a n d \mathsf{Algorand} Algorand 设计并提供了更多类型的交易,其中包括创建代币、转让代币、修改代币的交易。每个区块链用户都可以是自己 NFT 集合 c o l l e c t i o n \mathsf{collection} collection 的发行者,或者一组用户可以联合起来发行由智能合约仲裁的公共 NFT 集合。
开发者可以编写智能合约,以确保只有位于发行者授权名单中的用户才能进行铸币操作,从而拒绝来自非授权用户的铸币交易。遵循 P 1 \mathbf{P1} P1 原则。 P 2 \mathbf{P2} P2 原则也是成立的,因为只有在产生交易的区块链用户拥有该代币时,代币转让交易才会成功。
然而,与 ERC-721 的情况不同,代币的管理并不是由智能合约逻辑控制的,而是由区块链共识控制的,它检查各种类型交易的有效性。因此,代币(如 A l g o r a n d \mathsf{Algorand} Algorand 中的 ASA)在系统中是通过在创建时由共识分配的数值索引唯一标识的。这个索引是由区块链验证者处理的一个计数器。因此,不能保证 i d \mathsf{id} id 不同的两个代币一定代表不同的数据。
综上所述, A l g o r a n d \mathsf{Algorand} Algorand 设计的方法不符合 F C o l l N F T \mathsf{F_{CollNFT}} FCollNFT,因为它不满足 P 3 \mathbf{P3} P3 原则。
1 方案一:利用修剪过的 Merkle Tree
考虑区块链上智能合约的能力,实现 F C o l l N F T \mathsf{F_{CollNFT}} FCollNFT 的一个潜在方法如下:
- 同属一个集合的代币通过一个智能合约创建;
- 该智能合约跟踪同属一个集合的、已创建的代币;
- 该智能合约在合法发行者的请求下铸造新代币;
在某些区块链中,智能合约对存储大小有约束。因此,管理 NFT 集合的智能合约应该在其状态中维护所有随时间发行的代币的简洁 s u c c i n c t \mathsf{succinct} succinct 表示。一个典型的简洁 s u c c i n c t \mathsf{succinct} succinct 表示是由 Merkle Tree 的根 r o o t \mathsf{root} root 组成的。
个人理解:智能合约属于应用层,Merkle Tree 属于数据层。我们之前是通过编写智能合约的逻辑来防止 NFT 集合的克隆,而这里是通过 Merkle Tree 查重来防止 NFT 集合的克隆。
按照以下方式将代币分配到 Merkle Tree 的各个 l e a f \mathsf{leaf} leaf 叶子节点。
考虑从根节点 r o o t \mathsf{root} root 到叶子节点 l e a f \mathsf{leaf} leaf 的路径。若当前节点是左子节点,则被分配 0 \mathsf{0} 0;若当前节点是右子节点,则被分配 1 \mathsf{1} 1。如此一来,每个叶子节点 l e a f \mathsf{leaf} leaf 都可以由一个 01 \mathsf{01} 01 字符串来表示。
个人脑补图:
如上图所示,叶子节点 C 被表示为 00,叶子节点 D 被表示为 01,叶子节点 E 被表示为 10,叶子节点 F 被表示为 11😇
当我们输入一个 01 \mathsf{01} 01 字符串时,便能在 Merkle Tree 上找到一个对应的叶子节点。
用字符串 s h a 256 ( t . d a t a ) \mathsf{sha256(t.data)} sha256(t.data) 表示代币 t \mathsf{t} t,通过使用上述程序,我们可以检查代币 t \mathsf{t} t 是否存在于 Merkle Tree 中。初始化,将树的根设置为 n i l \mathsf{nil} nil 空值,表示目前集合中还没有代币。为了添加一个新代币 t \mathsf{t} t,发行者首先必须证明 t \mathsf{t} t 不在集合中,即证明相应的叶子节点尚未被插入。
相应的叶子节点是指由字符串 s h a 256 ( t . d a t a ) \mathsf{sha256(t.data)} sha256(t.data) 标识的那个位置。
这很容易实现,只需从根开始按照 s h a 256 ( t . d a t a ) \mathsf{sha256(t.data)} sha256(t.data) 字符串所代表的路径行走,直至遇到 n i l \mathsf{nil} nil 空值才结束。 n i l \mathsf{nil} nil 空值代表路径中的下一子节点尚不存在。换句话说,发行者提供了一个证明,证明了从根到 s h a 256 ( t . d a t a ) \mathsf{sha256(t.data)} sha256(t.data) 的路径中有一个 n i l \mathsf{nil} nil 空值。如果代币可以被添加,那么智能合约将添加它并相应地更新 Merkle Tree 的根。
个人认为:字符串 s h a 256 ( t . d a t a ) \mathsf{sha256(t.data)} sha256(t.data) 既能代表相应的叶子节点,又能代表从根到该叶子节点的路径。
请注意,这并不是一个纯粹的 Merkle Tree,因为整个子树被修剪掉了。这实际上是出于效率考虑,因为我们无法计算完整的二叉树。具体来说,由于字符串 s h a 256 ( t . d a t a ) \mathsf{sha256(t.data)} sha256(t.data) 的长度是 256 位,因此叶子节点的数量将是 2 256 \mathsf{2^{256}} 2256 个!
什么叫做 “整个子树被修剪掉了”?原文貌似也没有讲。难道是不需要存储叶子节点吗🫠
对于某些区块链,如 A l g o r a n d \mathsf{Algorand} Algorand,实现此类过程的预期工作量可能是不切实际的。确实,一个智能合约似乎最大程度只能管理一个高度为 15 \mathsf{15} 15 的 Merkle Tree 。
个人理解:方案一要求的 Merkle Tree 岂不是高度要为 256?
2 方案二:在共识层防止 NFT 集合的克隆
由于通过智能合约编码来防止 NFT 集合克隆可能很有挑战性,特别是当底层区块链对智能合约的功能施加限制时,因此我们转而考虑该问题与区块链交易的有效性的关系。
实际上,防止克隆与在逻辑上判定某些交易无效是紧密联系的。所谓无效交易,是那些违反了区块链状态规则的交易。因此,对于那些支持 NFT 管理 m a n a g e m e n t \mathsf{management} management 交易的区块链(比如 A l g o r a n d \mathsf{Algorand} Algorand 中的 ASA),一个可行的策略是在共识层实施机制,拒绝那些试图铸造与集合中已有 NFT 相同的 NFT 的交易。为了实现这一目标,区块链的验证者可以采用类似以太坊中用于存储集合状态的数据结构(如键值映射)来进行验证。
相关文章:

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)
🐶原文: Preventing Content Cloning in NFT Collections 🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT and Blockchains with Native S…...

Unity技术学习:渲染大量物体的解决方案,外加RenderMesh、RenderMeshInstanced、RenderMeshIndirect的简单使用
叠甲:本人比较菜,如果哪里不对或者有认知不到的地方,欢迎锐评(不玻璃心)! 导师留了个任务,渲染大量的、移动的物体。 寻找解决方案: 当时找了几个解决方案: 静态批处…...

[数据概念|方案实操][最新]数据资产入表4月速递
“ 在各地数据资产变现“热辣滚烫”” 国家数据局全国数据工作会议前后,数据资源“入表”的尝试在各地持续热火朝天地展开,多地实现数据资产入表和利用数据资产进行融资实现“零的突破”。 我们今天就把4月前后的案例做一个小结,之前的案例大…...
C++中使用Multimap和Vector管理和展示数据
一: 在本文中,我们将探讨如何在C中使用vector和multimap容器来管理一个简单的员工数据系统。我们将创建一个员工类,随机生成员工数据,将员工分组,并展示各组员工的详细信息。此示例展示了C标准模板库(STL&…...
Java---类和方法的再学习
上一篇主要介绍了面向对象的思想以及内存实现,关于类与对象感觉写的不够好,因此才会有这一篇作为补充; 一:类与对象 (1)类 一些相同属性和行为的事物的统称,比较广泛、抽象,比如…...
C语言每日一练(12、水仙花数)
在编程的领域中,我们常常会遇到一些有趣而富有挑战性的问题。今天,让我们一起来探讨一个经典的编程题目——打印出所有的“水仙花数”。 所谓“水仙花数”,是指一个三位数,其各位数字的立方和等于该数本身。例如,153 …...

HTML5实现酷炫个人产品推广、工具推广、信息推广、个人主页、个人介绍、酷炫官网、门户网站模板源码
文章目录 1.设计来源1.1 主界面1.2 我的产品界面1.3 关于我们界面1.4 照片墙界面1.5 发展历程界面1.6 优秀人才界面1.7 热门产品界面1.8 联系我们界面 2.灵活调整模块3.效果和源码3.1 动态效果3.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.c…...

系统如何做好安全加固?
一、Windows系统 Windows系统出厂时,微软为了兼容性,默认并未对系统安全做严格的限制,因此还需要做一些基本的安全加固,方可防止黑客入侵。 1、系统补丁更新 为什么要更新系统补丁?很多人感觉漏洞更新没必要&#x…...
对NI系统和PLC系统的应用比较
以下是对这两种系统的基本比较: 1. 设计和功能性 NI系统: 通常基于LabVIEW等软件平台,提供强大的数据采集、信号处理和图形界面开发能力。高度模块化和可扩展,支持各种传感器和信号类型。适合进行复杂的数据分析和高级控制算法的…...

微服务架构中的挑战及应对方式:Outbox 模式
使用 Outbox 模式保持微服务数据一致性 在一个由许多小型服务组成的系统中保持数据一致性是困难的,因为它们分散在各处。以下是一些常见问题以及如何处理它们的方法:当服务发送消息时,同时更新数据库和发送消息是棘手的问题。 在微服务中发出…...

使用Docker安装MySQL5.7.36
拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看(非必须) docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地,这样即使容器被删除,数据也不会丢失。 mkd…...
【PyTorch】6-可视化(网络结构可视化、CNN可视化、TensorBoard、wandb)
PyTorch:6-可视化 注:所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/),下文仅为学习记录 6.1:可视化网络结构 Keras中可以调用model.summary()的API进行模型参数可视化 torchinfo…...
C++容器——map和pair对组
pair(对组) 是一种模板类,允许将两个不同类型的值组合在一起。它由两个数据成员first和second组成,分别用来保存这两个值。 头文件 加头文件 #include<utility> 对于 C11 及以上标准,pair 类型可以在不包含头…...

MVC和DDD的贫血和充血模型对比
文章目录 架构区别MVC三层架构DDD四层架构 贫血模型代码示例 充血模型代码示例 架构区别 MVC三层架构 MVC三层架构是软件工程中的一种设计模式,它将软件系统分为 模型(Model)、视图(View)和控制器(Contro…...
如何利用AI提高内容生产效率?
如何利用AI提高内容生产效率? 简介:探讨如何通过AI技术提升内容生产的效率和质量。 方向一:自动化内容生成 自动化内容生成是一种利用人工智能技术来自动创建文本、图像、音频等内容的方法。 以下是一些常见的自动化内容生成方式: 基于…...

C++ stack、queue以及deque
1、stack和queue常用接口 严格来说栈和队列的实现是容器适配器 1、常用接口: 栈:top、push、pop、size、emptystack - C Reference (cplusplus.com) 队列:top、push、pop、swap、size、emptyqueue - C Reference (cplusplus.com) 2、deque&a…...

科沃斯,「扫地茅」荣光恐难再现
作者 | 辰纹 来源 | 洞见新研社 科沃斯恐怕已经很难再回到被市场誉为“扫地茅”时的荣光了。 不久前,科沃斯发布2023年财报,报告期内营业收入155亿,同比仅增长1.16%,归母净利润6.12亿元,同比下降63.96%,直…...

双向BFS算法学习
双向BFS算法学习 推荐练习题 力扣“127”题:单词接龙 “752”题:打开轮盘锁 这里推荐一篇力扣题解 双向BFS 这里使用打开轮盘锁的题干进行举例: 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’,…...

C++从入门到精通---模版
文章目录 泛型编程函数模版模版参数的匹配原则类模版类模版的定义格式类模版的实例化 总结 泛型编程 泛型编程是一种编程范式,旨在实现通用性和灵活性。它允许在编写代码时使用参数化类型,而不是具体的类型,从而使代码更加灵活和可重用。 在…...

Unity数据持久化之Json
Json概述 Json是什么? 全称:JavaScript对象简谱(JavaScript Object Notation) Json是国际通用的一种轻量级的数据交换格式 主要在网络通讯中用于传输数据,或本地数据存储和读取 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率 我们一般使用Json文件来…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...