月亮链 月亮链
Ctrl+D收藏月亮链

ORD:OpenSea 新协议 Seaport 源码解析_JORDAN

作者:

时间:1900/1/1 0:00:00

一、Seaport简介

近期,NFT市场OpenSea宣布推出全新Web3市场协议Seaport协议,用于安全高效地买卖NFT。本文将深度分析其关键业务实现和接口实现。SeaPort官方文档https://docs.opensea.io/v2.0/reference/seaport-overview,可配合查阅,进一步加深理解。

Uniswap用开源去中心化交易改变了加密货币交易的游戏规则,这是我们现在所知的2020年DeFiSummer的开始,也带来了DEX和DeFi的大规模增长和创新。OpenSea的新协议Seaport或许也有改变NFT交易游戏规则的潜力,这也是我们分析Seaport协议的原因。

Seaport是一个市场合约,用于安全有效地创建和执行ERC721和ERC1155代币的订单。每个订单包含任意数量的供应商愿意提供的物品以及任意数量的必须连同其各自的接收者一起接收的物品。Seaport协议的6大关键点,以及它对NFT领域的意义:开源代码:有了Seaport协议,任何人都可以使用该协议构建一个NFT市场,因为它是去中心化和开源的。在未来几年,我们应该会看到更多的NFT市场建立起来。更多的竞争=更好+更快的创新去中心化:OpenSea说这个协议没有合约所有者,任何人都可以更新或生成代码。交易新范式:与一些平台只能用加密货币换取NFT不同,Seaport协议允许用户以一系列新方式获取NFT,投标人可以捆绑不同的资产以换取NFT。交易特定的NFT:当交易NFT时,你也可以设置NFT必须具备的特定“条件”。荷兰式拍卖列表:在Seaport协议中,你可以设置一个开始和结束价格,表明你希望拍卖持续多长时间。该列表将降低价格,直到找到买家。更高的安全性:OpenSea正在进行为期两周的协议审计竞赛,奖金总额为100万美元。任何开发人员都可以审核代码,提交他们发现的评审和错误,并获得奖励。

二、关键业务实现

1、NFT订单

每一个订单都包含11个关键组件:

offerer订单的报价者提供了所有的供应代币并且必须亲自执行订单或者通过签名或列举链上订单来批准订单。

zone订单的区域是附加到订单的可选辅助帐户,具有两个额外的权限:

该区域可以通过调用cancel来取消命名为该区域的订单。。

“受限”订单必须由区域或报价者执行,或者必须通过调用区域上的isValidOrder或isvalidOrderIncludingExtraData视图函数来获得批准。

offer报价包含可以从报价者帐户转移的一系列代币,其中每个代币由以下组件组成:

itemType指定代币类型,有效类型包括Ether、ERC20、ERC721、ERC1155、ERC721、有“条件(criteria)”的ERC721以及有“条件(criteria)”的ERC1155。

token指定代币合约的账户地址。

identifierOrCriteria表示ERC721或ERC1155代币标识符,或者在基于条件的代币类型的情况下,表示由代币的有效代币标识符集合组成的merkle根。对于Ether和ERC20类型,该值会被忽略,并且对于基于条件的代币类型,可以将值设置为0以允许任何标识符。

OpenAI创始人与日本首相会面 考虑在日本建立办公室:金色财经报道,OpenAI的联合创始人兼首席执行官Sam Altman在与日本首相岸田文雄会面后表示,该公司正在考虑在日本设立办公室,并扩大日语服务。据报道,Altman与岸田文雄讨论了聊天机器人的潜力,以及如何减轻其带来的负面影响。此外,他们还谈到了如何解决风险,并使人工智能“尽可能地为人类带来好处”。[2023/4/10 13:54:37]

startAmount表示如果在订单激活时完成订单所需要的相关代币的数量。

endAmount表示如果在订单到期时执行订单所需要的相关代币的数量。如果此值与startAmount不同,则根据订单激活后经历的时间线性计算出实际的数量。

consideration包含为完成订单而必须接收的代币数组。它包含所有与所提供代币相同的组件,并且还包括一个用于接收每个代币的recipient组件。该数组可以由执行者在订单执行时进行扩展,以支持“小费”。

orderType订单类型,根据两个不同的偏好,指定订单的四种类型之一,:

FULL表示不支持部分填充,而PARTIAL允许填充订单中的一部分,注意每个代币必须被提供的分数完全整除。

OPEN表示任意账户都可以提交执行订单的调用,而RESTRICTED则需要订单必须由报价者或订单所在区域执行,或者在区域上调用isValidOrder或isValidOrderIncludingExtraData视图函数时返回表示订单被批准的神奇的值。

startTime表示订单激活时的区块链时间。

endTime表示订单到期的区块链时间。该值与startTime与每个代币的startAmount和endAmount一起使用以得出它们的当前数量。

zoneHash表示一个任意的32字节值,当执行受限订单时,该值将提供给区域,该区域在确定是否是授权订单时可以使用该值。

salt表示订单的任意熵源。

conduitKey是一个bytes32类型的值,表示在执行转移时应将哪个渠道(conduit)用作代币批准的来源。默认情况下,报价方将直接向Seaport授予ERC20、ERC721和ERC1155代币批准,以便它可以在执行期间执行订单指定的任何转移。相反,选择使用渠道的报价者将授予与提供的渠道密钥相对应的渠道合约的代币批准,然后Seaport指示该渠道转移相应的代币。

nonce表示必须与给定报价者的当前随机数匹配的值。

2、订单执行

订单通过以下4种方式中的一种来执行:

调用两个“标准”函数fulfillOrder和fulfillAdvancedOrder中的一个,并且构造第二个隐含订单,同时其调用者作为报价者(offerer),已执行订单的对价(consideration)作为报价(offer),已执行订单的报价作为对价。所有报价代币将从订单报价者转移到执行者,然后所有对价代币将从执行者转移到指定的接收者。

OpenSea或因DMCA下架Okay Bears仿盘Not Okay Bears:5月18日消息,Solana链上NFT项目“淡定熊”Okay Bears仿盘Not Okay Bears在产生数百万美元销售额后,现已被OpenSea下架。据NFTGO.io数据显示,NotOkay Bears是原版10,000个“淡定熊”Okay Bears的镜像版本,过去24小时销售额达到525万美元,增幅达110.94%。据悉,OpenSea或因DMCA(数字千年版权法)规定将该NFT系列下架。[2022/5/18 3:23:36]

调用"基本"函数fulfillBasicOrder,并提供六种基本路线类型中的一种,将从组件子集派生要执行的订单,假设相关订单符合以下条件:

该订单仅包含一个报价代币,并且包含至少一个对价(consideration)代币。

该订单仅包含一个ERC721或ERC1155代币,并且该代币不是基于条件的。

订单的报价者是第一个对价代币的接收者。

所有其他代币都具有相同的以太币或ERC20项目类型和代币。

该订单不提供以以太币作为其项目类型的项目。

每个项目上的startAmount必须与该项目的endAmount匹配。

所有“忽略”的项目字段都设置为空地址或零。

如果订单中有ERC721项目,则该项目的数量为.1

如果订单有多个对价(consideration)项目,且除了第一个对价项目以外的所有对价项目与报价项目的项目类型相同,报价项目数量不小于除了第一个对价项目数量外的所有对价项目数量之和。

调用两个“可用执行”函数中的一个,并且提供一组订单与一组执行声明,其中的执行声明指定哪些报价项目可以聚合到不同的转移中,相应地哪些对价项目可以聚合在一起,以及其中已经取消的订单是因为时间无效,或者已经完全成交的订单将被跳过,而不会导致其余可用订单回滚。此外,一旦锁定maximumFulfilled可用订单,剩余的所有订单都将被跳过。与标准执行函数类似,所有报价项目将从各自的报价者转移到执行者,然后所有对价项目将从执行者转移到指定的接收者。

调用两个“匹配”函数中的一个,并且提供一组明确的订单以及一组执行,该执行指定了哪些报价项目应用于哪些对价项目。请注意,以这种方式执行的订单没有明确的执行者;相反,Seaport将简单地确保每个订单的需求一致。

虽然标准方法在技术上可用于执行任何订单,但在某些情况下存在关键的效率限制:

与简单的“热路径(hotpath)”的基本方法相比,它需要额外的调用数据。

它要求执行者批准每个对价项目,即使对价项目可以使用报价项目来执行。

它可能导致不必要的转移,而在“匹配”情况下,这些转移可以减少到更小的集合。

3、检查余额和批准交易

创建报价时,应检查以下要求以确保订单可以执行:

美国头部网约车企业Lyft CFO将加入OpenSea:12月6日,据彭博社报道,美国头部网约车企业Lyft CFO BrianRoberts将加入OpenSea。Roberts曾在微软和沃尔玛工作,曾带领Lyft公司实现快速增长并成功IPO。

据悉,OpenSea创始人兼CEO Devin Finzer证实,该团队正在与投资方讨论融资问题,并仍在确定未来的投资者,其中包括a16z、FoundersFund、Coinbase和BlockchainCapital。[2021/12/6 12:55:02]

报价者应在所有报价项目中有足够的余额。

如果订单未指明使用渠道,则报价者应为所有提供的ERC20、ERC721和ERC1155项目的Seaport合约设置足够的批准。

如果订单确实指明了使用渠道,则报价者应为所有提供的ERC20、ERC721和ERC1155项目的相应渠道合约设置足够的批准。

执行基本订单时,需要检查以下要求以确保订单可以执行:

需要执行上述检查以确保报价者仍有足够的余额和批准。

执行者应该对所有对价项目有足够的余额,除了那些项目类型与订单提供的项目类型相匹配的项目——例如,如果执行的订单提供ERC20项目,并且要求向报价者提供ERC721项目并且向另一个接受者提供相同的ERC20项目,那么执行者需要拥有ERC721项目,但不需要拥有ERC20项目,因为它将来自报价者。

如果执行者不选择使用渠道,他们需要为已执行订单上所有的ERC20、ERC721和ERC1155对价项目设置足够的Seaport合约批准,项目类型与订单提供的项目类型匹配的ERC20项目除外。

如果执行者确实选择使用渠道,则他们需要为已执行订单上的所有ERC20、ERC721和ERC1155对价项目为其各自的渠道设置足够的批准,项目类型与订单提供的项目类型匹配的ERC20项目除外.

如果已执行的订单将以太币指定为对价项目,则执行者必须能够将这些项目的总金额提供为msg.value

执行标准订单时,需要检查以下要求以确保订单可以执行:

需要执行上述检查以确保报价者有足够的余额和批准。

在收到所有的报价项目后,执行者应该对所有的报价项目有足够的余额——例如,如果执行的订单提供了ERC20项目,并且需要向报价者提供ERC721项目,并且向另一个接收者提供相同的ERC20项目,其数量小于或等于提供的数量,执行者不需要拥有ERC20项目,因为它将最先从报价者处接收到。

如果执行者不选择使用渠道,他们需要为已执行订单上的所有ERC20、ERC721和ERC1155对价项目的Seaport合约设置足够的批准。

如果执行者确实选择使用渠道,则他们需要为已执行订单上的所有ERC20、ERC721和ERC1155对价项目其各自的渠道设置足够的批准。

如果已执行的订单将以太币指定为对价项目,则执行者必须能够将这些项目的总数量提供为msg.value

NFT市场OpenSea总交易额突破55亿美元创历史新高:金色财经报道,据最新数据显示,NFT市场OpenSea总交易额已突破55亿美元(交易者数量突破49万),创下历史新高,位列NFT市场交易额排名第一位。排在第二名位置的是AxieInfinity,当前交易额达到18.9亿美元(交易者数量超过55万);第三名是CryptoPunks,交易额为12.3亿美元(交易者数量4822)。值得一提的是,OpenSea平台上约30亿美元的交易额是在八月一个月内完成的,超过此前交易额总和。[2021/9/7 23:07:29]

在执行一组匹配订单时,需要检查以下要求以确保订单可以执行:

作为执行的一部分执行,执行采购ERC20、ERC721或ERC1155项目的每个帐户必须在触发执行时在Seaport或指定的渠道上具有足够的余额和批准。请注意,先前的执行可能会为后续执行提供必要的余衡。

涉及以太币的所有执行的总和必须以msg.value的形式提供.请注意,提供者和接收者是同一帐户的执行将从最终执行集中被过滤掉。

部分成交

在构建订单时,报价者可以选择通过设置适当的订单类型来启用部分成交。然后,支持部分执行的订单可以在相应订单的某一部分中执行,从而允许后续执行绕过签名验证。总结一下部分填充的几个关键点:

当创建支持部分成交的订单或确定这些订单要成交的部分时,订单上的所有项目数量必须能被提供的部分项目数量完全整除。

如果要填写的所需部分会导致要填写的订单数量超过全部订单金额,则该部分将减少为剩余要填写的数量。这适用于部分填充尝试和完全填充尝试。如果不需要这种行为,则执行者可以使用“基本”订单方法,或使用“匹配”订单方法,并明确提供一个要求收到全部所需金额的订单。

举例来说:如果一个执行者尝试执行订单的1/2,但另一个执行者首先执行订单的3/4,则原始执行者最终将执行订单的1/4。

如果部分可成交订单上的任一项目指定了不同的startAmount和endAmount,则在确定当前价格之前,该分数将应用于这两个数量。这确保了在构建订单时可以选择完全可分的金额,而不依赖于最终完成订单的时间。

部分成交可以与基于条件的项目进行组合,以支持构建提供或接收多个项目的订单,否则这些项目将无法部分成交。

举个例子:报价者可以创建一个部分可成交的订单,为给定集合中最多10个ERC721项目提供最多10个ETH;然后,任何执行者都可以执行该订单的一部分,直到它被完全执行。

5、业务关键步骤

5.1执行订单

当通过fulfillOrder或fulfillAdvancedOrder来执行订单时:

计算订单哈希值

计算报价项目和对价项目的哈希值

检索报价者的当前计数器

计算订单哈希值

执行初始化校验

确保当前时间在订单有效时间内

OpeaSea机器人可能会影响拍卖:OpenSea拍卖系统似乎正在被机器人利用。以太坊钱包似乎以惊人的速度取消订单,使用 OpenSea 合约的最后一千笔交易中有超过四分之一被取消。

行业研究员Mike Dudas表示,机器人在被接受但在执行之前取消竞价,把系列+版本的价格越来越低;然后在买涨后拉动相反的动作来引诱价格走高。据一位知名的Solidity开发人员称,机器人会观察是否有人会接受他们的出价,然后通过取消出价来提前运行,因此接受失败。(Bein Crypto)[2021/8/12 1:51:01]

确保调用者对于当前订单类型是有效的;如果订单类型收到限制且调用者不是offerer或者zone,调用zone判断订单是否有效

检索并更新订单状态

确保订单未被取消

确保订单没有被全部执行

如果订单是部分执行的,如有必要,减少提供的执行数量,以免订单被过度执行

若订单签名尚未验证,则验证订单签名

根据偏好+可用金额(preference+availableamount)确定要执行的分数

更新订单状态

确定每个项目的金额

比较初始金额startAmount和结束金额endAmount

若相等,将执行分数应用于该金额,确保结果是整数,然后使用该结果

若不等,对这两个金额都应用执行分数,确保两个结果都是整数,然后根据当前时间找到这两个结果的现行拟合值

应用条件解析器

确保每一个条件解析器都应用于一个基于条件的订单项目

如果项目具有一个非零的条件根值(anon-zerocriteriaroot),确保为每个项目提供的标识符是有效的

更新每个项目的类型和标识符

确保所有剩余的项目都不是基于条件的项目

触发OrderFulfilled事件

包括更新的项目

将报价项目由报价者转移到调用者

使用渠道或Seaport直接获得批准,具体取决于订单的类型

将对价项目有调用者转移到对应的接受者

使用渠道或Seaport直接获得批准,具体取决于执行者声明的偏好

5.2匹配订单

当通过matchOrders或者matchAdvancedOrders来匹配一组订单时,步骤1到6几乎完全相同,但针对每个提供的订单执行。从这里开始,执行与上面的标准执行不同:

应用执行

确保每次执行都涉及一个或多个报价项目和一个或多个对价项目,所有这些项目都具有相同的类型和代币,并且每个报价项目具有相同的批准源以及每个对价项目具有相同接受者

将每个报价项目和对价项目的金额减少到零,并跟踪其总减少金额

比较每个项目的总金额,并将剩余金额加回相应订单一侧的第一个项目

为每个成交返回一个执行

扫描每个对价项目并确保没有一个对价项目仍然有非零的剩余金额

作为每次执行的一部分进行转账

根据原始订单类型,直接使用渠道或Seaport获得批准

忽略to==from或amount==0时的每次执行

三、关键接口

Seaport是一个通用的ETH/ERC20/ERC721/ERC1155市场。它最大限度地减少了外部调用,并为普通路由提供了轻量级的方法,以及更灵活的方法来组合高级订单。

ConsiderationInterface包含Seaport的所有外部函数接口。

fulfillBasicOrder

执行基本订单,仅支持Ether与ERC721之间的交易。

实现逻辑

提取订单类型和基本订单路由,并且对其进行校验

准备执行基本订单添加重入锁校验时间正确检验参数正确计算并校验订单的哈希值更新订单状态

若使用了渠道,则根据订单路由导出渠道

根据订单路由,执行原生代币以及ERC721代币的转账,完成订单

删除重入锁

fulfillOrder&fulfillAdvancedOrder

fulfillOrder执行普通订单,不支持订单部分执行,不支持条件解析器;普通订单作为特殊的高级订单进行执行。

fulfillAdvancedOrder执行高级订单。

实现逻辑

添加重入锁

_validateOrderAndUpdateStatus:根据参数,验证订单,更新状态并计算订单哈希值orderHash、需要执行订单的分子numerator和分母denominator时间校验:startTime<=block.time<=endTime分子与分母校验:

numerator<=denominator&&denominator!=0;

若numerator==denominator,需要支持部分执行(SupportPartialFills)

对价项目长度校验以及计算订单哈希值orderHash:

订单长度校验:orderParameters.consideration.length>=orderParameters.totalOriginalConsiderationItems,即参数中consideration数组实际长度要大于或等于参数中直接传递的原始对价项目总数

计算订单哈希值orderHash

校验高级订单的有效性:订单类型为2或3要求zone或offerer是caller或者zone批准。校验订单状态orderStauts=_orderStatus,保证订单没有被取消并且是可执行的

订单未取消,即:保证orderStauts.isCancelled==false

订单可执行,即:若orderStatus.numerator!=0,保证orderStatus.numerator<orderStatus.denominator。

校验订单签名,即若orderStatus.isValidated==false,则调用_verifySignature函数计算需要执行订单的分子fillNumerator和分母fillDenominator更新状态变量orderStatus

_applyCriteriaResolvers:用条件解析器,对每个生成的订单类型以及条件解析器的绑定进行校验,确保提交的待执行订单是有效的

_applyFractionsAndTransferEach:以指定的分数值执行每个项目的转账

_emitOrderFulfilledEvent:发出一个表明订单已完成的事件。

删除重入锁

fulfillAvailableOrders&fulfillAvailableAdvancedOrders

fulfillAvailableOrders执行可用普通订单,不支持订单部分执行,不支持条件解析器;可用普通订单作为特殊的可用高级订单进行执行

fulfillAvailableAdvancedOrders执行可用的高级订单

实现逻辑

_validateOrdersAndPrepareToFulfill:校验订单、更新其状态、通过先前填充的分数减少金额、应用条件解析器并触发OrderFulfilled事件。添加重入锁声明并设置一个错误缓冲区变量,指明任何本地报价项目的状态。循环遍历每一个订单,校验订单,更新每一个订单中的参数:

_validateOrderAndUpdateStatus:根据参数,验证订单,更新状态并计算订单哈希值orderHash、需要执行订单的分子numerator和分母denominator

循环遍历订单中的每一个报价项目,更新报价项目中的startAmount和endAmount

循环遍历订单中的每一个对价项目,更新对价项目中的startAmount和endAmount

校验错误缓冲区变量_applyCriteriaResolvers:应用条件解析器,对每个生成的订单类型以及条件解析器的绑定进行校验,确保提交的待执行订单是有效的聚合已使用的报价和对价项目并执行转账触发OrderFulfilled事件

_executeAvailableFulfillments:完全或部分执行通过了校验的订单,每个订单具有任意数量的要约和考虑项目,并执行转移。任何当前未激活、已完全成交或已取消的订单都将被忽略。然后,剩余的报价和考虑项目将在可能的情况下聚合,如所提供的报价和考虑组件数组所示,并且聚合的项目将分别转移到履行者或每个预期的接收者。请注意,失败的项目转移或订单格式问题将导致整个批次失败。为每一个订单的报价和对价项目的执行分配一个Execution结构,构造为一个Execution结构数组executions,任何当前未激活、已完全成交或已取消的无效订单都将被忽略。校验executions的长度对executions中的每一个Execution结构对象进行校验,过滤掉当前未激活、已完全成交或已取消的所有订单。_performFinalChecksAndExecuteOrders:对高级订单以及executions进行最后的校验,然后执行订单,完成执行转账,删除重入锁。

matchOrders&matchAdvancedOrders

matchOrders:对普通订单中的报价和对价项目按参数fulfillments提供的报价组件分配给对价组件的条件求进行匹配然后执行,不支持订单部分执行,不支持条件解析器;普通订单作为特殊的高级订单进行处理

matchAdvancedOrders:对高级订单中的报价和对价项目按参数fulfillments提供的报价组件分配给对价组件的要求进行匹配然后执行

实现逻辑

_validateOrdersAndPrepareToFulfill:校验订单、更新其状态、通过先前填充的分数减少金额、应用条件解析器并触发OrderFulfilled事件。若有无效订单,则回滚。

_fulfillAdvancedOrders:在验证、调整金额和应用条件解析器之后,执行高级订单为每一个订单的报价和对价项目的执行分配一个Execution结构,构造为一个Execution结构数组executions循环遍历参数fulfillments,将executions中的每一个元素对应到fulfillments的每一个元素,若报价人者和接受者是相同的,则跳过。_performFinalChecksAndExecuteOrders:对高级订单以及executions进行最后的校验,然后执行订单,完成执行转账,删除重入锁。

标签:ORDSEAFILLFIJORDANOSEAfilecoin币在哪个交易所LFI币

火币APP下载热门资讯
WEB3:去新加坡 收割一个时代?_web3.0币怎么提现到账号

摘??要新加坡就像一个踩中了风口的创业公司,但有多少人真的能够从投资新加坡中获益,有待观察文:刘以秦顾翎羽陈伊凡从地图上看,东南亚岛国新加坡像一颗钻石.

1900/1/1 0:00:00
加密货币:在这轮牛市中 我的失误和教训_DCEP稳定币

作者:NatEliason,下文由DeFi之道编译好吧,铁子们,看起来快乐的时光已经结束,熊市可能要持续一段时间了.

1900/1/1 0:00:00
WEB:「十问十答」区块链游戏的困局与展望_web3.0币排行榜

Web3.0游戏的经济机制则与传统游戏大相径庭,我们建议游戏厂商在Web3游戏中构建三币或四币系统,但其经济模型不能对传统游戏进行简单直接地“复制粘贴”,否则只能是失败的.

1900/1/1 0:00:00
ETA:金色观察 | 寻求重振业务增长 Meta推进数字藏品计划_NFT

尽管加密资产价格下跌,Meta正计划向其30亿用户推广数字收藏品,因为这家社交媒体集团寻求重振其增长.

1900/1/1 0:00:00
区块链:如何利用关键指标来衡量区块链的网络性能?_poly币怎么样

任何事物都会有一些特殊的指标来衡量其性能。无论是汽车这类简单的实物,还是像区块链技术这样复杂的技术。研究关键性指标帮助我们对不同的区块链进行比较,以便找到最合适开发项目和铸造NFT的区块链.

1900/1/1 0:00:00
加密货币:马克·库班:熊市将持续到加密应用程序真正有用为止_NFT

文:JESSECOGHLAN这位亿万富翁投资者表示,对金融之外的应用和效用的更大关注将使更多人回到加密货币领域,并可能扭转市场的下滑趋势.

1900/1/1 0:00:00