OpenSeaの仕組みを理解しよう https://note.com/dkcrypto1/n/nd41962e151ae

note.com

OpenSeaのスマートコントラクトによるエスクロー決済の解説の記事。@niwatakoさんから教えてもらった。

著者の@dkcrypto1さんは業界内の人らしい。

分かったこと

  • それぞれの売買方法でトランザクションが購入者/買い手・販売者/売り手どちら方向から行われるかで制約が違う
  • OpenSeaのスマートコントラクトの実体がWyvern Exchange Contract https://etherscan.io/tokens/label/opensea
  • 販売時点ではスマートコントラクトに自分のウォレットにあるNFTを移動する許可を与える。この時GAS代が発生する
  • NFTの移動を行うのがOpenSeaの代理人AuthenticatedProxyで、各ウェレットごとに存在する
  • OpenSeaのサーバーに署名済みのSell Orderがオフチェーンで記録される
  • 購入時点では買い手がOpenSeaから取得したOrderを特定できるを付けて自分のウォレットからトランザクションを実行する
    • Sell Orderを取り消すにはオンチェーン操作が必要になりGAS代
    • Sell Orderの価格がここに記録されているので署名して作り直さないと価格は変えられない
    • 価格を低く変更した時は購入時の量を調整すれば取引を満すことができるが増えると満たせないので価格は下げることしかできない
  • 買い手のトランザクションコントラクトによってETHを売り手のウォレットに移動する
    • コントラクトによって販売者のウォレットにあるNFTを買い手のウォレットに移管する
    • OpenSeaは仲介手数料を受け取る
  • 買い手が価格を提示する場合は方向が逆でBuy Orderの情報をオフチェーンで記録する
  • 売り手がBuy Orderを取得しトランザクションを実行してNFTの移動する
  • スマートコントラクトに移動を許可する対象がトークンになるのでECR20互換のWETHにする必要がある
  • 買い手から売り手へのWETHの移動はTokenTransferProxyという別のOpenSea代理人がいる

感想

  • これらのスマートコントラクトと代理人を使った買い手と売り手のトランザクションを色々なパターンで組合せることでOpenSeaの各体験が成り立っている
  • オフチェーンを使うことでGas代発生ポイントを減らしUXを向上できているがオンチェーンでない制約がある

他の記事

他に自分で検索して「スマートコントラクトによるエスクロー決済」も読んだ。

https://note.com/yamapyblack/n/n666d2f5870ae

著者はCryptoGames CTOの@yamapyblackさんで、たぶんこの記事を元にしたスライドが以下

https://jba-web.jp/cms/wp-content/uploads/2021/06/%E5%B0%8F%E6%BE%A4%E6%A7%98_CryptoGmes%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE_JBA-NFT%E5%8B%89%E5%BC%B7%E4%BC%9A.pdf

分ってないこと

思考実験的に「opensea.ioへのアクセスが完全に遮断された状態でこの機能が使えるのか?=そうなのなら分散型っぽくない?」と思ったので考えてみたのだけど以下がクリアでない

  • ウォレットブラウザ拡張はサイトに対して許可を与えているようなUXに見えるけどサイトにアクセスできない時はクライアントプログラムはどう振る舞うのか?
  • コントラクトのアドレスに向けてサイトからブラウザで行っているトランザクションを行えばOpenSeaの機能を再現できるのか?
  • 「出品中のリストを見る」機能などはブロックチェーンの外にあるのか? そうならopensea.ioへのアクセスできない時はどう収集するのか
  • Sell Order/Buy Orderを二者間で送信する方法