OpenSea合约深度解析——atomicMatch_ 篇

发布时间:2024-01-25 08:00

很多朋友在Opensea上购买NFT时,会发现自己的钱包正在调用一个名为Atomic Match_的方法,正好这段时间做的项目需要和Opensea交互,研究了一下Opensea的合约,今天就从

atomicMatch_开始,分析一下Opensea的合约源码,希望能够帮到大家。

\"\"

Opensea交互流程简介

1.NFT拥有者上架NFT

当用户初次使用opensea上架NFT时,会被要求初始化钱包(”lnitialize your wallet”),其本质是创建一个代理合约,做为下一步授权(”Approve this item for sale”)的目标。最后一步为签名(签名的信息为配对参数信息,且保存到Opensea的中心化服务器中)。

\"OpenSea合约深度解析——atomicMatch_

2.购买NFT

2.1 buy now 模式

当buyer点击buy now 对已经list的订单进行购买时,首先在前端获取order.buy部分,同时在Opnesea数据库获取order.sell部分并将其加入缓存,封装后作为参数调用atomicMatch_方法,在方法内部确认订单可用且匹配后,通过调用代理合约来实现transferfrom方法。

\"OpenSea合约深度解析——atomicMatch_

2.2 make offer 模式

make offer同理

\"OpenSea合约深度解析——atomicMatch_

atomicMatch_详解

可以看到,atomicMatch_在其中起到至关重要的作用,现在就让我们来看看这个方法究竟实现了哪些功能

\"OpenSea合约深度解析——atomicMatch_

可以看到它的参数很多,但其本质只是将order.sell和order.buy集合到了一起。

atomicMatch的四个参数分别为(买方order参数合集,买方签名vrs,卖方order参数合集,卖方签名vrs)

我们从Order和Sig切入:

order:order结构体包含了如交换合约,订单创建者,订单获取者等大量和交易有关的数据(因篇幅原因不全部展示,可以到区块链浏览器中获取,下同)

\"OpenSea合约深度解析——atomicMatch_

Order信息存储在Opnesea的中心化服务器中,可以通过API获取

\"OpenSea合约深度解析——atomicMatch_

Sig:Sig结构体就简单很多,其主要作用是为了验证签名。

\"OpenSea合约深度解析——atomicMatch_

atomicMatch主体部分分为两部分,第一部分是验证,第二部分是调用代理完成交换。

1.验证

1.1验证order参数

\"OpenSea合约深度解析——atomicMatch_

主要通过validateOrderParameters来验证

在这两个条件判断中,Opense逻辑是这样的, 如果是buy now模式,即buyer交易的发起者,在这里对buyer进行订单参数校验,对seller进行签名校验 如果是make offer模式,即seller是交易的发起者,在这里对seller进行订单参数校验,对buyer进行签名校验

\"OpenSea合约深度解析——atomicMatch_

validateOrderParameters 主要从四个方面来验证

1.当前合约是否为规定的交换合约

2.订单创建者地址是否为空

3.订单价格是否固定+是否在有效期内

4.判断费率是否正常

1.2 验证后通过orderCanMatch判断order.sell和order.buy的信息是否匹配

\"OpenSea合约深度解析——atomicMatch_

                                                           比较数据是否一致

1.3验证calldate是否匹配

\"OpenSea合约深度解析——atomicMatch_

2转移NFT
在讲解代码前,先从流程见一下大概原理,方便大家理解。

首先获取由NFT拥有者创建的代理合约(即获得NFT授权的合约)的实例,调用代理合约的implement合约的proxy方法,proxy方法指向并调用target合约,由target合约进行最后校验与token的转移。

2.1 获取target地址

\"OpenSea合约深度解析——atomicMatch_

2.2 获取代理合约实例

\"OpenSea合约深度解析——atomicMatch_

\"OpenSea合约深度解析——atomicMatch_ 2.3 获取包含implement proxy方法的代理合约实例

\"\"

\"OpenSea合约深度解析——atomicMatch_

在这里要强调一下,有的朋友可能会有疑问,为什么这里明明是implement 的contract,为什么要传入代理合约的地址? 这是因为implement合约并没有获取NFT的授权。又有朋友有疑问了,代理合约没有写transferFrom方法,或者调用方法,他是怎么做到去调用transferFrom的呢。其实代理合约合约还真的写了,只不过在区块链浏览器上没办法显示出来。

\"OpenSea合约深度解析——atomicMatch_

\"OpenSea合约深度解析——atomicMatch_

这里运用了内联汇编的方法,调用implement的proxy方法。

新版的完整区块链浏览器显示,应该是这样的

\"OpenSea合约深度解析——atomicMatch_

2.4将该签名的状态锁定

\"OpenSea合约深度解析——atomicMatch_

2.5转移费用 

\"\"

2.6验证implement的地址和转移NFTproxy方法指向并调用target合约,由target合约进行最后校验与token的转移

\"OpenSea合约深度解析——atomicMatch_

proxy通过对contracts(msg.sender)的调用来判断目前调用该方法的地址是否为被注册为可调用地址

\"OpenSea合约深度解析——atomicMatch_

转移完NFT后提交event。 这就是整个atomicMatch_执行流程。

更多有关Opensea的内容,可能会在下期更新。

本文来源于网络转发,仅用于学习交流,禁止用于非法用途由此带来的一切法律由自己承担与博主无关!~

学如逆水行舟,不进则退。心似平原跑马,易放难收。IT技术是指掌握多种技能,并能利用多种技能独立完成产品的人。 也叫全端工程师(同时具备前端和后台能力),英文Full Stack engineer。【人工智能】【区块链】【系统/网络/运维】【云计算/大数据】【数据库】【移动开发】【后端开发】【游戏开发】【UI设计】【微服务】【爬虫】【Java】【Go】【C++】【PHP】【Python】【Android/IOS】【HTML/CSS】【JavaScript】【Node】。欢迎各位大神萌新一起加Q群958319786专研分享技术。


————————————————
 

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号