大手NFTマーケットプレイスOpenSeaのスマートコントラクトをはじめとする技術調査
このTweet にもあるように、今最もトランザクションがあるNFTマーケットプレイスのOpenSea。今回は、OpenSeaが実際にデプロイしているスマートコントラクトのソースコードを解読し、実際のイベントログも見ながら、OpenSeaの仕組みを技術的な側面から考察していきたいと思います。今回、調査して色々発見がありましたが、OpenSeaはマーケットプレイスの中でも Decentralized な志向が強く、多くのNFTを取り込んで行くオープンな設計であることが分かりました。
Axie Infinityってゲームってカテゴリーの認識だったけど、NFTマーケットプレイスとしても全然違和感がない。むしろ超絶でっかい!すぐカテゴライズする発想はきっと古いんだろうなぁ https://t.co/CaZ5Vxg61S
— syamasaki (@syamasaki_com) October 25, 2021
OpenSeaの主要スマートコントラクト
調べてみたところ、OpenSeaがデプロイしているメインのコントラクトは以下のようです。漏れがあるかもしれませんが、このコントラクトを理解しておけばOpenSeaの取引所の挙動の大枠は理解できます。
コントラクトの種類 | コントラクトアドレス |
---|---|
Exchange (WyvernExchange) | 0x7be8076f4ea4a4ad08075c2508e481d6c946d12b |
OPENSTORE (ERC1155) | 0x495f947276749ce646f68ac8c248420045cb7b5e |
WyvernExchangeは、実際のマーケットプレイスの売りと買いのオーダーをマッチングさせる時のロジックが記述されており、マッチ時のトークンの送金関係、NFT自体の転送も行っています。OPENSTOREは、OpenSeaのサービス上でNFT(ERC1155)を発行する際に実行されるスマートコントラクトで、OpenSea上のNFTはこのスマートコントラクトが管理している模様です。ERC721についても同様のスマートコントラクトがあるのかと思ったのですが見つけられませんでした。
WyvernExchangeのスマートコントラクトは、実際に上記の etherscan のサイトからソースコードを見ることができます。etherscan のソースコードは、依存関係のあるコントラクトが一つのファイルにズラッと記述されていて分かりづらいので、コントラクト毎にファイルに分けて整理したものをGithubに上げています → WyvernExchangeのソースコード
次に、WyvernExchange について解読したいと思います。
ソースコード解読
WyvernExchangeに関わるコントラクトの全体像は以下のようになります。
継承をする、もしくは、そのコントラクトを変数として利用する、場合、コントラクトは別のコントラクトに依存しており、その依存関係を矢印で示しています。色々コントラクトがあって解読するのが大変そうですが、肝となるのは ExchangeCore
で、ここに取引所としてのロジックがほとんど書かれています。
ExchangeCoreのコードは、Solidityにて700行強で書かれています。ソースコードを実際に見る場合は Githubを参照ください → ExchangeCore.sol
ここではコードを読んでみて把握しておくべきと思うことを列挙したいと思います。
- 取引で使われる通貨は Ether はもちろん、Ether以外でも任意のERC20トークンを利用できる。ただし、売り注文と買い注文で、利用通貨を一致させる必要がある(Order.paymentToken)。
- maker/taker という表現が出てくるが、先に価格を作る人をmaker、後で取引に応じる方をtakerと呼ぶらしい。
- 外部から実行する主要なメソッドは以下の通り (ExchangeCoreは内部利用向けで、Exchangeに定義されている)
- approveOrder(): 注文を承認する
- cancelOrder(): 注文をキャンセルする
- atomicMatch(): 売り注文と買い注文をマッチさせる(取引の成立)
- 各メソッドを実行したときに、以下のイベントが発火される
- OrderApprovedPartOne
- OrderApprovedPartTwo
- OrderCancelled
- OrdersMatched
- NFT自体の転送は、ターゲットとなるコントラクトに対して proxy を通じて call / delegatecall する形で safeTransferFrom() を実行する。つまり、ERC721, ERC1155の規格に従っていれば、どこに定義されているNFTでも問題ない
他にも手数料のロジックなどが記載されているのですが、ここでは割愛します。コードを読んでみて、支払いトークンが任意のERC20トークンで良いこと、NFT自体も任意のERC721, ERC1155で良いことが分かり、非常にOpenSeaはオープンな設計であることが分かりました。
ウェブアプリケーションのUI上では、トークンの売買の利用通貨を制限していたのですが、スマートコントラクト上では対応できる作りになっているようです。
スマートコントラクトのイベント集計
ちょっと本筋からズレますが、OpenSeaのスマートコントラクトがイベントを発火させているので、昨日(2021/11/03)からそのイベントを集計してみました。タイムスタンプはグローバルサービスなので UTC にしています。OrdersMatchが売り買い注文のマッチ時に発生するもの、TransferSingleは ERC1155トークンの所有者の転送が行われた時に発生するものです。
OpenSeaのExchangeのイベント(OrdersMatch)の一覧はこちらになります → Opensea: Exchange Events
あと、OpenSeaのNFT(ERC1155)のイベント(TransferSingle)の一覧はこちらになります → Opensea: NFT(ERC1155) Events
OrdersMatchでは、maker / taker のアドレス が取得できるのと、price においてその取引の価格が取得できます。TransferSingle では、operator, fromアドレス, toアドレス, トークンIDが取得できます。OrdersMatch の price は、コードを読む限り、取引は Ether だけではなく、ERC20トークンも対応可能なので、Ether と ERC20トークン が混ざってしまっている気がします。ただ、イベントをざっと見たところ Ether 建てのような印象も受けます。通貨が混ざってしまうとよくわからない指標になってしまいますね。
現在、記事を書いている 2021/11/04 13:20 (JST) において、OrdersMatch イベントが 計14332件、TransferSingleイベントが計2018件 となっています。ここから分かるのは、OpenSea上での取引の 14%程度しか、OpenSea が提供する ERC1155トークンを利用していないことが分かります。おそらく 86%程度は、OpenSeaが提供する ERC1155トークンではなく、独自にデプロイした NFTなのではないでしょうか。
任意のNFT(ERC721)をOpenSeaに掲載する方法
では、独自にデプロイした NFT をどのように OpenSea 上に掲載するのでしょうか。
それは非常に簡単でした。ここに一連の流れが記載されているドキュメントがあります → OpenSea Developer Tutorials
このドキュメントによると、推奨する手順で ERC721スマートコントラクト もしくは ERC1155スマートコントラクトをイーサリアムのメインネット もしくは テストネット(rinkeby) にデプロイし、該当するスマートコントラクトでNFTの発行(ミント)をするだけでOKです。
例えば、テストネットでNFTを発行した後で、https://testnets.opensea.io/assets/<asset_contract_address>/<token_id>
というURLをブラウザで開けば、OpenSea 上でNFTを表示することができます。また、Get Listed on OpenSea でNFTスマートコントラクトのコントラクトアドレスを登録すれば、一気にNFTが掲載されるようです。
もちろん、NFTの所有権も勝手に調べてくれて、自分が所有するNFTは自分のアカウント配下に表示されるようになります。
OpenSeaのNFTのカバレッジを概念図にしたのが以下になります。OpenSea自体は、取引所のスマートコントラクトを始め、OPENSTORE(ERC1155)スマートコントラクトを自社でデプロイしています。しかし、一方で自社の管轄外である、他社がデプロイしたNFTスマートコントラクトさえもOpenSeaに掲載するNFTとしてカバーしています。これは、ブロックチェーン自体を分散型データベースとして捉え、ブロクチェーン上のものは全て規格さえ合えば取り込めるようにした典型でしょう。OpenSeaがここまでオープンな構造だとは知りませんでした。
まとめ
以上、OpenSeaの仕組みをスマートコントラクトの実装から紐解いてみました。
OpenSeaにおいて理解しておくべきことをまとめてみます。
- OpenSea で掲載されているNFTは、OpenSea社独自のNFTだけに限らず、任意の第三者がデプロイしたNFTも含まれる(他NFTマーケットプレイスで取引されたNFTも含まれるでしょう)
- OpenSea のマッチイベントを計測した結果、全マッチングのうち、OpenSea社が用意しているNFTの取り扱い割合は 約14%程度に過ぎない。85%程度は、独自NFTである可能性がある。
- OpenSea の 取引所スマートコントラクトでは、売買の利用通貨で Ether はもちろん、任意のERC20トークンが利用できる仕組みになっている(ウェブアプリケーション上で制限をしている可能性あり)
個人的には、OpenSeaはもう少し中央集権的な構造なのだと思っていたのですが、分散型でオープンな設計であることが分かりました。他のNFTマーケットプレイスはどのような仕組みなのでしょうか。引き続き、技術的な側面も含めて、サービスや取引所を解読していきたいと思います。