区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(二)

2024-05-07 04:28

本文主要是介绍区块链 | 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 ERC-721 NFTs

在以太坊这样的区块链上,NFT 是通过实现 ERC-721 标准的智能合约创建和交易的。

智能合约可以执行的主要操作有:

  • 铸币 m i n t \mathsf{mint} mint:创建一个新的代币并将其分配给发行者;
  • 转账 t r a n s f e r \mathsf{transfer} transfer:从当前所有者那里转移一个代币到一个指定的账户;

只有当发出交易的账户是智能合约的部署者时,铸币 m i n t \mathsf{mint} mint 操作才会成功。只有当发出交易的账户是 NFT 的当前所有者,或者是被所有者委托过的账户时,转账 t r a n s f e r \mathsf{transfer} transfer 操作才会成功。

因此,ERC-721 符合 P 1 \mathbf{P1} P1 P 2 \mathbf{P2} P2

ERC-721 智能合约通过在智能合约实例的状态内维护一个键值对映射来追踪所生成的代币。当代币 t \mathsf{t} t 属于某个集合时,在该集合中 t . i d \mathsf{t.id} t.id 是键值对的键, ( t . o w n e r , t . d a t a ) \mathsf{(t.owner, t.data)} (t.owner,t.data) 是键值对的值。然而,ERC-721 标准并没有阻止映射中存在两个不同的键 t . i d \mathsf{t.id} t.id t ′ . i d \mathsf{t'.id} t.id,但是关联到相同的数据 t . d a t a = t ′ . d a t a \mathsf{t.data = t'.data} t.data=t.data

由此可见,ERC-721 智能合约通常不能安全地实现 F C o l l N F T \mathsf{F_{CollNFT}} FCollNFT 功能,因为 P 3 \mathbf{P3} P3 可能无法得到保证。因此,我们提出了一种不同的实现 ERC-721 智能合约的两步方法。

首先,我们要求 t . i d = s h a 256 ( t . d a t a ) \mathsf{t.id = sha256(t.data)} t.id=sha256(t.data)。然后,如果键尚未存在于键值对映射中,那么新创建的代币可以成功地添加到映射中。基于这一机制,调用 mint 函数创建一个克隆品 t ′ \mathsf{t'} t 将会失败,因为 t ′ . i d \mathsf{t'.id} t.id 已经存在于映射中。这保证了集合中数据的唯一性 P 3 \mathbf{P3} P3,且仍处于 ERC-721 合约的要求之内。



Discussion on the Implementation of F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT

这一小节探讨了如何具体实现与 F C o l l N F T \mathsf{F_{CollNFT}} FCollNFT 兼容的一组图像。

图像可以根据不同的编码方案表示。最常用的方案之一是 RGB 颜色模型,这是一个加色模型,其中红、绿和蓝三种光的原色以各种方式相加,以重现广泛的颜色。具体来说,图像中的每个像素都用一个表示红、黄和蓝分量的三个值的元组来表示。因此,一个 RGB 图像是一个宽度为 M \mathsf{M} M 像素、高度为 N \mathsf{N} N 像素的矩阵,每个单元格有 3 \mathsf{3} 3 个值。

作为一个玩具示例,我们考虑一个宽度为 16 \mathsf{16} 16 像素、高度为 9 \mathsf{9} 9 像素的图像集合,其中每个颜色分量的值可以设置在 0 \mathsf{0} 0 255 \mathsf{255} 255 之间。因此,每个图像是一个维度为 16 × 9 × 3 = 432 \mathsf{16 × 9 × 3 = 432} 16×9×3=432 的字节数组。

每个图像都与一个记录了创建时间的元数据相关联,该时间使用 U N I X \mathsf{UNIX} UNIX 时间戳表示,可以用 4 \mathsf{4} 4 字节的无符号整数表示。总的来说,这个集合中的每个收藏品 c \mathsf{c} c 都将包含一个 432 \mathsf{432} 432 字节的 c . a r t w o r k \mathsf{c.artwork} c.artwork 图像和 4 \mathsf{4} 4 字节的 c . m e t a \mathsf{c.meta} c.meta

为了获得符合 F C o l l N F T \mathsf{F_{CollNFT}} FCollNFT 标准的集合,我们直接将 c \mathsf{c} c 上传到智能合约中,这将强制图像遵守 RGB 格式,即验证对于 M × N \mathsf{M × N} M×N 矩阵的每个单元格都有三个值在 [ 0 , 255 ] \mathsf{[0, 255]} [0,255] 的区间内,并且有指定的尺寸。然后,智能合约设置 t . d a t a = c \mathsf{t.data = c} t.data=c,计算 c \mathsf{c} c 的哈希值,并将其作为 t . i d \mathsf{t.id} t.id 的值。

这种方法的局限性在于它需要将 c \mathsf{c} c 完整上传。在我们的示例中,即使 c . a r t w o r k \mathsf{c.artwork} c.artwork 很小,但我们仍然需要 432 \mathsf{432} 432 字节来表示它。

请注意,微小的 NFT 也是存在的,甚至还有人提出的单比特 NFT 。

参见:https://foundation.app/@aaa/foundation/42796

然而,图像通常具有更大的尺寸,宽度和高度达到数千像素。因此,图像在许多区块链中不能上链,即使可能的话,大文件也会影响交易费用。以下是解决这一问题的可能的方案。



1 方案一

一种常见的做法是依赖于在 IPFS 上上传收藏品 c \mathsf{c} c,IPFS 是一个点对点网络,用于通过计算在它们内容上的信息(即文件的 s h a 256 \mathsf{sha256} sha256)来共享文件。在代币 t \mathsf{t} t 上,我们设置

t . i d = t . d a t a = a d d r I P F S = s h a 256 ( c ) \mathsf{t.id = t.data = addr_{IPFS} = sha256(c)} t.id=t.data=addrIPFS=sha256(c)

然而,这并不能防止恶意铸币者铸造一个新的代币 t ′ \mathsf{t'} t

t ′ . i d = t ′ . d a t a = a d d r I P F S ′ = s h a 256 ( c ′ ) \mathsf{t'.id = t'.data = addr'_{IPFS} = sha256(c')} t.id=t.data=addrIPFS=sha256(c)

其中, c ′ . a r t w o r k = c . a r t w o r k \mathsf{c'.artwork = c.artwork} c.artwork=c.artwork c ′ . m e t a ≠ c . m e t a \mathsf{c'.meta \ne c.meta} c.meta=c.meta。换句话说,数字艺术品 c ′ . a r t w o r k \mathsf{c'.artwork} c.artwork c . a r t w o r k \mathsf{c.artwork} c.artwork 相同,而关于它们的描述 c ′ . m e t a \mathsf{c'.meta} c.meta c . m e t a \mathsf{c.meta} c.meta 不同。在 c . m e t a \mathsf{c.meta} c.meta 不必要的上下文中,可以通过设计删除它,使得这种攻击无法执行。

简而言之, c \mathsf{c} c 包含 c . a r t w o r k \mathsf{c.artwork} c.artwork c . m e t a \mathsf{c.meta} c.meta 这两部分。只要 c . m e t a \mathsf{c.meta} c.meta 不同,那么都有 c ≠ c ′ \mathsf{c \ne c'} c=c。因此,这可能会掩盖 c . a r t w o r k \mathsf{c.artwork} c.artwork c ′ . a r t w o r k \mathsf{c'.artwork} c.artwork 相同的事实,即数字艺术品惨遭克隆。



2 方案二

可以合理地假设数字资产在其生成时由其创作者 c r e a t o r \mathsf{creator} creator 签名,以保证其起源的真实性。

资产创作者 c r e a t o r \mathsf{creator} creator 通过密码学对资产进行签名,生成 σ \mathsf{σ} σ。我们可以设置 t . i d = σ \mathsf{t.id = σ} t.id=σ,以保持代币的独特性,因为尝试添加相同创作者 c r e a t o r \mathsf{creator} creator 的相同 t . d a t a \mathsf{t.data} t.data 将会产生相同的 σ \mathsf{σ} σ

那让另一个创作者 c r e a t o r \mathsf{creator} creator 使用相同 t . d a t a \mathsf{t.data} t.data 就不会有问题了?

然而,创作者始终可能被攻陷,例如:攻击者窃取秘密密钥来产生 σ \mathsf{σ} σ。如方案一所述,攻击者将能够产生克隆体,即改变 c . m e t a \mathsf{c.meta} c.meta 后再次进行签名。



3 方案三

铸币 m i n t \mathsf{mint} mint 交易可以携带一个证明,证明 t . i d \mathsf{t.id} t.id 的简洁值是资产 c . a r t w o r k \mathsf{c.artwork} c.artwork 的密码学哈希。这可以通过简洁的非交互式知识论证 S N A R K s \mathsf{SNARKs} SNARKs 来实现。

在我们的案例中,铸币者需要上传一个密码学哈希 s \mathsf{s} s(将作为 t . i d \mathsf{t.id} t.id)和一个 S N A R K π \mathsf{SNARK\ \pi} SNARK π,证明对 c . a r t w o r k \mathsf{c.artwork} c.artwork 的知识,其中:

s = s h a 256 ( c . a r t w o r k ) \mathsf{s = sha256(c.artwork)} s=sha256(c.artwork)

c . a r t w o r k \mathsf{c.artwork} c.artwork 是一张使用 RGB 颜色模型的图片。

约束约束 π = s h a 256 ( c ) \mathsf{\pi = sha256(c)} π=sha256(c) 避免了恶意铸币者随意设置 c . m e t a \mathsf{c.meta} c.meta,正如方案一中讨论过的情况一样。智能合约验证 π \mathsf{\pi} π 是否正确,然后设置:

t . i d = t . d a t a = s h a 256 ( c . a r t w o r k ) \mathsf{t.id = t.data = sha256(c.artwork)} t.id=t.data=sha256(c.artwork)

以确保 t . d a t a \mathsf{t.data} t.data 在集合中的独特性。

使用 S N A R K s \mathsf{SNARKs} SNARKs 来证明 s h a 256 \mathsf{sha256} sha256 的抗图像的效率过于低效,但实际上可以考虑使用其他密码学哈希函数,如 P o s e i d o n \mathsf{Poseidon} Poseidon,这些函数旨在允许更高效地实例化证明此类声明的 S N A R K s \mathsf{SNARKs} SNARKs



这篇关于区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966320

相关文章

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始