NFT市场如何运作-1:Wyvern

  • justinzen
  • 发布于 2022-10-18 13:52
  • 阅读 11

本文详细介绍了Wyvern协议在NFT交易中的重要性与工作原理,包括订单匹配、验证和资产转移等关键组成部分。文章还讨论了Wyvern 2.2到2.3的更新,及其对NFT交易的影响,同时提到了存在的局限性及对Seaport协议的引入。整体上,文章结构清晰,涵盖了技术细节和逻辑,让读者对Wyvern协议有深入的理解。

这是一个关于 NFT 交易探索的系列。如果你想与同行一起出售你的 NFT 或在社交媒体上建立一个市场,你可以尝试 BlockBoat 或加入我们的 discord 以获取更多信息。

图 1. Wyvern 协议与 OpenSea

背景

在 2018 年,一些 ERC20 代币交易所将买方与卖方匹配以进行代币交易。Wyvern 团队建立了这样的结算交易所的 ERC721 版本。然而,依赖中央交易所交易资产存在一些缺点,例如容易出现错误的看门人以及由于界面限制导致的市场分割。Wyvern 团队构建了 Wyvern 协议,使订单匹配和资产交易能够在不依赖于特定交易所的情况下自动进行 [1]。此外,Wyvern 协议被 OpenSea 利用,成为使用最广泛的合约之一。

Wyvern 协议如何工作

我们从三个方面推测 NFT 交换协议:订单匹配、订单验证和资产转移。如果你对这三部分的原因有更多兴趣,请参考 Productivity, Digital asset, and Asset exchange

1. 订单匹配

Wyvern 协议 [2] 通过原子匹配将卖方和买方匹配。当订单匹配时,卖方和买方列出的两个订单分别满足对方订单的要求。

当卖方出售 NFT 时,她需要指定要出售的 NFT、期望收到的价格和费用。订单可以分为 info被售资产期望支付费用

Order {
  address exchange;
  address maker;
  address taker;
  uint makerRelayerFee;
  uint takerRelayerFee;
  uint makerProtocolFee;
  uint takerProtocolFee;
  address feeRecipient;
  FeeMethod feeMethod;
  SaleKindInterface.Side side;
  SaleKindInterface.SaleKind saleKind;
  address target;
  AuthenticatedProxy.HowToCall howToCall;
  bytes calldata;
  bytes replacementPattern;
  address staticTarget;
  bytes staticExtradata;
  address paymentToken;
  uint basePrice;
  uint extra;
  uint listingTime;
  uint expirationTime;
  uint salt;
}

信息

用户必须指定要交互的 exchange 合约,谁是订单创建者,以及资产交易的 side,可以是买入或卖出。taker 的地址是可以接受订单的限制方。如果对 taker 没有限制,它将是 ZERO ADDRESS。salt 由不同的随机数字指定,以防止重复的订单匹配。

被售资产

相对在订单中列出转移的资产,资产的转移被抽象为 calldata。(如果你不知道什么是 calldata,请参考这篇优秀的 文章。)订单列出了在资产转移阶段将要执行的操作,包括要调用的 target 地址、calldatahowToCall(call/delegateCall)。

例如,假设卖方列出一个将 BAYC #0 售予 买方 的订单。你可以创建一个订单:

  • target: BAYC 的地址
  • calldata: transferFrom(seller, buyer, 0) 的 calldata
  • howToCall: 0 (call)

如果订单创建者没有限制谁可以接受该订单,则在创建订单时,calldata 的 to 地址是未知的。因此,replacement 将与 calldata 相同位长,分配要被对方订单替代的位。以下示例中,卖方指定未知地址以替换买方订单中 calldata 的 to 地址。

图 1. 订单中的 calldata 和替代

期望支付

根据 paymentTokenbasePrice,支付可以是 1 ETH 或 2 USDC。订单的 saleKind 可以是 FixedPrice 或 DutchAuction。在 DutchAuction 中,最终价格根据执行交易的时间戳、listingTimeexpirationTimeextra(即拍卖的最低出价增量)而变化。

费用

费用可以根据费用支付者和费用类型进行划分。费用支付者可以是 maker,费用类型可以是 relayer 费用或协议费用。所有四种费用类别是 makerRelayerFeetakerRelayerFeemakerProtocolFeetakerProtocolFee。确认费用金额后,订单创建者指定费用接收地址作为费用接收者。费用支付者可以通过两种 feeMethods 支付费用:ProtocolFee 或 SplitFee。当选择 SplitFee 时,支付者按买方支付的款项的一个部分支付费用。另一方面,当 feeMethod 是 ProtocolFee 时,费用支付者使用 Wyvern 代币支付费用。

2. 订单验证

在订单匹配器提交来自双方的两个订单并执行 atomicMatch 后,Wyvern 合约将对这些订单进行身份验证和验证。Wyvern 协议中有两项验证在原子匹配订单时需要进行。一项是在资产转移之前的验证,另一项是在资产转移之后的 staticCall 检查。

资产转移前的验证

  1. 订单创建者对订单的签名。
  2. 两个订单中的所有参数在两者间有效且一致。
  3. 两个订单都没有完成或被取消。
  4. 替换后的两个订单的 calldata 相同。

资产转移后的静态调用

未提及的订单剩余元素为 staticTargetstaticExtradata。在资产转移后,合约将调用静态调用到 staticTarget,calldata 将结合卖方的 calldata 和 staticExtradata。订单创建者可以使用静态调用以确保资产转移后的新状态,卖方的 calldata 与预期一致。

由于在资产转移前,卖方和买方的 calldata、支付代币及支付金额均确认相同,因此在大多数情况下,staticCall 和 staticExtradata 是空的。

3. 资产转移

在验证完订单后,卖方的 calldata 将被调用以转移 NFT,支付和费用将分别转移到卖出订单的创建者和费用接收者。由于所有者不转移资产,因此必须有一个经过批准的委托来转移列出的 NFT 和支付代币(如果代币不是原生代币)。用户必须在其第一次原子匹配之前批准委托转移他们的代币(ERC20、ERC721)。如果批准的委托本身是交易所合约,则在交易所合约升级之后,用户必须每次都批准委托 [3]。因此,代理合约是必要的,使用户只需批准一次,无论将来合约更新多少次。代理有两种,tokenTransferProxy 用于转移 ERC20,OwnableDelegateProxy 用于转移 NFT。

TokenTransferProxy 和 OwnableDelegateProxy

tokenTransferProxy 是代理,用于从任何人那里转移所有 ERC20 作为支付代币。由于支付代币、金额和发送者在订单中明确记录,因此 tokenTransferProxy 只能在所有者创建并原子匹配有效订单后转移 ERC20。但是,如果所有用户使用相同的代理转移 NFT,则恶意用户可以通过 calldata 的执行转移任何人批准的 NFT。为了避免这种风险,用户必须在第一次原子匹配之前从 proxyRegistry 注册 OwnableDelegateProxy。

图 2. OwnableDelegateProxy

Wyvern 交易合约将调用 proxy 方法,这是合约 AuthenticatedProxy 到 OwnableDelegateProxy 的实现,包含来自发送者订单的 calldata 和目标,以及 howToCall 用于执行 NFT 转移。(如果你想了解更多关于代理模式的内容,请详细阅读这篇 文章

图 3. AuthenticatedProxy 中的代理方法

从 Wyvern 2.2 到 Wyvern 2.3

在 2022 年 1 月,OpenSea 被破解,导致 NFT 以较低的价格售出 [4]。对该漏洞的技术观察是,NFT 所有者签名的订单并未被取消,这样任何获取订单与签名的人都可以以之前列出的较低价格进行原子匹配。OpenSea 升级了 Wyvern 2.2 到 Wyvern 2.3,以允许用户通过增加用户在 Wyvern 合约中的 nonce 同时取消所有过去签名的订单。只有签名的订单,其 nonce 大于合同中用户的 nonce,才在原子匹配中有效。

Wyvern 2.3 引入三项升级来修复 Wyvern 2.2 中的限制 [5]。你可以查看 指南代码 获取更多信息。

  • 批量取消:添加每个用户的 nonce,使用户能够在一次交易中取消所有订单
  • EIP-712 [6]:用户签署类型结构化数据的订单
  • EIP-1271 [7]:订单可以由合约签署

图 4. Wyvern 2.2 和 2.3

结论

通过 Wyvern 协议进行 NFT 交易而无需中介,这是非常神奇的。然而,尽管 Wyvern 协议已从 2.2 升级到 2.3,但仍然存在一些限制。首先,订单中只有一个费用接收者。支付给 NFT 创作者和协议的费用不能在合约中同时拆分和转移。另一个限制是很难将多个资产包含在一次交易中。需要 Atomicizer 合约来实现多个资产交易,这使得整个协议更加复杂。为了解决这些限制,OpenSea 引入了 Seaport 协议,我们将在下一篇文章中讨论该内容。

BlockBoat

如果你想与同行一起出售你的 NFT 或在社交媒体上有一个市场,你可以尝试 BlockBoat,它使你可以随时随地与任何人交易 NFT。

BlockBoat \ \ BlockBoat\ \ BlockBoatwww.blockboat.xyz

如果你对 BlockBoat 感兴趣,请加入我们的 discord 获取更多信息。我们渴望听到你们的反馈!

加入 BlockBoat Discord 服务器! \ \ 在 Discord 上查看 BlocBoat 社区\ \ discord.gg

参考文献

[1] 宣布 Wyvern 交易所:任何以太坊资产,任何 ERC20 代币,无需信任

[2] Project Wyvern 以太坊智能合约

[3] 特殊情况:以 ETH 作为交易货币

[4] OpenSea 漏洞导致 Bored Ape Yacht Club NFT 以 1,700 美元的价格售出

[5] Wyvern 2.3:开发人员升级指南

[6] EIP-712:类型结构化数据哈希和签名

[7] EIP-1271:合约标准签名验证方法

感谢 Elton Liao

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

0 条评论

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