[ERC5554] NFTに関する著作権をオンチェーンで管理する仕組みを理解しよう！

# はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

https://amzn.asia/d/gxvJ0Pw

今回は、NFTの著作権に関するルールをオンチェーンで管理する仕組みを提案している**ERC5554**についてまとめていきます！

:::note info
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://eips.ethereum.org/EIPS/eip-5554

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

**ERC5554**では、NFTなどのトークンに「**著作権や利用権に関する明確なルール**」を追加できる仕組みを提案しています。
例えば、「**このNFTを商用に使っていいか？**」「**二次創作していいか？**」「**複製して配っていいか？**」といった権利を、コントラクト上で明示的に定義できるようにします。

また、それらの権利情報を確認・取得するためのインターフェース（**ERC5218**）や、誰がどのように使ったかを記録するイベント・関数も定義しています。

:::note info
**ERC5218**については以下の記事を参考にしてください。
:::

https://qiita.com/cardene/items/ac9ea1bc38a51bd25092

# 動機

現在、NFTには大きな法律的なグレーゾーンがあります。
NFTを買ったからといって、その作品の著作権まで得られるわけではありません。
多くの場合、NFTはデジタル作品そのものではなく、そのハッシュ（識別情報）を指しているだけです。
つまり、「**この画像のNFTを持っている**」と言っても、作品を自由に商用利用したり改変したりする権利は持っていないのが一般的です。

こうした状況を変えるために、**ERC5554**では「**NFTの持ち主にどんな権利が与えられているのか**」を明確にすることを目指しています。
具体的には、著作権者（アーティストなど）が「**このNFTの保有者には商用利用OK**」といった条件付きのライセンスを設定できるようにします。
そして、そのライセンスはNFTの保有者が変わるたびにNFTとともに自動的に移転されます。

### 解決しようとしている課題

- NFTがどのような権利を持っているかが分からない。
- 著作権のライセンスがオフチェーン（ブロックチェーンの外）にあり、不透明で追跡もしにくい。
- 二次創作や商用利用を許可したいが、現状ではその管理や許可が困難。

### 仕組み

- 商用利用、二次創作、複製といった行為に対する「**権利情報**」をコントラクトに明示する。
- それらの情報を取得・確認するための標準インターフェース（**ERC5218**）を提供。
- NFTのメタデータにライセンス情報を追加するフォーマットを標準化。
- 二次創作・商用利用・複製といった行為があった場合にオフチェーンで記録できるようイベントを発行。
- オンチェーンでの作品の再利用や複製の履歴も追跡可能にする。
- 著作権者の情報をコントラクト上に記録。
- ライセンスの種類に応じたコントラクトの関数を呼び出せるようにする（例えば「**商用利用を申請する**」など）


**ERC5554**は、NFTと著作権の関係をより透明で明確なものにし、アーティストが自分の作品に新しい価値を与えられる仕組みを作ろうとしています。
ライセンスの考え方は、Creative Commons（自由に使えるライセンス体系）に近く、柔軟に条件を組み合わせることができます。

将来的には、NFTを買うときに「**このNFTは商用利用OK**」「**二次創作は禁止**」などが一目で分かるようになり、アートの売買がもっと健全かつ活発になることを目指しています。

# 仕様

## インターフェース

```js:IERC5554.sol
pragma solidity ^0.8.0;

interface IERC5554 is IERC5218 {

    event CommercialExploitation(uint256 _tokenId, uint256 _licenseId, string _externalUri);
    event ReproductionCreated(uint256 _tokenId, uint256 _licenseId, uint256 _reproductionId, address _reproduction, uint256 _reproductionTokenId);
    event DerivativeCreated(uint256 _tokenId, uint256 _licenseId, uint256 _derivativeId, address _derivative, uint256 _derivativeTokenId);

    /// @notice Retrieve the copyright owner address
    /// @dev Throws unless the token exists
    /// @param tokenId The identifier for the queried token
    /// @return address of the copyright owner
    function getCopyrightOwner(uint256 tokenId)
        external
        virtual
        returns (address);
    
    /// @notice Requests to log an execution of a license
    /// @dev Throws unless the token issuance conditions are met
    /// @param tokenId The identifier for the queried token
    /// @return uint256 tracking reproduction ID
    function logReproduction(uint256 tokenId, address reproduction, uint256 reproductionTokenId)
        external
        virtual
        returns (uint256);

    /// @notice Requests to log an executions of a license
    /// @dev Throws unless the token issuance conditions are met
    /// @param tokenId The identifier for the queried token
    /// @return uint256 tracking derivative ID
    function logDerivative(uint256 tokenId, address derivative, uint256 derivativeTokenId)
        external
        virtual
        returns (uint256);

    /// @notice Requests to log an execution of a license
    /// @dev Throws unless the commercial exploitation conditions are met
    /// @param tokenId The identifier for the queried token
    function logCommercialExploitation(uint256 tokenId, string calldata uri)
        external;

    /// @notice Retrieve the token associated with a reproduction
    /// @dev Throws unless the reproduction exists
    /// @param _reproductionId The identifier for the reproduction
    /// @return uint256 The identifier for the token used to generate the reproduction
    function getReproductionTokenId(uint256 _reproductionId)
        external
        view
        returns (uint256);

    /// @notice Retrieve the token associated with a reproduction
    /// @dev Throws unless the reproduction exists
    /// @param _reproductionId The identifier for the reproduction
    /// @return uint256 The identifier for the license used to generate the reproduction
    function getReproductionLicenseId(uint256 _reproductionId)
        external
        view
        returns (uint256);

    /// @notice Retrieve the token associated with a reproduction
    /// @dev Throws unless the reproduction exists
    /// @param _reproductionId The identifier for the derivative work
    /// @return address The address of the reproduction collection
    function getReproductionCollection(uint256 _reproductionId)
        external
        view
        returns (address);

    /// @notice Retrieve the token associated with a derivative
    /// @dev Throws unless the derivative exists
    /// @param _derivativeId The identifier for the derivative work
    /// @return uint256 The identifier for the token used to generate the derivative work
    function getDerivativeTokenId(uint256 _derivativeId)
        external
        view
        returns (uint256);

    /// @notice Retrieve the token associated with a derivative
    /// @dev Throws unless the derivative exists
    /// @param _derivativeId The identifier for the derivative work
    /// @return uint256 The identifier for the license used to generate the derivative work
    function getDerivativeLicenseId(uint256 _derivativeId)
        external
        view
        returns (uint256);

    /// @notice Retrieve the token associated with a derivative
    /// @dev Throws unless the derivative exists
    /// @param _derivativeId The identifier for the derivative work
    /// @return address The address of the derivative collection
    function getDerivativeCollection(uint256 _derivativeId)
        external
        view
        returns (address);

}
```

## 主要イベント

以下のイベントが定義されており、ユーザーがNFTに関連する処理を実行した時に、その記録をブロックチェーンに残せます。

- `CommercialExploitation`

商用利用があったことを記録するイベント。
オフチェーンでのグッズ制作などが対象です。

- `ReproductionCreated`

複製が作成されたことを記録するイベント。
例）NFTをもとにまったく同じ画像を新しいトークンとしてミントした場合に発行される。

- `DerivativeCreated`

二次創作が作成されたことを記録するイベント。

## 関数

以下の関数が用意されており、それぞれが特定の権利や履歴の記録に使われます。

- `getCopyrightOwner(tokenId)`

特定のトークンの著作権者アドレスを返す関数。
作品の持ち主に限らず、別途設定できるようになっています。

- `logReproduction(tokenId, reproduction, reproductionTokenId)`

NFTの複製が行われたときに呼び出されてイベントを発行する関数。

- `logDerivative(tokenId, derivative, derivativeTokenId)`

二次創作が行われたときに呼び出されてイベントを発行する関数。

- `logCommercialExploitation(tokenId, uri)`

オフチェーンでの商用利用（例えばNFT画像を使ったTシャツ販売など）があったときに呼び出されてイベントを発行する関数。

## 複製・二次創作の情報取得

イベントとして記録された複製・二次創作の情報を取得するための関数も用意されています。

例えば以下のような情報が取得できます。

- どのトークンを元に作られたのか
- どのライセンスが使われたのか
- どのコントラクト上のコレクションなのか

これにより、複製や二次創作の出どころを透明にして権利関係を確認できるようになります。

## オンチェーンでの著作権管理

**ERC5554**では、「**複製**」や「**二次創作**」をオンチェーンでトラッキングできるようになります。
つまり、誰がどのNFTをベースにどんな作品を作ったかをブロックチェーン上で確認できます。

また、商用利用のようなオフチェーンでの活動に対しても、`logCommercialExploitation`関数を使ってイベントを発行すれば、それをブロックチェーン上で追跡可能になります。

## 著作権者の指定

コントラクトには、各NFTごとに著作権者（`copyrightOwner`）を指定する必要があります。
シンプルなケースではNFTの所有者が著作権者でも良いですが、アーティストや企業など所有者とは別のアドレスを設定することもできます。

# 補足

## ライセンスIDと柔軟な権利設定  

`getLicenseId(tokenId)` のように、トークンごとにライセンスIDを指定できることで、同じコレクション内でもトークンごとに異なるライセンス条件を設定できます。
これにより、例えば「**このトークンは商用利用OK、こっちはNG**」といった細かい使い分けが可能になります。

## ライセンスURIと法的な明文化  

`licenseURI` は、ライセンスの詳細（どんな権利が与えられているのか）を記載した外部ファイルへのリンクです。
ファイルはコンテンツアドレス化（IPFSなど）されており、内容は法的にも意味を持つ文章になっています
これにより、ユーザーや第三者がそのNFTの権利関係を正確に理解できます。

## 正当な複製・二次創作の証明  

複製や二次創作の権利がトークン保有者のみに与えられている場合、その処理が正当に行われたことを確認する必要があります。
そのために `logReproduction()` や `logDerivative()` のような関数を用意して、コントラクト側で正当性をチェックする仕組みになっています。

## 商用利用の追跡と透明性  

NFTが使われてTシャツを作るなど、オフチェーンで商用利用があった場合には `logCommercialExploitation()` 関数を使って記録できます。
これにより、誰がいつそのNFTを使って商用利用したのかをブロックチェーン上で追跡できるようになります。

## 著作権者アドレスの明示  

`copyrightOwner` という項目を導入することで、作品の著作権者（個人、法人、またはDAOなど）を明示できます。
複数人で所有している場合には、マルチシグアドレスを使うこともできます。

## アーティストの情報と派生元作品の記録  

アーティスト自身の情報（例えば名前やウォレットアドレスなど）は、メタデータに埋め込む形式になっています。
これは変更されるべき情報ではないため、オンチェーンではなくメタデータとして扱われます。
また、派生元となった作品についても、メタデータで明示する必要があります。
これにより、その派生作品が正当な処理のもとで作られたかどうかが分かります。

## 対象とするライセンスの考え方  

**ERC5554**は、「**NFTを持っている人が、その保有に付随する権利を行使できる**」仕組みを提供しています。
逆に言えば、「**特定の個人にだけ使わせたい**」「**第三者に再ライセンスを許可する**」といった、トークンと無関係な権利の管理には向いていません。
こうしたケースは従来の著作権ライセンスのスキームを使うべきだとしています。

## 使用例

### Bored Koalasのグッズ販売  

アーティストのVigdísは「**Bored Koalas**」というPFPコレクションを作成しました。
著作権的には、他者による複製・販売は禁止ですが、NFTを保有している人には限定的に商用グッズ化を許可しています。

NežaはこのNFTを買って、ブロックチェーンカンファレンスで販売するためにTシャツを制作。
プリント業者には「**このNFTを持っているから、商用利用の権利がある**」と証明できるようになっています。
さらに、Tシャツ販売時には `logCommercialExploitation()` を呼び出し、利用履歴をブロックチェーンに記録しています。

### 音楽のリミックスとNFT  

Mattiは「**Degens in the Night**」という楽曲を作りNFTとしてリリースします。
一般公開ライセンスでは無料の複製・配布を許可していますが、NFT保有者にはリミックス権も与えられています（ただし1ETHの支払いとライセンス条件の維持が必要）。

LyyliはNFTを購入してリミックス作品「**Degens in the Parisian Night**」を制作。
リミックスしたNFTを新たに発行し、`requestDerivativeToken()` を使ってオリジナルのNFTコントラクトにリミックス作品として登録します。
これにより、正当な派生作品として証明できます。

### リミックス作品からのロイヤリティ  

Aliceは3Dバイクのモデルを制作し、「**リミックスはOKだけど、商用利用にはロイヤリティが必要**」という条件付きでNFT化します。
これにより、誰でもリミックスできる一方で、利益が出た場合はAliceにも分配される仕組みです。

JaneはこのNFTを購入して、自分のバイクアートをリミックス作品としてNFT化します。
`requestDerivativeToken()` を通してリミックスを申請し、Aliceが内容を審査。
ロイヤリティ分配などの条件が満たされていると判断したうえで承認すれば、リミックス作品として正式に認められます。
以後、リミックスNFTの販売利益は、AliceとJaneの間で自動的に分配されます。

# 互換性

**ERC5554**で定義されたインターフェースは、ほとんどのNFT規格と互換性があります。

# 引用

Isaac Patka (@ipatka), COALA Licensing Taskforce <info@coala.org>, "ERC-5554: NFT Legal Use, Repurposing, and Remixing [DRAFT]," Ethereum Improvement Proposals, no. 5554, July 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5554.

# 最後に

今回は「NFTの著作権に関するルールをオンチェーンで管理する仕組みを提案している**ERC5554**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4