クリエイターにロイヤリティを還元!?ERC2981について解説

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【6/19開催】Kong Community Japan Meetup #4
本イベントでは、Kong Inc. のVP of ProductであるReza Shafii氏もプレゼンターとして参加。当社からはアーキテクト マネージャーの槌野の登壇が決定!参加無料です!!
https://column.api-ecosystem.sios.jp/connect/kong/1081/

【6/21開催】開発者目線でのSBOMとの向き合い方
SBOMの導入から開発者がSBOMの作成・管理を自動で行っていくための方法(デモ)を紹介します。SBOMを全く知らない人から、開発との統合までを紹介するので様々なレベルの方に学びがあるライブとなる予定です!
https://tech-lab.connpass.com/event/321422/

【7/19開催】現場で役立つAzure神小技10+α 〜生成AI,RAG,コスト削減など旬な技術満載のLT大会〜
Azureの最新技術や実用的な小技を紹介する特別なライトニングトーク大会を開催します!
https://tech-lab.connpass.com/event/319077/

【7/26開催】最適なIaCツールを選ぼう
プロジェクトでのツール選びに困らないための重要な観点をご説明します!
https://tech-lab.connpass.com/event/319532/

サイオステクノロジーの佐々木寛太です。 今回は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などでも適用され始めておりこの規格が広がっていくことでクリエイターの支援にもつながっていく非常に重要な規格であると考えています。
一度登録してしまえばどのプラットフォームで転売したとしてもロイヤリティを還元することができる点はブロックチェーンならではで非常に有用ですが、ロイヤリティの支払いを強制するような仕組みはないのでその点がこの規格の難しいところであると私個人は考えます。

参考

NFTの仕組み

ERC721の解説

OpenzeppelinERC2981

OpenzeppelinERC2981 GitHub

アバター画像
About 佐々木寛太 21 Articles
普段はAPI開発をメインに最近はブロックチェーン周りに手を出し始めました。インフラが苦手なので今年はインフラ回りも攻めていこうかと思っています。休日は愛車とドライブしています。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる