[ERC2193] オンチェーンデータにエイリアスをつける仕組みを理解しよう！

# はじめに

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

https://amzn.asia/d/gxvJ0Pw

今回は、Ethereum上のあらゆるオンチェーンデータに対して、人間が読める識別子（エイリアス）を付与する仕組みを提案している**ERC2193**についてまとめていきます！

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

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

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

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

# 概要

Aliasは、オンチェーンのリソースに対して人間が読める識別子（エイリアス）を与えるための規格です。
この識別子は、リソースの「型（dTypeによって定義される、**ERC1900**）」と「内容（dType Storage Contractによって識別される、**ERC2157**）」に基づいています。
Aliasはあらゆるデータに対応可能で、Ethereum上のコンテンツを普遍的かつ意味を持った方法で表現・参照できるようにします。

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

https://qiita.com/cardene/items/822e60e3fb3e4699fb1a

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

https://qiita.com/cardene/items/1e12c60a54061c578d3d

# 動機

Ethereumでは、アカウントに人間が読める名前を付けるための標準（**EIP137**など）がすでに存在しますが、これらはドメイン名に似た構造（例: subdomain.domain.tld）を採用しています。
しかしこの構造は、プログラミング言語や一般的なUIにおける「.（ドット）」の意味（root→leaf）と逆になっており、直感的ではありません。
例えば、オブジェクト指向言語では `object.property` のように、ルートから末端へアクセスします。

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

https://qiita.com/cardene/items/17e6e1a452006f08a197

また、**EIP137**ではスマートコントラクト内部の多様なデータに名前を付けることは困難です。
例えば、PaymentChannelのようなスマートコントラクトでは、全体に名前を付けることはできても、AliceとBobのチャンネルデータといった内部データに個別の名前を付ける手段はありません。

Aliasは、こうした粒度の細かいリソースにも名前を付けることを可能にし、Ethereum上における機械と人の両方にとって意味を持つプロトコルの基盤を提供します。
例えば、SocialNetworkとProfileというdTypeが存在する場合、ユーザープロファイルに対して `alice@socialnetwork.profile` のような形でアクセスできます。
PaymentChannelでは `alice-bob.paymentchannel` のような形式で特定のチャンネルを指し示すことが可能です。

これにより、DNSの代替にしつつ、機械にも読みやすい識別方式が提供されてオフチェーンでの利用にも適しています。

# 仕様

Aliasの仕組みでは、dTypeレジストリがリソース型に対してドメイン名やサブドメイン名を提供します。
これらのサブドメインは、より複雑な型を含むdTypeタイプにも再帰的に割り当てることができます。

## Aliasレジストリコントラクト

Aliasレジストリは、人間が読める名前と実際のオンチェーンデータの対応を記録するためのコントラクトです。
このコントラクトには以下のような仕様があります。

* データの所有者であれば誰でもAliasを設定できます。
* 所有権の判定は、dTypeストレージコントラクト（**EIP2157**）によって行われます。
* 設定されたAliasは、更新や削除が可能です。

## インターフェース

```js
interface Alias {
    event AliasSet(bytes32 dtypeIdentifier, bytes1 separator, string name, bytes32 indexed identifier);

    function setAlias(
        bytes32 dtypeIdentifier,
        bytes1 separator,
        string memory name,
        bytes32 identifier,
        bytes memory signature
    ) external;

    function getAliased(
        bytes1 separator,
        string memory name
    ) view external returns (bytes32 identifier);
}
```

### パラメータ

* `dtypeIdentifier`
    * dTypeレジストリで登録された型の識別子。
    * この値によって名前の一意性が保たれます。
* `name`
    * 人間が読める形式のリソース名。
* `separator`
    * エイリアス内で区切り文字として使われる1文字。
    * `.`
        * 一般的な階層区切り（ルート→リーフ）。
        * 例: `domain.subdomain.resource`
    * `@`
        * アクター（ユーザーなど）に関連する情報（リーフ→ルート）。
        * 例: `alice@socialnetwork.profile`
    * `#`
        * コンセプト識別。
        * 例: `topicX#postY`
    * `/`
        * パス形式のリソース指定。
        * 例: `root/resource`
    * `identifier`
        * dTypeストレージコントラクトに保存されているリソースの識別子。
* `signature`
    * エイリアス設定の署名。
    * 内容は `dtypeIdentifier`, `identifier`, `name`, `separator`, `nonce`, `aliasAddress`, `chainId` に対する署名です。
* `nonce`
    * リプレイ攻撃防止のためのカウンター。
* `aliasAddress`
    * Aliasコントラクトのアドレス。
* `chainId`
    * デプロイ先のチェーンID（**EIP155**準拠）。

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

https://qiita.com/cardene/items/2526432899353e4a0225

## アドレス解決

Aliasは以下の2通りでアドレス解決（Content Addressability）できます。

* ハッシュベース識別子を使う
  例:
  `0x0b5e...d2e7@0x9dbb...47da`

* 人間が読めるエイリアスを使う
  例:
  `alice@socialnetwork`

両者は同じデータに解決されるため、ユースケースに応じて使い分けが可能です。

# 補足

従来のコンテンツ参照手段である**EIP137**は、Ethereumアカウントに対してのみ人間が読める名前を与える仕組みです。
しかし、これはHTTPやDNSからの発想を引き継いだものであり、構造的にも機械処理に向いていないという課題があります。

一方で、**ERC1900**と**ERC2157**を組み合わせることで、Ethereum上のあらゆるコンテンツに対する汎用的なアドレス指定（コンテンツアドレス化）が可能になります。

* **ERC1900**はデータの型（タイプ）情報を提供します。
* **ERC2157**は、その型に基づくデータがどのコントラクトに格納されているかを示します。

Aliasはこれらの仕組みに加え、サブドメインの区切り文字（セパレータ）に意味を持たせることで、直感的な順序（表示や構造）で識別子を表現します。

また、1つのリソースに対して複数のエイリアスを設定することが可能です。
これは以下のような方法で実現されます。

* **異なる名前**を用いる
* **異なるセパレータ**を用いる（例: `@`, `.`, `/`など）

それぞれのセパレータは、使われる文脈や意味に応じて異なる表示・処理ルールを持つことができ、柔軟な命名やプロトコル設計を可能にします。

# 引用

Loredana Cirstea (@loredanacirstea), Christian Tzurcanu (@ctzurcanu), "ERC-2193: dType Alias Extension - Decentralized Type System [DRAFT]," Ethereum Improvement Proposals, no. 2193, July 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2193.

# 最後に

今回は「Ethereum上のあらゆるオンチェーンデータに対して、人間が読める識別子（エイリアス）を付与する仕組みを提案している**ERC2193**」についてまとめてきました！
いかがだったでしょうか？

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