[ERC7053] デジタルメディアの履歴の記録や検索のためのインデックス作成の仕組みを理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、EVM互換のブロックチェーン上でデジタルメディアの履歴を記録したり、検索するためのインデックス作成手法を提案している規格である**ERC7053**についてまとめていきます！

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

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

:::note warn
**7053**は現在（2023年10月4日）では「**Last Call**」段階です。
:::

# 概要

このEIPは、Ethereum（イーサリアム）というブロックチェーンプラットフォームおよびその他の互換ブロックチェーン上で、デジタルメディア情報を整理し、取得するための新しい方法を提案しています。
デジタルメディア情報には、写真、動画、音楽などのメディアファイルに関する情報が含まれます。

現在、異なるスマートコントラクトやブロックチェーン間でデジタルメディア情報を管理し、取引する時に情報の整理や探索が難しいことがあります。
このEIPは、これらの問題を解決するための方法を提案しています。

この提案は具体的に以下のようなことを可能にします。

- **デジタルメディア情報をブロックチェーン上で効率的に整理**
    - 情報を整理し、データベースのように管理することができます。
    - これにより、情報が迷子になることなく、効率的に管理できます。

- **クロスコントラクトおよびクロスチェーンデータの追跡性向上**
    - 異なるスマートコントラクトやブロックチェーン上でデータを追跡し、相互に連携させることができます。
    - これにより、データがより信頼性が高く、透明性が向上します。

- **メディアアセットに関連する情報や保存場所の効率的な発見**
    - 必要な情報やメディアファイルの保存場所を素早く見つけることができます。
    - これにより、デジタルメディアの取引や利用がスムーズに行えます。

この提案の主な目的は、ブロックチェーン上でデジタルメディアをより効率的に管理し、利用できる環境を整えることです。
これにより、デジタルメディア関連のビジネスやアプリケーションが向上し、ユーザーエクスペリエンスが向上することが期待されます。

# 動機

デジタルメディアファイルは、インターネット上で非常に重要な役割を果たしており、その情報を効率的に整理する方法は極めて重要です。
しかし、現在のシステムでは、デジタルメディアコンテンツに対する普遍的で相互運用可能な識別子が不足しているため、さまざまな課題に直面しています。
これが原因で、メディアの情報、保存場所、ある特定のメディアアセットの出所などの情報の取得が複雑になり、断片化が生じています。
そして、デジタルメディアの量が増えるにつれて、これらの問題がますます深刻化しています。

このEIPの目的は、EVM（Ethereum Virtual Machine）互換のネットワーク全体で、デジタルメディアを効率的にインデックス化するための標準化された、分散型で相互運用可能な方法を確立することです。
この提案では、分散型コンテンツ識別子（CIDs）とコミットイベントを組み合わせることで、各デジタルメディアファイルを一意に識別し、インデックス化するメカニズムを提案しています。
さらに、このシステムは、ユーザーがデジタルメディアアセットに関連するデータの完全な履歴にアクセスできる方法を提供します。
これにより、透明性が向上し、ユーザーは将来のデジタルメディアとの対話に必要な情報を提供されます。

この方法により、どんなデジタルメディアシステムも、コンテンツをインデックス化し、検索するための共通の標準的な方法を提供できる共通のインターフェースが作成されます。
これにより、デジタルメディアの管理と利用が効率的に行え、ユーザーエクスペリエンスが向上します。

![digital-media-indexing-system-and-metadata-lookup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570269/c39996e5-7e8c-35a2-7d25-b832539e563b.jpeg)
*Figure 1: Digital Media Indexing Relationships and Lookup
引用: https://eips.ethereum.org/EIPS/eip-7053

このEIPは、デジタルメディアコンテンツに関連する情報を効率的に整理し、関連付けるための相互運用可能なインデックスシステムを構築することを目指しています。
これは、ユーザーがデジタルメディアコンテンツを容易に見つけて信頼できるようにするだけでなく、システム間でこのデジタルメディアコンテンツに関する情報を共有しやすくすることを意味しています。

:::note info
図1を参照してみましょう。
左の表はオフチェーンデータがまとめられています。
左の表はオンチェーンで管理されている情報で、各メディアに関連する情報がまとめられています。
:::

この提案の主要なアイデアは、同じデジタルメディアコンテンツに関連するさまざまなデータや情報を一元化することです。
これにより、ユーザーは特定のデジタルコンテンツを迅速に見つけ、信頼できる情報にアクセスしやすくなります。
また、異なるシステムやプラットフォーム間でデジタルメディアコンテンツに関する情報を共有できるため、デジタルメディアの管理と共有が円滑に行えるようになります。

:::note info
このEIPはデジタルメディアコンテンツに関連する情報を一元化し、デジタルメディアの利用と共有を効率化するための仕組みを提案しています。
これにより、デジタルメディアの体験が向上し、デジタルコンテンツの管理が改善されます。
:::

# 仕様

## コンテンツ識別子

「**コンテンツ識別子**」とは、このEIPにおいてデジタルメディアの内容を一意に識別するための特別なアドレスのようなものです。
これは、デジタルメディアファイルの中身を特別な数学的計算（暗号ハッシュ関数）を使って変換し、その結果得られる一意のアドレスです。
このアドレスをコンテンツ識別子と呼びます。

デジタルメディアの情報を効果的に整理し、インデックス化するためには、ますます多くのデジタルメディアファイルに対して、それぞれ異なるコンテンツ識別子を生成する必要があります。
この識別子は、分散型ストレージ上のコンテンツ識別子と一致している必要があります。
そして、各コンテンツ識別子は、そのデジタルメディアファイルに関する情報、メタデータ、メディア情報、さらにはコンテンツファイル自体へのアクセスを提供します。

:::note info
コンテンツ識別子は、デジタルメディアの内容を一意に特定するためのアドレスであり、このEIPの中心的な要素です。
各デジタルメディアファイルには独自のコンテンツ識別子が必要で、これによってデジタルメディアの管理や検索が効率的に行えます。
:::

## コミット機能

デジタル・メディアにインデックスを付けるために、コミット関数を呼び出し、コミット・イベントを生成します。

```javascript
/**
 * @notice Emitted when a new commit is made.
 * @param recorder The address of the account making the commit.
 * @param assetCid The content identifier of the asset being committed.
 * @param commitData The data associated with the commit.
 */
event Commit(address indexed recorder, string indexed assetCid, string commitData);

/**
 * @notice Registers a commit for an asset.
 * Emits a Commit event and records the block number of the commit in the recordLogs mapping for the provided assetCid.
 * @dev Emits a Commit event and logs the block number of the commit event.
 * @param assetCid The content identifier of the asset being committed.
 * @param commitData The data associated with the commit.
 * @return The block number at which the commit was made.
 */
function commit(string memory assetCid, string memory commitData) public returns (uint256 blockNumber);
```

# 補足

このEIPの設計における決定では、デジタルメディアコンテンツのインデックス化方法が効果的で効率的であることを最優先に考えています。
そのために、分散型コンテンツ識別子（CIDs）を使用して、すべてのシステムでデジタルメディアコンテンツを一意に識別します。
このアプローチには以下の利点があります。

## データの完全性の強化
CIDsは、デジタルメディアコンテンツの内容を暗号ハッシュとして表現することで、その一意性を確保し、偽造を防ぎます。
コンテンツが手元にある場合、CIDを取得することで、そのコンテンツに関連する情報を検索できデータの完全性と信頼性を高めます。

## データの移植性の向上
CIDsを使用することで、デジタルメディアコンテンツを異なるシステム間でスムーズに移動できます。
これにより、再エンコードやプロトコルの再設定が不要になり、相互運用性が向上します。
例えば、Non-Fungible Tokens（NFTs）が`Commit`イベントよりも前に作成された場合でも、`tokenURI`で参照されるファイルを同じメカニズムを使用して変換することで、デジタルメディアコンテンツを一貫性のある識別方法でインデックス化できます。
これにより、異なるプラットフォーム間でのデータの移植性が向上し、データの共有が簡素化されます。

:::note info
このEIPではCIDsを利用してデジタルメディアコンテンツを一意に識別し、データの完全性と移植性を高め、効率的なインデックス化プロセスを実現しようとしています。
:::

# 参考実装

```javascript
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

contract CommitRegister is Initializable {
    using ECDSA for bytes32;

    mapping(string => uint[]) public commitLogs;

    event Commit(address indexed recorder, string indexed assetCid, string commitData);

    function initialize() public initializer {}

    function commit(string memory assetCid, string memory commitData) public returns (uint256 blockNumber) {
        emit Commit(msg.sender, assetCid, commitData);
        commitLogs[assetCid].push(block.number);
        return block.number;
    }

    function getCommits(string memory assetCid) public view returns (uint[] memory) {
        return commitLogs[assetCid];
    }
}
```

# セキュリティ考慮事項

このEIPを実装する時には、デジタルメディアインデックスの安全性と整合性を確保するために以下のセキュリティの側面に注意が必要です。

## 入力の検証
`commit`関数は文字列パラメーターを受け入れるため、これらの入力を検証することが重要です。
これにより、悪意のある攻撃者によるインジェクション攻撃を防ぎます。
スマートコントラクト環境では、通常のウェブ開発とは異なるセキュリティリスクが存在するため、入力データの信頼性を確認することが不可欠です。

## データの完全性
`commit`関数はCIDsに依存しており、これらが正しいことや正しいデータを指していることを前提としています。
しかし、このEIP自体はCIDsやcommitデータの内容を検証しないため、データの完全性はユーザーや実装アプリケーションによって確保される必要があります。
つまり、CIDsが正確であることや、commitデータが適切であることを確認する責任が利用者側にあります。

## イベントリスニング
`Commit`イベントに依存するシステムは、ネットワークの混雑や再構成の時にイベントが欠落したり、正しい順序で届かない可能性があることに注意する必要があります。
これに対処するための適切な監視と対応策が必要です。

:::note info
実装者は、自身のユースケースと展開状況に合わせてこれらのセキュリティ側面を検討し、十分なセキュリティ監査を実施することが強く推奨されます。
これにより、デジタルメディアインデックスの運用中の安全性を確保できます。
:::

# 引用

Bofu Chen (@bafu), Tammy Yang (@tammyyang), "ERC-7053: Interoperable Digital Media Indexing [DRAFT]," Ethereum Improvement Proposals, no. 7053, May 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7053.

# 最後に

今回は「EVM互換のブロックチェーン上でデジタルメディアの履歴を記録したり、検索するためのインデックス作成手法を提案している規格である**ERC7053**」についてまとめてきました！
いかがだったでしょうか？

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

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

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

https://chaldene.net/

https://zenn.dev/heku

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58