本文详细介绍了Seaport协议的背景、工作原理及其在NFT市场中的应用,探讨了订单匹配、验证和资产转移的过程,强调了该协议的高效性及其多种订单类型助力用户灵活进行资产交易。整体结构清晰,内容丰富,适合想深入了解NFT市场的人士阅读和学习。
它是一个关于 NFT 交易探索的系列。如果你想创建你的 NFT 或与同行交易你的 NFT,或者将来在社交媒体上拥有一个市场,你可以尝试 MoonPier 或加入我们的 discord 获取更多信息。
Seaport 由 OpenSea 的 0age 开发,是一个强大而复杂的协议,基于汇编代码构建。考虑到 protocol 的复杂性以及在 official documentation 中提供的大量信息,我受到启发,想深入了解 Seaport 背后的设计原则。这促使我撰写了一系列有关 NFT 市场的文章,供那些像我一样希望更深入研究该协议的人参考。
在 2022 年 5 月,OpenSea 发布了 Seaport protocol,并将其集成到其市场中,从 Wyvern 转向 Seaport。Seaport 的一些关键特性包括其Gas效率、支持多个资产的转移能力以及在集合和特征级别进行报价的能力。你可以阅读 post 以获取 Seaport 的更多功能。
图 1. Seaport 的特性
与使用原子匹配过程在卖方和买方之间进行订单匹配的 Wyvern 协议不同,Seaport 利用履行订单方法来匹配订单。卖方或买方可以列出订单,另一方仅需满足订单中指定的要求。
Seaport 提供四种不同的履行订单的方法:
在这篇文章中,我们将更深入地了解使用 fulfillBasicOrder 的去中心化资产交换过程,这是一种用于在一笔订单中仅交易一件 NFT 的Gas优化方法。
如果你对为什么要交换加密资产感兴趣,请参阅以下文章
生产力、数字资产和资产交换 \ \ 想象一下,有人希望在你获得最新的 MacBook 后购买你的旧 MacBook。你唯一能做的就是列出……\ \ medium.com
订单制作者签署的订单组件可以分为两部分:信息、转移的资产。
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 包括:
如果 startAmount 等于 endAmount,则该订单被视为固定价格订单。然而,如果 endAmount 大于 startAmount,则该订单被视为拍卖,因为价格由 start/end Amount、start/end Time 和履行订单时的时间戳决定。
在 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 合同通过以下步骤验证订单的履行:
使用 Seaport 时,无需在第一次交易资产之前注册自定义代理,这与 Wyvern 不同。相反,资产可以通过 Seaport 合同或由订单制作者指定的 conduit 进行转移。
让我们来看一个卖方通过 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 合同中履行订单的过程。
在 Seaport 中,用户可以控制他们的订单是如何被履行的。
有四个选项可供选择:full/partial,open/restricted。如果订单设置为“full”,则整个订单必须由一个接单者履行。然而,如果设置为“partial”,接单者只可以履行订单的一部分。如果选择“restricted”,接单者只能来自特定的 zone。如果 orderType 设置为“open”,则任何接单者都可以履行该订单。
有四种履行方法:fulfillOrder、fulfillBasicOrder、fulfillAvailableOrders、matchOrders。
Zone:如果 orderType 设置为“restricted”,则必须指定一个 zone。这个 zone 将能够访问和履行该订单,并具有定制的有效性检查。
Conduit:Conduit 是一个Token的代理,conduit 的所有者可以添加或删除通道。conduit 的所有者可以转移Token,但应小心批准Token的转移至 conduit。
Seaport 是一个强大、高效且复杂的市场协议。Seaport 1.2 正在开发中,我们将在发布后介绍新版本的 Seaport。如果你有任何问题,请随时留言。我期待听到你的想法并与你进行讨论。
- 原文链接: medium.com/@justinzen/ho...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!