サイオステクノロジーの佐々木寛太です。 今回はNFT二次流通時のロイヤリティを還元するための情報を保持する規格のERC2981について解説したいと思います。
ERC2981とは
NFTのマーケットプレイスで実装されている仕組みであったロイヤリティ(二次流通で売買された際に売買金額のうち一定の割合がクリエイターに還元される仕組み)の還元方法に関する仕様です。 例えばNFTのロイヤリティが10%で設定されていた場合、NFTの所有者Aさんから購入者BさんへNFTの売買が成立した際にクリエイターに1万円の支払いが行われます。 ERC2981は支払い機能まではなくロイヤリティーの支払い総額を取得するところまでの規格で、実際の支払いはマーケット側で実装する必要があります。
ERC2981が実装される以前はロイヤリティの還元はマーケットプレイスの独自実装で行われておりそのマーケットプレイス外で売買が行われるとロイヤリティを還元することができませんでした。
ERC2981の最大の利点としてはどのマーケットでNFTを売買してもERC2981に対応しているマーケットであればクリエイターに支払うべきロイヤリティを知ることができるという点になります。 (あくまでも知るだけでロイヤリティの支払いを強制するわけではありません)
実装方法
では実際にどのようにロイヤリティ総額を取得することができるのかコードベースでみていきます。 今回参考にするのはOpenzeppelinです。
function royaltyInfo(_tokenId, _salePrice) returns (address, uint256) function _feeDenominator() returns uint96 function _setDefaultRoyalty(receiver, feeNumerator) function _deleteDefaultRoyalty() function _setTokenRoyalty(tokenId, receiver, feeNumerator)
function _resetTokenRoyalty(tokenId)
各関数の説明をします。 royaltyInfo
はNFTのtokenIdと販売価格を引数に持たせることで、ロイヤリティを還元する対象のアドレスとロイヤリティの支払い総額を取得することができます。 NFTの売買が行われた際にはこちらの関数を呼び出し還元する対象のクリエイターと金額を取得しクリエイターにロイヤリティの還元を行ってください。
_feeDenominator
はデフォルトで10000という値を返します。ロイヤリティの計算は 支払い総額 * (feeNumerator / feeDenominator)となるためロイヤリティの還元率を表す分母として用いられます。この関数はオーバーライドすることにより値を変更することができます。
_setDefaultRoyalty
はreceiverに設定されているアドレスのユーザーがどれくらいの割合のロイヤリティを受けるかを設定する関数になります。この関数はNFTのtokenIdを必要としていないためNFTとアドレスを紐づけなくてもロイヤリティの還元を行う金額を取得することができます。
_delefeDefaultRoyalty
はデフォルトで設定したロイヤリティを変更したいときに使用します。
_setTokenRoyalty
はNFTのtokenIdとアドレスが紐づいているため特定のNFTの還元率を変更したい場合にこちらの関数で還元率を設定することができます。
_resetTokenRoyalty
はNFTのtokenIdとアドレスが紐づいたロイヤリティの還元率を設定している場合にその値を破棄します。
以下の図はロイヤリティの還元率の設定からNFTが販売された際にNFTが還元されるところを図にしたものです。
図1図2図3
図4
図1ではデフォルトのロイヤリティの設定、図2ではtokenIdが1のNFTが売買された場合に5%のロイヤリティが計算されるような設定をしています。
図3ではtokenId10のNFTの売買が行われており、tokenId10のNFTのロイヤリティを個別で設定していないので通常設定の1%が計算されています。
図4ではtokenId1のNFTの売買が行われており、これは先ほど5%で設定をしているため1万円の5%である500円がロイヤリティであるという計算が行われています。
繰り返しになりますが、ロイヤリティの計算がERC2981の規格であり、支払いに関する機能は定義されていません。
ERC2981の課題
ERC2981を実装している場合でもロイヤリティが還元されない例があります。 一つ目は個人で売買を行った場合です。 これはコントラクトが個人間でいくらで売買されたのか知ることができないためです。 詳しくはERC721の解説を見ていただければNFTを転送する際に売買の価格を必要としていないことがわかると思います
二つ目はERC2981に対応していないマーケットプレイスで売買した場合です。 ERC2981を実装していないと売買したときにロイヤリティが設定されているかを確認していないかつERC2981でNFTにロイヤリティ還元率を設定している場合でも、NFTの所有権の移動の際にロイヤリティを支払ったかどうかの情報は必要がないためロイヤリティを還元しなくてもNFTの売買を成立させることができます。 二つ目に関してはERC2981が普及し各マーケットプレイスが実装をするのを待つしかないという現状です。
終わりに
今回はERC2981という規格について説明しました。
本企画はOpen Seaなどでも適用され始めておりこの規格が広がっていくことでクリエイターの支援にもつながっていく非常に重要な規格であると考えています。
一度登録してしまえばどのプラットフォームで転売したとしてもロイヤリティを還元することができる点はブロックチェーンならではで非常に有用ですが、ロイヤリティの支払いを強制するような仕組みはないのでその点がこの規格の難しいところであると私個人は考えます。