NFT marketplace如何运作-2:Seaport 1.1

  • justinzen
  • 发布于 2023-01-28 11:15
  • 阅读 12

本文详细介绍了Seaport协议的背景、工作原理及其在NFT市场中的应用,探讨了订单匹配、验证和资产转移的过程,强调了该协议的高效性及其多种订单类型助力用户灵活进行资产交易。整体结构清晰,内容丰富,适合想深入了解NFT市场的人士阅读和学习。

它是一个关于 NFT 交易探索的系列。如果你想创建你的 NFT 或与同行交易你的 NFT,或者将来在社交媒体上拥有一个市场,你可以尝试 MoonPier 或加入我们的 discord 获取更多信息。

Seaport 由 OpenSea0age 开发,是一个强大而复杂的协议,基于汇编代码构建。考虑到 protocol 的复杂性以及在 official documentation 中提供的大量信息,我受到启发,想深入了解 Seaport 背后的设计原则。这促使我撰写了一系列有关 NFT 市场的文章,供那些像我一样希望更深入研究该协议的人参考。

背景

在 2022 年 5 月,OpenSea 发布了 Seaport protocol,并将其集成到其市场中,从 Wyvern 转向 Seaport。Seaport 的一些关键特性包括其Gas效率、支持多个资产的转移能力以及在集合和特征级别进行报价的能力。你可以阅读 post 以获取 Seaport 的更多功能。

图 1. Seaport 的特性

Seaport 协议如何工作

与使用原子匹配过程在卖方和买方之间进行订单匹配的 Wyvern 协议不同,Seaport 利用履行订单方法来匹配订单。卖方或买方可以列出订单,另一方仅需满足订单中指定的要求。

Seaport 提供四种不同的履行订单的方法:

  1. fulfillOrder / fulfillAdvancedOrder
  2. fulfillBasicOrder
  3. fulfillAvailableOrders / fulfillAvailableAdvancedOrders
  4. matchOrders / matchAdvancedOrders

在这篇文章中,我们将更深入地了解使用 fulfillBasicOrder 的去中心化资产交换过程,这是一种用于在一笔订单中仅交易一件 NFT 的Gas优化方法。

如果你对为什么要交换加密资产感兴趣,请参阅以下文章

生产力、数字资产和资产交换 \ \ 想象一下,有人希望在你获得最新的 MacBook 后购买你的旧 MacBook。你唯一能做的就是列出……\ \ medium.com

1. 订单匹配

订单制作者签署的订单组件可以分为两部分:信息、转移的资产。

struct OrderComponents {
  address offerer;
  address zone;
  OfferItem[] offer;
  ConsiderationItem[] consideration;
  OrderType orderType;
  uint256 startTime;
  uint256 endTime;
  bytes32 zoneHash;
  uint256 salt;
  bytes32 conduitKey;
  uint256 counter;
}

信息

与 Wyvern 等其他协议类似,在 Seaport 中,订单制作者必须指定 offerer 的 地址、一个 salt 以防止重复订单,以及存储在区块链上的 counter 以避免意外匹配过时的签名订单。

Seaport 还具有四个独特的订单元素。由于 Seaport 允许用户将多个资产打包在一笔订单中,orderType 指定该订单是否可以部分履行,并且该订单是否限制在特定方或对所有人开放。

zone 是另一个可以在订单受到限制时履行订单或取消订单的账户。此外,zone 可以使用 zoneHash 和用户定义的验证规则来验证订单。

conduitKey 是一个 bytes32 的 conduit,负责转移订单中的资产。如果未指定 conduitKey,Seaport 合同将充当转移订单所涉及资产的代理。

转移的资产

在 Seaport 中,卖方出售的资产被指定为“offer”,而买方支付的款项被指定为“consideration”。offer 包括:

  1. token: Token的地址
  2. identifierOrCriteria: Token ID 或 merkle proof
  3. startAmount: 履行订单前的数量
  4. endAmount: 履行订单后的数量

如果 startAmount 等于 endAmount,则该订单被视为固定价格订单。然而,如果 endAmount 大于 startAmount,则该订单被视为拍卖,因为价格由 start/end Amount、start/end Time 和履行订单时的时间戳决定。

2. 订单验证

在 fulfillBasicOrder 中,订单制作者签署的订单组件被转换为 BasicOrderParameters。

struct BasicOrderParameters {
  address considerationToken;
  uint256 considerationIdentifier;
  uint256 considerationAmount;
  address payable offerer;
  address zone;
  address offerToken;
  uint256 offerIdentifier;
  uint256 offerAmount;
  BasicOrderType basicOrderType;
  uint256 startTime;
  uint256 endTime;
  bytes32 zoneHash;
  uint256 salt;
  bytes32 offererConduitKey;
  bytes32 fulfillerConduitKey;
  uint256 totalOriginalAdditionalRecipients;
  AdditionalRecipient[] additionalRecipients;
  bytes signature;
}

Seaport 合同通过以下步骤验证订单的履行:

  1. 调用值:如果 considerToken 不是 ETH,调用值必须为零;如果是,则必须为非零。
  2. 时间:订单履行的时间戳必须在 startTime 和 endTime 之间。
  3. 参数:偏移量和 orderType 必须有效。
  4. 考虑长度:考虑长度不得少于原始考虑。
  5. zone 验证:如果订单受限,资产必须经过 zone 验证。
  6. 签名:签名必须由 offerer 签署。
  7. 状态:订单不得已被取消或完成。

3. 资产转移

使用 Seaport 时,无需在第一次交易资产之前注册自定义代理,这与 Wyvern 不同。相反,资产可以通过 Seaport 合同或由订单制作者指定的 conduit 进行转移。

具有 Seaport 的示例和图表

让我们来看一个卖方通过 Seaport 的 conduit 以 100 ETH 出售 BAYC #59 的示例,通过 Seaport flowchart。在这个例子中,订单制作者(卖方)创建订单并指定被出售的资产和收到的支付。

在订单的 offer 中,卖方指定以下内容:ItemType: ERC721, TokenAddress: BAYC, IdentifierOrCriteria: 59,StartAmount 和 EndAmount 为 1(用于 AmountDeriver)。考虑项则为 ItemType: Native, TokenAddress: 0x0, IdentifierOrCriteria: 0x0,StartAmount 和 EndAmount 为 100 ETH(以 wei 为单位),接收者为卖方的地址。

订单还包括订单开放的时间(StartTime 和 EndTime)和 orderType(FullOpen, 这意味着订单不能被部分履行,并且可以被任何人履行)。ConduitKey 设置为 Seaport 的 conduit,且没有限制谁可以履行该订单,因此 conduitKey、zone 和 zonehash 设置为 Seaport 的 conduit 和 Pausablezone。

当所有参数设置完毕后,卖方将自己列为 offerer,并签署该订单。买方随后通过调用 Seaport 合同的“FulfillOrder”函数来履行订单。让我们看一下在 Seaport 合同中履行订单的过程。

  1. OrderCombiner:此步骤合并多个订单,如果履行的订单是多个订单组合而成,例如使用 fulfillAvailableOrder 函数。FulfillmentApplier 过滤并检查匹配订单的有效性。
  2. OrderFulfiller:在过滤出要履行的订单后,AmountDeriver 推导出要转移的Token数量,并且 CriteriaResolution 解决将转移哪个Token,同时考虑 merkle proof 等准则。
  3. OrderValidator:此步骤使用先前概述的验证检查来验证订单,例如确保时间戳在开始和结束时间内,并确保订单未被取消或完成。
  4. Executor:最后一步将指定的Token(在本例中,BAYC #59)转移给订单履行者,而规定的付款(在本例中为 100 ETH)则转移给卖方。

Seaport 的更多特性

在 Seaport 中,用户可以控制他们的订单是如何被履行的。

1. OrderType

有四个选项可供选择:full/partial,open/restricted。如果订单设置为“full”,则整个订单必须由一个接单者履行。然而,如果设置为“partial”,接单者只可以履行订单的一部分。如果选择“restricted”,接单者只能来自特定的 zone。如果 orderType 设置为“open”,则任何接单者都可以履行该订单。

2. FulfillOrder

有四种履行方法:fulfillOrder、fulfillBasicOrder、fulfillAvailableOrders、matchOrders。

  1. fulfillOrder:通用订单履行,可以有任意数量的Token。
  2. fulfillBasicOrder:优化,用于履行一个 ERC721 或 ERC1155。
  3. fulfillAvailableOrders:填充一组订单,除了那些未激活、已完全填写或已取消的订单。
  4. matchOrders:与一组履行匹配任意数量的订单,将 offer 分配给 consideration。

3. Zone 和 Conduit

Zone:如果 orderType 设置为“restricted”,则必须指定一个 zone。这个 zone 将能够访问和履行该订单,并具有定制的有效性检查。

Conduit:Conduit 是一个Token的代理,conduit 的所有者可以添加或删除通道。conduit 的所有者可以转移Token,但应小心批准Token的转移至 conduit。

结论

Seaport 是一个强大、高效且复杂的市场协议。Seaport 1.2 正在开发中,我们将在发布后介绍新版本的 Seaport。如果你有任何问题,请随时留言。我期待听到你的想法并与你进行讨论。

  • 原文链接: medium.com/@justinzen/ho...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
justinzen
justinzen
江湖只有他的大名,没有他的介绍。