[ERC6944] コントラクトが特定のリソース要求をどのようの処理するか指定するための仕組みを理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、**ERC5219**コントラクトのリソース要求を解決するために、**ERC4804**のresolveModeを追加する仕組みを提案している**ERC6944**についてまとめていきます！

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

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

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

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

# 概要

EIP (Ethereum Improvement Proposals)はEthereumの機能拡張や標準を提案するドキュメントで、その中で新たに提案されているのは、**ERC5219**コントラクトのリソース要求を解決するために**ERC4804**の`resolveMode`を追加するものです。

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

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

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

https://qiita.com/cardene/items/837931ce60ca844aee13

### ERC5219

**ERC5219**は、スマートコントラクトに対してリソースリクエストを行い、HTTPのようなレスポンスを受け取るインターフェースを標準化するEIPです。
これにより、Ethereum上の分散アプリケーション（DApps）がより分散された形で動作することが可能になります。
主な動機は、DAppsが完全に分散されていない現状を改善することにあり、特に「**分散された**」アプリケーションのインターフェースにアクセスするためには、まずDAppのフロントエンドコードを含む中央集権的なウェブサイトにアクセスする必要があるという問題が指摘されています。
この問題は、信頼の最小化、検閲のリスク、恒久性の欠如、およびDAppインターフェースとスマートコントラクト間の相互運用性の欠如など、いくつかのリスクをもたらします。

このEIPは、アプリケーションロジックとフロントエンドロジックを分離し、DAppコントラクトが特定のインターフェイスを実装することを要求します。
また、ガスコストを節約するために、`message/external-body` MIMEタイプを使用して、スマートコントラクトが直接アクセスできないデータを指すことが推奨されています。
例えば、クライアントにIPFS上のデータをフェッチするよう指示するレスポンスが示されています。

リクエストメソッドは読み取り専用とされており、トランザクションの送信コストやユーザーエクスペリエンスの悪化を避け、フロントエンドロジックをスマートコントラクトに保存することのコストや複雑さを避けるためです。
このアプローチは、状態変更操作をリクエストするために他のEIPと組み合わせることができ、HTTPリクエストの完全な模倣ではなく、GETメソッドとリソース内のクエリパラメータを主に使用する簡素化されたバージョンが選択されています。

### ERC4804

**ERC4804**は、Web2のユーザーがWeb3ブロックチェーンの内容、特にオンチェーンのWebコンテンツ（SVG/HTMLなど）に直接アクセスできるようにするための標準を提案しています。
これにより、Web2プロキシ経由でのデータ読み取りの依存を減らし、ユーザーのコントロールを強化します。
主に読み取り専用（例：Solidityのview関数）のセマンティクスを定義し、状態を変更する関数は将来の拡張として定義される可能性があります。

この標準は、以下の形式のWeb3 URLを使用します。

- `web3Schema`はURLのスキーマを示し、`web3://`や`w3://`などが使用されます。
- `userinfo`はEVMコールメッセージの"From"フィールドを指し、特に指定がない場合は0x0が使用されます。
- `contractName`はコントラクトの名前を示し、EVMコールメッセージの"To"フィールドに対応します。これはアドレスまたは名前サービスからの名前であり、後者の場合は名前サービスプロバイダーのサフィックス（例：`eth`）を使用します。
- `chainid`はコントラクト名を解決しメッセージを呼び出すチェーンを指定し、特に指定がない場合は名前サービスプロバイダーと同じチェーンが使用されます。
- `query`は属性と値のペアのシーケンスを含むオプショナルコンポーネントです。

この標準は、Web2とWeb3の間の相互運用性を高め、ユーザーがより直接的にWeb3のコンテンツにアクセスできるようにすることを目指しています。

# 仕様

```ts
/// @dev IDecentralizedApp is the ERC-5219 interface
interface IERC5219Resolver is IDecentralizedApp {
    // @notice The ERC-4804 resolve mode
    // @dev    This MUST return "5219" (0x3532313900000000000000000000000000000000000000000000000000000000) for ERC-5219 resolution (case-insensitive). The other options, as of writing this, are "auto" for automatic resolution, or "manual" for manual resolution.
    function resolveMode() external pure returns (bytes32 mode);
}
```

**ERC5219**を**ERC4804**の**resolveMode**として使用したいコントラクトが実装しなければならないインターフェイスに関する説明です。
以下の`IERC5219Resolver`インターフェースは、**ERC5219**標準を適用し、**ERC4804**のresolveモードとして機能するための具体的な要件を定義します。

### `IERC5219Resolver` インターフェイス
このインターフェイスは、`IDecentralizedApp`を継承しており、**ERC5219**標準に準拠したDappsのためのものです。
この継承は、`IERC5219Resolver`がDappsの一般的な機能や定義を含むようにするためのものです。

### `resolveMode()` 関数
この関数は、**ERC4804**の`resolve`モードを指定するために使用されます。
- **戻り値**
    - `bytes32`型の`mode`を返します。
    - この`mode`は、スマートコントラクトがどのようにして**ERC5219**のリソース要求を解決するかを定義します。
- **定義されたモード**
  - **"5219"**
      - このモードは、**ERC5219**の解決方式を明示的に使用することを示します。
      - モード値は`0x3532313900000000000000000000000000000000000000000000000000000000`として返され、これは16進数で"5219"に相当します。
      - このモードを選択したコントラクトは、**ERC5219**に準拠した解決メカニズムを使用することを意味します。
  - **"auto"**
      - 自動解決モードを示し、スマートコントラクトが最適な解決策を自動で選択することを意味します。
  - **"manual"**
      - 手動解決モードを示し、ユーザーまたは開発者が解決方法を手動で指定する必要があることを意味します。

### 実装について
スマートコントラクトが**ERC4804**のリゾルブモードとして**ERC5219**を選択する場合、`IERC5219Resolver`インターフェイスを実装し、`resolveMode()`関数で`"5219"`を返すようにしなければなりません。
これにより、そのコントラクトは**ERC5219**に基づいた解決メカニズムを使用することが保証されます。

この設計は、スマートコントラクト開発者がリソース解決のメカニズムを明示的に指定できる柔軟性を提供し、**ERC5219**標準の利用を促進することを目的としています。
また、このようなインターフェースの定義は、Ethereum上でのdAppの相互運用性と標準化を促進することにも寄与します。

# 補足

**ERC165**は、スマートコントラクトが特定のインターフェイスをサポートしているかどうかを検出するための標準です。
コントラクトが**ERC165**を実装している場合、他のコントラクトは`supportsInterface`関数を呼び出して、特定のインターフェイス識別子に対するサポートを照会できます。
これは、スマートコントラクト間の相互運用性を確認する際に有用なツールです。

この規格では、**ERC4804**の`resolveMode`関数の導入により、**ERC165**を使わないでもインターフェースのサポートをチェックできます。
**ERC4804**のコンテキストで`resolveMode`関数を呼び出すことにより、コントラクトが**ERC5219**リゾルブモードをサポートしているかどうかを確認できます。
これは、`resolveMode`関数が特定のモード（例えば"5219"、"auto"、"manual"）を返すことで、コントラクトがどのようなリゾルブモードをサポートしているかを明示するためです。

このアプローチにより、**ERC165**の`supportsInterface`関数を使ってサポートされているインターフェイスを確認する代わりに、直接`resolveMode`を呼び出して対象のコントラクトが特定の解決モードをサポートしているかどうかを確認できます。
これにより、**ERC4804**と**ERC5219**のコンテキストでは、**ERC165**に依存する必要がなくなり、より直接的かつ効率的な方法でインターフェイスの相互運用性を確認できるようになります。

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

https://qiita.com/cardene/items/541184977a5cba51b759

# 実装

```ts
abstract contract ERC5219Resolver is IDecentralizedApp {
    function resolveMode() public pure returns (bytes32 mode) {
      return "5219";
    }
}
```

# セキュリティ

**ERC4804**および**ERC5219**のセキュリティに関する考慮事項が適用されます。

# 引用

Gavin John (@Pandapip1), Qi Zhou (@qizhou), "ERC-6944: ERC-5219 Resolve Mode [DRAFT]," Ethereum Improvement Proposals, no. 6944, April 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6944.

# 最後に

今回は「**ERC5219**コントラクトのリソース要求を解決するために、**ERC4804**のresolveModeを追加する仕組みを提案している**ERC6944**」についてまとめてきました！
いかがだったでしょうか？

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

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

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

https://chaldene.net/

https://zenn.dev/heku

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

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