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

区块链 | 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&#xff08;对组&#xff09; 是一种模板类&#xff0c;允许将两个不同类型的值组合在一起。它由两个数据成员first和second组成&#xff0c;分别用来保存这两个值。 头文件 加头文件 #include<utility> 对于 C11 及以上标准&#xff0c;pair 类型可以在不包含头…...

MVC和DDD的贫血和充血模型对比

文章目录 架构区别MVC三层架构DDD四层架构 贫血模型代码示例 充血模型代码示例 架构区别 MVC三层架构 MVC三层架构是软件工程中的一种设计模式&#xff0c;它将软件系统分为 模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Contro…...

如何利用AI提高内容生产效率?

如何利用AI提高内容生产效率? 简介&#xff1a;探讨如何通过AI技术提升内容生产的效率和质量。 方向一&#xff1a;自动化内容生成 自动化内容生成是一种利用人工智能技术来自动创建文本、图像、音频等内容的方法。 以下是一些常见的自动化内容生成方式&#xff1a; 基于…...

C++ stack、queue以及deque

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

科沃斯,「扫地茅」荣光恐难再现

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

双向BFS算法学习

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

C++从入门到精通---模版

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

Unity数据持久化之Json

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

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...