区块链 | 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 的交易。为了实现这一目标,区块链的验证者可以采用类似以太坊中用于存储集合状态的数据结构(如键值映射)来进行验证。



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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

损失函数详解

1.损失函数 是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误,损失函数值越低则预测越接近真实值。对每个单独的观测(数据点)计算损失函数。将所有损失函数(loss function&#xf…

树莓派4b测量PM2.5

1.GP2Y1010AU0F粉尘传感器连接图 2. GP2Y1010AU0F工作原理 工作原理 传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。 3.源代码 main.py # coding=UTF-8 import RPi.GPIO as GPIO from ADC import ADS1015…

神经网络案例实战

🔎我们通过一个案例详细使用PyTorch实战 ,案例背景:你创办了一家手机公司,不知道如何估算手机产品的价格。为了解决这个问题,收集了多家公司的手机销售数据:这些数据维度可以包括RAM、存储容量、屏幕尺寸、…

在Mars3d实现cesium的ImageryLayer自定义瓦片的层级与原点

需要自定义瓦片层级和原点,所以需要自己写第三方图层,但是之前写的很多方法,图层控制和显隐以及透明度,需要跟之前的交互一直,改动量太大的话不划算,所以直接看Mars3d的layer基类,把重写的image…

字符串函数、内存函数——补充

目录 前言 1、strchr函数 1-1 函数介绍 1-1-1 函数功能 1-1-2 函数原型 1-1-3 函数参数 1-1-4 所属库 1-1-5 函数返回值 1-2 函数简单使用 1-3 函数使用场景 1-4 函数的使用总结 1-4-1 注意事项 2、strrchr函数 2-1 函数介绍 2-1-1 函数功能 2-1-2 函数原型 2…

BACnet到OPC UA的楼宇自动化系统与生产执行系统(MES)整合

在智能制造的浪潮下,一家位于深圳的精密电子制造企业面临着前所未有的挑战:如何高效地将楼宇自动化系统与生产执行系统(MES)整合,实现能源管理与生产流程的精细化控制。这家企业的楼宇控制系统使用的是BACnet协议&…

.OpenNJet应用引擎实践——从 0-1 体验感受

目录 一. 🦁 写在前面二. 🦁 安装使用2.1 安装环境2.2 配置yum源2.3 安装软件包2.4 编译代码2.5 启动 三. 🦁 使用效果3.1 编辑配置文件3.2 编辑 HTML 代码 四. 🦁 使用感受 一. 🦁 写在前面 现在互联网体系越来越往云…

【Docker学习】docker run的端口映射-p和-P选项

docker run的端口映射选项分为-p(小写,全称--publish),-P(大写,全称--publish-all),之前认为只有改变容器发布给宿主机的默认端口号才会进行-p的设置,而不改变默认端口号…

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65)

MATLAB 基于规则格网的点云抽稀方法(自定义实现)(65) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 海量点云的处理,需要提前进行抽稀预处理,相比MATLAB预先给出的抽稀方法,这里提供一种基于规则格网的自定义抽稀方法,步骤清晰,便于理解抽稀内涵, 主要涉及到使…

为什么你创业总是失败?2024普通人如何创业?2024创业赛道!2024创业新风口!2024创业方向!2024普通人的机会!

为什么你做项目老是不赚钱,是你不够努力吗?是你运气不好吗? 如果都不是!那一定是你的思维逻辑出了问题! 先想一想你以前做的项目,有没有哪个符合以下条件:对客户有价值、寻找客源成本在可接受…

华为eNSP综合实验-网络地址转换

实验完成之后,在AR1的g0/0/1接口抓包,查看地址转换 实现私网pc访问公网pc 实验命令展示 SW1: vlan batch 12 #创建vlan interface e0/0/1 #进入接口配置vlan端口 port link-type access port default vlan 12 q interface e0/0/2 #进入接口配置vlan端口 port link-type ac…

Linux高级学习(前置 在vmware安装centos7.4)

【小白入门 通俗易懂】2021韩顺平 一周学会Linux 此文章包含第006p-第p007的内容 操作 在安装好的vmware下进行安装 这里使用的是vmware15(win10下),win11可能无法使用15(有几率蓝屏),换成16就行了 用迅雷…

(二刷)代码随想录第1天|704. 二分查找 27. 移除元素

704. 二分查找 704. 二分查找 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili 给定一个 n 个元素有序的(升序&#xff09…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面,九宫格简单布局(示例四) 微信小程序个人中心、我的界面,超简洁的九宫格界面布局,代码粘贴即用。更多微信小程序界面示例,请进入我的主页哦! 1、js代码 Page({…

无意的一次学习,竟让我摆脱了Android控制?

由于鸿蒙的爆火,为了赶上时代先锋。到目前为止也研究过很长一段时间。作为一名Android的研发人员,免不了对其评头论足,指导文档如何写才算专业?页面如何绘制?页面如何跳转?有没有四大组件等等。 而Harmony…

pycharm中导入rospy(ModuleNotFoundError: No module named ‘rospy‘)

1. ubuntu安装对应版本ros ubuntu20.04可参考: https://wiki.ros.org/cn/noetic/Installation/Ubuntuhttps://zhuanlan.zhihu.com/p/515361781 2. 安装python3-roslib sudo apt-get install python3-roslib3.在conda环境中安装rospy pip install rospkg pip in…

pycharm调试bash启动的python项目(远程开发同理)

pycharm调试bash启动的python项目(远程开发同理) 步骤 打开运行/调试配置 选择Python 调试服务器 参考打开的页面,在需要debug的虚拟环境中安装依赖环境:pip install pydevd-pycharm~241.14494.158。端口号可以手动指定&…

探索鸿蒙开发:鸿蒙系统如何引领嵌入式技术革新

嵌入式技术已经成为现代社会不可或缺的一部分。而在这个领域,华为凭借其自主研发的鸿蒙操作系统,正悄然引领着一场技术革新的浪潮。本文将探讨鸿蒙开发的特点、优势以及其对嵌入式技术发展的深远影响。 鸿蒙操作系统的特点 鸿蒙,作为华为推…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明:移除指定维后,返回一个元组,包含了沿着指定维切片后的各个切片。 参数: tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

初学python记录:力扣1652. 拆炸弹

题目: 你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 ,将第 i 个数字用…