区块链 | OpenSea:Toward Achieving Anonymous NFT Trading 一文的改进方案

🥑原文: Toward Achieving Anonymous NFT Trading
🥑吐槽: 这论文怎么老有描述不清、前后不一致的地方😇



正文

在本节中,我们将具体展示我们方案的构建。我们将基于一个示例来描述我们方案的工作流程,该示例中 Alice 是 NFT的所有者,而 Bob 想要购买它。交易是通过采用我们提出的方案的市场进行的。

该论文的创新点就是对 NFT 市场的交易流程进行了修改。

我们还假设所有链下的通信都是通过端到端的安全通道进行的,以抵御监听攻击。此外,市场选择了一个有限椭圆曲线域上的群 G G G,该域的阶为 q q q,两个生成元 G G G H H H,以及一个抗碰撞哈希函数 h ( ) h() h(),并将这些作为公共参数发布。

下图展示了我们方案的框架:

在这里插入图片描述
其中,NFT 的转移是通过智能合约执行的,而 ETH 的支付则是通过市场控制的假账户进行的。

下图展示了我们方案是如何工作的:

在这里插入图片描述

请注意,仅卖方需要代理服务,并且卖方与代理之间不存在直接交互。



A 代理的注册

在我们的方案中,区块链上部署的 代理注册合约 负责新代理的注册,它还用于记录代理和对应所有者之间的映射关系,这点与 Wyvern 协议相同。

在后文中,代理注册合约又被简称为注册表😇

在 Wyvern 协议中,是通过用户和注册表的直接交互来注册代理的。而在我们的方案中,是通过市场和注册表的交互来注册代理的。接下来,我们将具体介绍注册一个代理的流程。

首先,每个用户通过以太坊的密钥生成算法生成一个新的密钥对 ( p k t , s k t ) (pk_t,sk_t) (pkt,skt),称为 临时密钥 s k t sk_t skt 是需要保密的私钥,而公钥 p k t pk_t pkt 用于生成临时地址 a d d r t addr_t addrt。到时候,市场将使用临时地址为用户创建一个新的代理。注意:临时密钥对的格式与区块链密钥对的相同。但是,用户只应该在 NFT 交易中使用它,而不应该用于其他场合。

公钥 p k t pk_t pkt 用于生成临时地址 a d d r t addr_t addrt

接着,假设 U U U 表示所有区块链用户, T T T 表示所有临时地址 a d d r t addr_t addrt,那么市场记录了用户和临时地址之间的映射关系 U T ⊆ U × T UT ⊆ U × T UTU×T。关系 U T UT UT市场的数据库 保密保存,意味着用户和临时地址之间的映射关系仅被市场和临时地址的所有者本人所知。

随后,市场将调用注册表的函数,以创建一个新的代理。在此过程中,市场传入的是临时地址,而非所有者的真实地址。由此一来,新代理所有者的地址将被记录为临时地址 a d d r t addr_t addrt。通过这种方式,代理与所有者之间的关系将由对一个临时密钥的知识来维持。

简而言之,为了不暴露真实的所有者地址,要求一个由临时密钥对生成的临时地址来充当所有者地址。



B NFT 所有权

使用 关于所有者地址的承诺 来将 NFT 的所有权绑定到某个用户。

假设 NFT M 的所有者是 Alice,且她的地址为 a d d r 1 addr_1 addr1。生成承诺的流程如下:

首先,给定一个阶为 p p p 的公共组 ( G , ⋅ ) (G, ·) (G,⋅),市场随机选择两个生成元 g g g h = g α h = g^α h=gα,并将 ( G , g , h , p ) (G, g, h, p) (G,g,h,p) 作为公共参数发布,其中 α α α 作为秘密保存。

接着,Alice 随机选择一个秘密值 r 1 ∈ Z p r_1 ∈ Z_p r1Zp 并计算:

C A l i c e = g a d d r 1 h r 1 C_{Alice} = g^{addr_1}h^{r_1} CAlice=gaddr1hr1

在非匿名模式下,NFT 合约存储了一个包含相应所有者地址的 代币 ID 列表。在匿名模式下,代币 ID 列表 中存储的是 C A l i c e C_{Alice} CAlice,以表示 M 的所有者存在但保持身份隐藏。

简而言之,使用 Pedersen 承诺为 Alice 的真实地址 a d d r 1 addr_1 addr1 生成一个承诺值 C A l i c e C_{Alice} CAlice。将承诺值保存在 NFT 的 ID 列表中,既能隐藏所有者的地址,又能在揭示阶段证明所有者的身份。



C 订单生成

订单生成始于链下。

1 卖方 + 销售订单

对于卖方 Alice,她将生成一个 销售订单。该订单包括如下信息:

  • 目标 NFT 的 ID
  • 价格
  • 上架时间
  • 到期时间
  • calldata
  • 用于承诺的知识证明

上述信息都将由 Alice 的临时私钥 s k t , A l i c e sk_{t,Alice} skt,Alice 进行签名。

用于承诺的知识证明的生成过程如下:

  1. x , y ← Z q x, y ← Z_q x,yZq
  2. P = x G + y H P = xG + yH P=xG+yH
  3. t ← h ( o r d e r ) t ←h(order) th(order)
  4. x ′ = x + t m x' = x + tm x=x+tm y ′ = y + t r y' = y + tr y=y+tr
  5. P r o o f = ( P , x ′ , y ′ ) Proof = (P, x', y') Proof=(P,x,y)

P r o o f Proof Proof 是在承诺的揭示阶段使用的,这里只是在讲它是如何生成的,和上文没有太大联系。

接着,Alice 通过一个安全的端到端通道将销售订单提交给市场。市场接收到销售订单后,将继续完善这笔销售订单,如下表所示。最后,市场将销售订单提交给交换协议。

在这里插入图片描述

市场在 Alice 填写的销售订单的基础上,增加了 Alice 的临时公钥、注册表和 Alice 对应的代理。


2 买方 + 购买订单

对于买方 Bob,他首先与市场的前端通信,以获得假账户的地址。在向市场提交购买订单之前,Bob 必须将足够的 ETH 转账到这个假账户。

Bob 将生成一个 购买订单。该订单包括如下信息:

  • 目标 NFT 的 ID
  • 出价
  • 上架时间
  • 到期时间
  • 关于 Bob 地址的承诺

上述信息都将由 Bob 的临时私钥 s k t , B o b sk_{t,Bob} skt,Bob 进行签名。

比起 Alice 少了 calldata 这一信息。

原文把 关于 Bob 地址的承诺 写错了,我改成了:

C B o b = g a d d r 2 h r 2 C_{Bob} = g^{addr_2}h^{r_2} CBob=gaddr2hr2

请注意,我们不要求 Alice 和 Bob 同时向市场的提交订单,Bob 也可以提前提交购买订单。

接着,Bob 通过一个安全的端到端通道将购买订单提交给市场。在接收到 Bob 的购买订单后,市场首先会检查 Bob 是否已经将足够的 ETH 转入了指定的假账户。然后,市场也会完善购买订单,如下表所示。

在这里插入图片描述

市场在 Bob 填写的购买订单的基础上,增加了 Bob 的临时公钥。

最终,两个订单都会存储在市场的链下数据库中,等待上传到交换协议。



D 给代理授权

除了生成订单之外,Alice 还生成了另一条带有她签名的消息,以授权代理访问目标 NFT 。为此,Alice 生成了关于订单的消息,并使用临时私钥对其进行签名:

m a u = " A U T H " ∣ ∣ t a r g e t N F T ∣ ∣ t i m e s t a m p s i g a u = s i g n ( m a u , s k t , A l i c e ) \begin{alignat}{2} m_{au} &= "AUTH"\ ||\ target\ NFT\ ||\ timestamp \\ sig_{au} &= sign(m_{au}, sk_{t,Alice}) \end{alignat} mausigau="AUTH" ∣∣ target NFT ∣∣ timestamp=sign(mau,skt,Alice)

貌似 Alice 就只会告诉代理目标 NFT 的 ID 是什么😇

具体来说,Alice 首先通过链下通道将 ( m a u , s i g a u ) (m_{au}, sig_{au}) (mau,sigau) 发送给市场。然后,市场通过调用相关函数将其转发给注册表。

Alice 是通过临时地址才和代理联系起来的,而这个映射关系又是由市场数据库保存的。因此,市场不仅需要告诉注册表 ( m a u , s i g a u ) (m_{au}, sig_{au}) (mau,sigau) 是什么,还要告诉注册表 Alice 的代理是谁。否则,注册表怎么知道 Alice 的代理是哪个。

注册表在收到消息 m a u m_{au} mau 和签名 s i g a u sig_{au} sigau 后,首先检查时间戳是否有效,接着验证签名 s i g a u sig_{au} sigau。如果验证通过,那么注册表将添加 Alice 对应的代理和目标 NFT 到列表中。该列表用于存储所有被委托的代理和它们的目标 NFT 。

为了检验消息是否被篡改,在发送消息的时候都会附上一个数字签名。



E 交换

如果根据目标 NFT 的 ID、价格等条件匹配到了两个订单,那么市场就会将 销售订单、卖家签名、购买订单、买家签名 打成一个捆绑包,并提交给交换协议。

匹配这一工作不是交换协议在做的吗?怎么市场也来掺一脚?

交换协议收到这个捆绑包后,将按以下步骤进行处理:

  1. 通过比较目标 NFT 的 ID、价格和出价、有效期来检查两个订单是否匹配。
  2. 锁定目标 NFT 的交易状态。
  3. 验证卖方签名、买方签名的有效性。
  4. 验证卖方提供的证明。
  5. 检查卖方的代理是否已被认证。
  6. 如果上述任何步骤失败,交易阶段将中止并发出错误信息。如果所有上述步骤都成功,交换协议将检查卖方是否认证了代理。如果是,它将调用卖方代理并传入 calldata 参数以执行。
  7. 代理执行 calldata,并将目标 NFT 的所有权字段替换为 C B o b C_{Bob} CBob。然后作为交易收据发出此次交易完成的事件。

太离谱了,明明说了买方不使用代理,原文却在第 5 步说要检查买方的代理是否被认证😇

算法 1 展示了定义在交换协议中的交换函数:

Upon receiving(Order1, Order2):Assert message.sender = marketplace  // 验证消息发送者是否是市场Assert Order1.target = Order2.target  // 验证目标NFT是否一致Assert Order2.bid >= Order1.price  // 验证出价是否大于等于价格Assert t > listing.time || expiration.time > t  // 验证时间戳是否处于有效期内Lock(Order1.target)  // 锁定目标NFTVerify(Order1.sig)  // 验证卖家签名Verify(Order2.sig)  // 验证买家签名Assert VerifyProof(Order1.proof) = 1  // 验证卖家证明Assert Registry[proxy] = approved  // 验证代理是否已被认证r = Call(proxy, Order1.calldata, Order2.commit)Unlock(Order1.target)  // 解锁目标NFTReturn r and emit event

代理的过程在算法 2 中展示:

Upon receiving(calldata, commit):Verify(calldata.sig, pkt)calldata.receiver = commitr = Proxy(calldata)Return r

说明:

  • 参数:order1 的 calldata、order2 的 commit
  • 第一步:检验??
  • 第二步:将 calldata 的接受者设置为关于 Bob 地址的承诺
  • 第三步:进行 NFT 所有权的转移

其中,Proxy() 是由 Wyvern 库定义的,以允许代理执行 Alice 创建的所有权转移命令。在检测到完成事件后,市场使用假账户向 Alice 支付以太币,作为出售 NFT 的收入。

什么是 Alice 创建的所有权转移命令?答:Alice 销售订单里写的 calldata 定义了所有权转移命令。



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

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

相关文章

【MongoDB】数据的自动过期,TTL索引

文章目录 1. 前言2.概念与使用2.1.使用方式2.2.数组中包含日期字段2.3.设置具体的过期时间点2.4.额外的过滤条件 3.总结 1. 前言 在近期的工作中,使用了MongoDB来保存了一些日志数据,但是这些日志数据具有一定的时效性,也就是按照业务的需要…

mac可以玩steam吗 mac安装steam教程 苹果电脑能打steam游戏吗 苹果电脑怎么安装windows 苹果mac电脑配置AI功能的M4芯片

众所周知,Steam作为一个热门的游戏平台,深受国内外玩家的喜爱,平台中包含了无数的游戏,在作战时玩家们能够与朋友们互动聊天,还能匹配好友组队,同时还能增进与同伴的默契度。 但是最近有玩家们提问说&#…

MySQL数据库中备份和查询

总所周知我们用到的数据有可能丢失,那么我们就可以通过备份把数据找回,如何操作:请先看下面讲解 备份: 导出: 先对数据库进行备份,然后提取备份文件中的SQL语句 这就是我们导出数据,导出了就有…

关于conda占C盘内存的问题

文章目录 前言一、C盘中.conda文件中的envs二、C盘中.conda文件中的pkgs 前言 最近发现C盘空间越来越少,于是就去清理了一下conda在C盘的存储,不看不知道,一看吓一跳,足足十几G!于是去网上搜索了相关的包能不能删除&a…

电梯节能的推广意义

之前关于电梯能量回馈设备,小伍已经做了很多介绍,那么小伙伴们,他的推广意义你真的了解了么? 第一:节电降耗,电梯在运行过程中会产生大量的惯性能量,这些能量如果不被利用就会浪费。能量回馈技术…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

UDP文件传输工具之UDP怎么限流

UDP&#xff08;用户数据报协议&#xff09;以其低延迟和高速度的特点&#xff0c;在实时应用和大数据传输中扮演着重要角色。然而&#xff0c;UDP作为一种无连接的协议&#xff0c;并不保证数据包的顺序、完整性或可靠性。 因此&#xff0c;企业在寻求一种方式&#xff0c;有…

尝试给笔记本超频

超频&#xff08;英语&#xff1a;overclocking&#xff09;是把一个电子配件的时脉速度提升至高于厂方所定的速度运作&#xff0c;从而提升性能的方法&#xff0c;但此举有可能导致该配件稳定性以及配件寿命下降。 笔记本配置为&#xff1a; 处理器 AMD Ryzen 7 7730U wit…

【GlobalMapper精品教程】076:基于高程和影像数据创建电子沙盘(真实三维地形)

影像与数字高程模型叠加,可以构建三维真是地形。本文讲解在Globalmapper中基于高程和影像数据创建电子沙盘(真实三维地形)。 文章目录 一、加载数据二、创建三维网格三、三维叠加显示一、加载数据 本实验的数据(配套实验数据资料包中的data076.rar,订阅专栏,获取全文及数…

基于MLP算法实现交通流量预测

在浩如烟海的城市数据中&#xff0c;交通流量信息无疑是揭示城市运行脉络、洞察出行规律的关键要素之一。实时且精准的交通流量预测不仅能为交通规划者提供科学决策依据&#xff0c;助力提升道路使用效率、缓解交通拥堵&#xff0c;还能为公众出行提供参考&#xff0c;实现个性…

vue-manage-system 版本更新,让开发更加简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…

QA测试开发工程师面试题满分问答15: 讲一讲InnoDB和MyISAM

InnoDB和MyISAM是MySQL中两种常见的存储引擎&#xff0c;它们在数据存储和处理方面有着显著的区别。让我们逐一来看一下它们的区别、原理以及适用场景。 区别&#xff1a; 事务支持&#xff1a;InnoDB是一个支持事务的存储引擎&#xff0c;而MyISAM不支持事务。事务是一种用于维…

mysql 重复单号 统计

任务&#xff1a; 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数据量 17、统计出现的重复次数 增加重复件统计分析&#xff1a; 统计展示选择时间范围内重复1次、重复2次、重复3次、重复4次、重复5次及以上的数…

【机器学习】各大模型原理简介

目录 ⛳️推荐 前言 一、神经网络&#xff08;联结主义&#xff09;类的模型 二、符号主义类的模型 三、决策树类的模型 四、概率类的模型 五、近邻类的模型 六、集成学习类的模型 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风…

uniapp H5的弹窗滚动穿透解决

目录 方案一 事件修饰符 overscroll-behavior 修饰符 overscroll-behavior 属性 看个案例 兼容 方案二 overflow&#xff1a;hiden 有一层遮罩蒙层覆盖在body上时&#xff0c;当我们滚动遮罩层&#xff0c;它下面的内容也会跟着一起滚动&#xff0c;看起来好像是上面的…

冯唐成事心法笔记

文章目录 卷首语 管理是一生的日常&#xff0c;成事是一生的修行PART 1 知己 用好自己的天赋如何管理自我用好你的天赋成大事无捷径如何平衡工作和生活做一个真猛人做自己熟悉的行业掌控情绪如何对待妒忌和贪婪如何战胜自己&#xff0c;战胜逆境真正的高手都有破局思维有时候…

本地环境测试

1. 在 Anaconda Navigator 中&#xff0c;打开 Jupyter Notebook &#xff0c;在网页中&#xff0c;点击进入本地环境搭建中创 建的工作目录&#xff0c;点击右上角的 New- 》 Folder &#xff0c;将新出现的 Untitled Folder 选中&#xff0c;并使用左上角 的 Rename 按钮重…

白蚁自动化监测系统解放方案

一、系统介绍 白蚁自动化监测系统是基于物联网的各项白蚁监测点数据的采集形成智能控制系统。提供白蚁实时预警及解决方案&#xff0c;真正实现区域内白蚁种群消灭。白蚁入侵&#xff0c;系统第一时间自动报警&#xff0c;显示入侵位置&#xff0c;实现抓获白蚁于现场的关键环…

【Linux】认识文件(三):缓冲区

【Linux】认识文件&#xff08;三&#xff09;&#xff1a;缓冲区 一.啥是缓冲区&#xff1f;二.缓冲区现象三.缓冲区的刷新方法四.缓冲区在哪&#xff1f;五.为什么要有缓冲区 一.啥是缓冲区&#xff1f; 缓冲区&#xff0c;官方说法就是&#xff1a;指的是一块用于临时存储数…

LeetCode 409—— 最长回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 要想组成回文串&#xff0c;那么只有最中间的字符可以是奇数个&#xff0c;其余字符都必须是偶数个。 所以&#xff0c;我们先遍历一遍字符串&#xff0c;统计出每个字符出现的次数。 然后如果某个字符出现了偶…