見出し画像

OpenSeaの仕組みを理解しよう

OpenSeaでのNFTの売買はどういう仕組みなの?

OpenSeaを利用してNFTを売買したことがある人はたくさんいると思いますが、その仕組みがどうなっているかを理解している人は少ないかと思います。(解説記事もあまり見当たりません。)
そこで今回は、なるべくわかりやすくOpenSeaでの売買の仕組みを解説したいと思います。

この記事を読むと

  • なぜ売り注文を出すときはGas代がかからないのか?

  • 注文のキャンセルにGas代がかかるのはなぜ?

  • 売り注文の価格は、下げられるのに上げられないのはなぜ?

  • Offer出すときはETHじゃなくてWETHなのはなぜ?

みたいな疑問が解決されます。

Buy Now, Make Offer, Auction

OpenSeaで売買を成立させる方法は、大きく分けて以下の3つがあります。

Buy Now:売り手が固定の価格を提示して、買い手がそれを受ける
Make Offer:買い手が価格を提示して、売り手がそれを受ける
Auction:オークション形式で落札を行う

それぞれの仕組みを見ていきましょう。

Buy now 

OpenSeaではNFTの売り手が値段を提示して、買い手が「Buy Now」ボタン
を押すことで、その値段でNFTを購入することができます。

NFTの売り手

  1. NFTの移動をOpenSea内の代理人(AuthenticatedProxy)に承認する(ERC721.setApproveForAll)

  2. 売りたいNFTに対して金額や期間を設定し、売りの注文 Sell Order を作成

  3. Sell Orderに署名を行う(Signed Message)

  4. 署名済みのSell OrderをOpenSeaに送信する

  5. OpenSeaのサーバーがSell Orderをオフチェーン(イーサリアムの外)で保管する。

NFTの買い手

  1. Sell OrderをOpenSeaのサーバーからロードし、買いたい売り注文を選ぶ

  2. Buy Orderを生成し、Sell OrderとともにOpenSeaのContract(WyvernExchange)へ向けてイーサリアムのトランザクションを発生させる。(WyvernExchange.atomicMatch_)

  3. OpenSeaのContractは送られてきたトランザクションからBuy OrderとSell Order、ETHを受け取り以下を実行。

    1. Buy Orderのパラメータのチェックを行う

    2. Sell Orderの署名の検証を行う

    3. Sell Orderの有効性のチェックを行う(有効期限切れてないか等々)

    4. 送られてきたETHを売り手へ移動

    5. 手数料分のETHをOpenSeaのアドレスへ移動

    6. 売り手の代理人を呼び出し、NFTの移動を依頼

*これはETHにて支払いを行った場合です。DAI等のERC20で行うとTokenのapprovalが必要です。

Gas代の節約とセキュリティ

代理人(AuthenticatedProxy)は1アドレスにつき各1人作成されます。
その代理人は承認したすべてのNFTを移動する権限を持っています。
この代理人への承認がイーサリアムのトランザクションとなりGas代がかかります。
これは各NFTのコントラクトに対して1回行えばOKです。
例えば同じコレクションの別のNFTを売る場合は不要です。
Sell Orderの保存はイーサリアムの外で行っているためGas代はかかりません。

イーサリアムの外で保存してるのでセキュリティは大丈夫か?と思うかもしれません。
しかしたとえ保存しているSell Orderをハッカーが盗み出したとしても、署名を改竄する必要があるためSell Orderを改竄することができません。
この仕組みを利用してガス代の節約を行っています。

注文キャンセル

売買が成立する前ならば、注文をキャンセルすることができます。
注文のキャンセルは、キャンセルしたい側がトランザクションを発生させ、OpenSeaはContract上にCancel Orderを保存します。
そのため、キャンセルする場合はGas代がかかります。

「あれ?オフチェーンで保存されている注文を削除すればいいのでは?それならGas代必要なくない?」

と思うかもしれませんが、オフチェーンで保存している注文だけを削除しても、事前に署名済みのOrderを入手していれば売買できてしまいます。
そのため、キャンセルしたという情報をチェーン上に書きこむ必要があります。
売買の成立前に、このキャンセル注文がないかどうかOpenSeaはチェックしています。

売り注文の価格を上げられないのはなぜ?

OpenSeaでNFTの売り注文を出したことがある方は知ってると思いますが、一度固定価格で売り出した注文は、価格を下げることはできますが上げることはできません。
これも注文をオフチェーンに記録していることが関係しています。

例えば、あるNFTを5ETHで売りに出したとしましょう。
そこから値段を6ETHに変えたとします。
このとき、既に初めに出した5ETH のSell Orderを入手していれば、5ETHで注文を出すことができます。
チェーンの外で注文の保存を行っているため、最新の注文が6ETHであると保証できないからです。

逆に5ETHで売りに出した後、4ETHに変更したとしましょう。
初めに出された5ETHのSell Orderを入手したとしても、最新の注文が4ETHなので古い注文を出すメリットがありません。

つまり、常に最新の注文は最安値である必要があります
売り出し価格を上げたい場合、一度キャンセルし(キャンセルの注文はオンチェーンで記録される。前述。)、もう一度注文を作り直す必要があります。

Make offer

「Buy Now」とは逆に、Make Offerすることで買い手が売り手に価格を提示できます。
次はMake Offerの内部がどうなっているかを解説していきます。

NFTの買い手

  1. WETHの移動をOpenSea内の代理人(TokenTransferProxy)に承認する。(ERC20.approve)

  2. 買いたいNFTに対して金額や期間を設定し、買い注文 Buy Order を作成

  3. Buy Orderに署名を行う(Signed Message)

  4. 署名済みのBuy OrderをOpenSeaのサーバーに送信する

  5. OpenSeaのサーバーはBuy Orderをオフチェーン(イーサリアムの外)で保管する。


NFTの売り手

  1. 買い手の出したBuy Orderをロードする。

  2. 売りたい注文を選ぶ(acceptする)

  3. NFTの移動を代理人(AuthenticatedProxy)に承認する(ERC721.setApproveForAll)

  4. Sell Orderを生成し、Buy OrderとともにOpenSeaのContract(WyvernExchange)へ向けてイーサリアムのトランザクションを発生させる。(WyvernExchange.atomicMatch_)

    1. Sell Orderのパラメータのチェックを行う

    2. Buy Orderの署名の検証を行う

    3. Buy Orderの有効性のチェックを行う(有効期限切れてないか等々)

    4. 以下のWETHの移動を代理人(TokenTransferProxy)に依頼する

      • 手数料分

      • 売り手→買い手

    5. 売り手の代理人(AuthenticatedProxy)を呼び出し、NFTの移動を依頼

なぜWETHが必要なのか?ETHじゃだめなのか

Buy Nowでは売り手が先に売り注文を作成し、買い手がトランザクションを発生させていましたが、Make Offerでは逆になります。
Make Offerの場合は売り手がトランザクションを発生させ、トークンの移動は買い手→売り手になります。
トランザクションの発生元とトークンの送り元が違うので、transferFrom(第三者がAからBへトークンを移動させる)が実装されていないETHは使用することができません
これがMake OfferのときにERC20のWETHを使用しなければいけない理由です。

Auction

Auctionは以下の二つの形式があります。

  • Sell to highest bidder(イングリッシュオークション形式):期間内に最も高い値段を提示したオファーをaccept

  • Sell with declining price(ダッチオークション形式):初めに設定した価格から時間の経過とともに値段が下がっていく

Sell to highest bidder

基本的な仕組みはMake Offerとほぼ同じです。
売り手がオークション用のSell Orderに署名し、買い手はその条件にマッチした買い注文のBuy Orderを作成し署名します。
売り手は、Buy Orderを受け入れる場合は、acceptを押してトランザクションを発生させます。
そのためGas代は売り手が払います。
売り手がトランザクションを発生させるため、ETHは使用できません。
acceptしないことによって、売り手は買い手の落札を拒否できます。

Sell with declining price

基本的な仕組みはBuy Nowとほぼ同じです。
初めに売り手が設定した値段が徐々に下がっていき、買い手は満足する値段に到達したら、Buy Orderのトランザクションを発生し購入します。
そのためGas代は買い手が支払います。
買い手がトランザクションを発生させるためETHを用いることができます。

まとめ

OpenSeaではこのような仕組みで売買が行われています。

割と細かいところで「何でこんな仕様になってんの?」と思うことが多々あるかと思いますが、仕組み上の理由なことが多いです。

仕組みをちゃんと理解してLet's Enjoy NFT!

この記事が気に入ったらサポートをしてみませんか?