[ERC2942] EthPMのカスタムURLの仕組みを理解しよう！

# はじめに

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

https://amzn.asia/d/gxvJ0Pw

今回は、EtherteumのパッケージマネージャーでのカスタムURIスキームの仕組みを提案している**ERC2942**についてまとめていきます！

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

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

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

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

# 概要

**ERC2942**は、EthPM（Ethereum Package Manager）におけるレジストリ・パッケージ・リリース・特定のコントラクト資産を識別するためのカスタムURIスキームの導入を提案しています。
このURIスキームを用いることで、EthPMに関連する資産を単一の文字列で簡潔に指定できるようになり、ユーザーやツールが効率的にEthPMとやり取りできるようになります。

# 動機

EthPMエコシステムとのやり取りにおいて、URI（Uniform Resource Identifier）による一意な識別は、インストール・公開・配布などの操作を簡素化します。
具体的には、レジストリやパッケージ、特定のリリースに対して一貫したフォーマットでアクセスできるようにすることで、以下のようなメリットが生まれます。

- CLIやDappなどのツールが、パッケージ指定を容易に扱える
- 開発者やユーザーが、目的のEthPM資産にすばやくアクセスできる
- 同一のパッケージ情報を異なる環境でも一貫して再利用可能

このURIスキームの導入により、EthPMの利便性と相互運用性が向上し、パッケージ管理のプロセス全体がよりスムーズになります。

# 仕様

## URIフォーマットの仕様

EthPMにおけるURIスキームは、以下の構造を持ちます。

```
scheme://registry_address[:chain_id][/package_name[@package_version[/json_pointer]]]
```

このURIは、EthPMのレジストリ、パッケージ、リリース、あるいはリリース内の特定のアセットを一意に指定するために使用されます。

### `scheme`（スキーム）

必須の項目です。
`ethpm` または `erc1319` のいずれかである必要があります。
将来的にERCプロセスを通じて新しいEthPMレジストリ仕様が発表された場合、そのERC番号をスキームとして使うことも想定されています。

### `registry_address`（レジストリアドレス）

必須の項目です。
ENS名または0xプレフィックス付きのチェックサム形式のEthereumアドレスのどちらかを指定します。
ENS名は柔軟性が必要な場合（更新される可能性がある資産を指す場合）に適しています。
セキュリティが重要な場合は、ENSの所有者に対する信頼が不要になるため、ENSよりもチェックサム付きのアドレスが推奨されます。

### `chain_id`（チェーンID）

任意の項目です。
レジストリが存在するブロックチェーンのチェーンIDを整数で指定します。
省略した場合は、Ethereumメインネット（チェーンID = 1）がデフォルトとなります。

### `package_name`（パッケージ名）

任意の項目です。
対象となるパッケージの名前を文字列で指定します。

### `package_version`（パッケージバージョン）

任意の項目です。
対象のパッケージバージョンを文字列で指定します。
URLに安全でない文字（例：スペース、スラッシュなど）を含む場合は、適切にエスケープする必要があります。
`semver`（セマンティックバージョニング）は強制されていないため、バージョンが指定されていない場合に自動推測は避け、ツールは利用可能なバージョンの選択肢をユーザーに提示するべきです。

### `json_pointer`（JSONポインタ）

任意の項目です。
パッケージ内の特定のアセットを識別するためのパスです。
JSON Pointer仕様に準拠する必要があります。
このパスは、指定されたバージョンのパッケージ内で実際に存在する資産を特定できる必要があります。

この構造により、EthPM資産へのアクセスが一貫性を持って簡潔に表現され、さまざまなツールやインターフェースで扱いやすくなります。

# 補足

EthPMエコシステムにおける多くの操作――パッケージのインストール、レジストリの指定、パッケージの配布――は、EthPM資産を単一の文字列で表現できることによって大きく簡素化されます。
このURIスキームにより、メインネットや各種テストネット上のあらゆるEthPM資産を一意に表現することができるようになり、以下のようなメリットがあります。

- 初心者でも理解しやすく、学習コストが低減される
- フレームワークなどのツールにおける設定が最小限で済む
- パッケージの配布において、作者が受け手にわかりやすく資産を指定できる

これにより、EthPMの導入・利用・普及がよりスムーズに行えるようになります。

# 参考実装

- [Brownie](https://eth-brownie.readthedocs.io/en/stable/)
- Truffle
- [EthPM CLI](https://ethpm-cli.readthedocs.io/en/latest/)

# セキュリティ

通常、EthPMのURIは変更不可能な資産を指すため、URIが示す対象が改ざんされていないことが保証されます。
しかし、ENS名（Ethereum Name Service）をレジストリアドレスとして使用する場合には注意が必要です。

ENS名はその所有者によって異なるアドレスに更新可能であるため、最初にURIが指していたレジストリとは別のレジストリに書き換えられるリスクがあります。
そのため、信頼性やセキュリティが重視される場面では、ENS名ではなく0x形式の直接アドレスを使用することが推奨されます。
これにより、意図しない変更を防ぎ、資産の一貫性を保証することができます。

# 引用

Nick Gheorghita (@njgheorghita), Piper Merriam (@pipermerriam), g. nicholas d'andrea (@gnidan), Benjamin Hauser (@iamdefinitelyahuman), "ERC-2942: EthPM URI Specification [DRAFT]," Ethereum Improvement Proposals, no. 2942, September 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2942.

# 最後に

今回は「EtherteumのパッケージマネージャーでのカスタムURIスキームの仕組みを提案している**ERC2942**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下の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