EthereumにおけるNFTのロイヤリティの仕組みを俯瞰する
はじめに
セカンダリマーケットにおける手数料の一部をクリエイターに回すことができる仕組みは、作品をNFTにすることのメリットの一つとして挙げられることは多いです。ここでいう手数料がロイヤリティです。
継続的な報酬がクリエイターに入ることでプロジェクトの持続可能性が上がり、NFTのホルダーにとってもwin-winな仕組みといえます。
しかし、作品をNFTにするだけで勝手にロイヤリティが入るわけではないことに注意しなければいけません。NFT自体にロイヤリティ情報を持たせることはもちろんですが、それらを売買するマーケットプレイスの設計にも依存します。
そこで、これからNFTを開発する方にもわかりやすく、ロイヤリティの仕組みや組み込み方法をまとめたいと思います。
前提
- ERC721/ERC1155で発行したNFTが対象
- セカンダリセールでのロイヤリティ分配を想定
tl;dr
- ロイヤリティの分配はマーケットプレイスにも依存するよ
- マーケットプレイスを跨いだNFTの作成・売買は、ロイヤリティが受け取れない場合があるよ
- 既にNFTを発行済みだけどロイヤリティの設定を忘れてしまった場合は、Royalty Registryがあるよ
NFTにおけるロイヤリティとは
基本的にNFTはOpenSeaなどのマーケットプレイスで売買されます。マーケットプレイスには、幅広いカテゴリを横断的に扱っているものや、特定のカテゴリに特化しているもの、特定のゲーム内アイテムに特化しているものなど数多くのタイプが存在しています。
そして、ロイヤリティの分配は基本的にマーケットプレイスなどのアプリケーションレイヤーの実装方法に左右されます。
分配タイミング
NFTを売買するときに、マーケットプレイスへの手数料やクリエイターへのロイヤリティが分配されます。このとき、手数料はマーケットプレイス側で設定されている割合で勝手に徴収されるのですが、ロイヤリティはNFTの作成者が独自に設定する必要があります。
分配の実現方法
これはマーケットプレイスによって異なります。要はロイヤリティ情報をどこに保存しているのかの違いです。例えば、従来のDB管理(オフチェーン)やスマートコントラクト上での実装(オンチェーン)などの方法があります。
いくつか代表的な例を挙げます。
マーケットプレイス | 規格 |
---|---|
OpenSea | オフチェーン |
Rarible | 独自規格(オンチェーン) |
Foundation | 独自規格(オンチェーン) |
Coinbase NFT | ERC2981 + Royalty Registry |
ここで気をつけなければならないのが、NFTのミント・売買が複数マーケットプレイスを跨ぐとロイヤリティを受け取れない(場合がある)、ということです。
OpenSeaは分かりやすいと思うのですが、ロイヤリティ情報が運営のDBに保存してあるとき、それ以外のマーケットプレイスはロイヤリティ情報にアクセスできません。そのため、OpenSeaのストアフロントでミントしたNFTは、OpenSeaで売買されない限りロイヤリティを受け取ることができません。(OpenSeaの取引ボリュームを鑑みて、他のマケプレで売買されることを想定しないという考え方もあります)
また、ERC2981というのはEthereumのプロトコルレイヤーで定義されたロイヤリティの規格です。この規格が作成されたのは2020年なので、現在使われているメジャーなマーケットプレイスでも対応していないところは多いです。先日一般公開されたCoinbase NFTは対応しているので、今後出てくるマーケットプレイスはこのようなロイヤリティの仕組みがスタンダードになると思います。(願望)
Royalty Registryについては後で説明します。
(余談)複数アドレスにロイヤリティを分割するには?
上記ERC2981の規格では、ロイヤリティを送るアドレスは1つしか指定することができません。Foundationにはロイヤリティを複数人に分配するSplitという便利な機能があるにもかかわらず、プロトコル側の規格でユースケースが制限されてしまっては利便性を損なってしまいます。
ただこのSplit的な機能は、送付先のアドレスをコントラクトアドレスにすることで実現できます。つまり送られてきたロイヤリティをコントラクト内にプールしておき、分配のルールをそのコントラクト内に記述しておくのです。別のコントラクトを追加利用することで、規格の局所最適化をせずに済みます。
基本的にプロトコルレイヤーではあまり多くの仕様を網羅することを嫌う節があり、できるだけシンプルな構成が求められます。もちろんこのあたりの議論もissue内で行われているので、気になる方は参照してみてください。
それで、私はロイヤリティを受け取れるの?
受け取れるパターン
- NFTのミント・売買が1つのマーケットプレイスで完結している場合
- OpenSeaでロイヤリティを設定し、OS内で売買された場合
- 独自コントラクト(ERC2981対応済み)で作成し、ERC2981に対応したマーケットプレイスで売買された場合
受け取れないパターン
- NFTのミント・売買が、オフチェーンまたは独自規格を採用するマーケットプレイスを跨ぐ場合
頑張れば受け取れるパターン
- 独自のオンチェーンロイヤリティ規格を採用しているマーケットプレイスでミントし、Coinbase NFTのような規格のマーケットプレイスで売買された場合
- 独自コントラクト(ERC2981未対応)で作成し、Coinbase NFTのような規格のマーケットプレイスで売買された場合
頑張れば受け取れるというのは、Royalty Registry上で追加設定を行う必要があります。
Royalty Registryとは
一言で言えばロイヤリティ送付先のアドレスを参照できる掲示板です。つまり、既にデプロイ済みのスマートコントラクトを改変することなくロイヤリティ情報を設定できます。
コントラクトのオーナーであれば、上部のconfigureから設定することができると思いますが、詳細は公式のドキュメントを参照してください。
(Royalty Registryに登録していてもマーケットプレイスが参照してくれないと意味がない点は再度ご注意ください)
まとめ
Ethereumにおける現状のロイヤリティの仕組みをまとめました。コントラクトで定義して終わりではなく、どこのマーケットプレイスで売買されるかによって分配が行われなかったりと、多少複雑な部分もありますが参考になる部分が少しでもあれば幸いです。
ロイヤリティの仕組みについて調べるにつれて、独自コントラクトでNFTを作成しておくことが未来の選択肢を減らすリスクヘッジになるかなと思いました。
参考
Discussion