# [ERC1921] コントラクト内の関数の共有・再利用する仕組みを理解しよう！

> ERC1921は、ERC1900で定義された分散型型システム（dType）の拡張として、コントラクトの関数を dType レジストリに登録できるようにすることを目的としています。

- URL: https://cardene.dev/articles/ddedb20a6f1dfd9615c7
- 公開日: 2025-07-26
- 更新日: 2025-07-26
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

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

https://amzn.asia/d/gxvJ0Pw

今回は、**ERC1900**のdTypeレジストリにスマートコントラクトの`pure`・`view`関数を登録し、再利用性を高める仕組みを提案している**ERC1921**についてまとめていきます！

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

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

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

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

## 概要

**ERC1921**は、**ERC1900**で定義された分散型型システム（dType）の拡張として、コントラクトの関数を dType レジストリに登録できるようにすることを目的としています。
dTypeは、Ethereum上での共通のデータ型や構造を定義・共有するための仕組みであり、**ERC1921**により関数レベルでもそれを実現できるようになります。

登録される関数は、dType レジストリを通じて一元的に管理され、Ethereumのスマートコントラクト間で共有・再利用が可能となります。

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

[\[ERC1900\] コントラクトの型標準化の仕組みを理解しよう！](/articles/822e60e3fb3e4699fb1a)

**ERC1921**は、**ERC1900**に続く「**分散型型システム**」の拡張シリーズの一環として位置付けられています。
現在のEIPでは、個別のスマートコントラクト関数をdTypeレジストリに登録するための、データ定義やインターフェース仕様を定めています。
これにより、関数も型定義と同様に、登録・検索・識別が可能となります。

## 動機

**ERC1921**の背景には、Ethereum Virtual Machine（EVM）をSingleton Operating System（単一の操作系）として進化させるというビジョンがあります。
これを実現するには、EVM上で実行される関数を標準化された形で登録し、それらを他のスマートコントラクトやアプリケーションから容易に呼び出せる仕組みが必要です。

関数の登録により、EVMは以下のような機能を持つプラットフォームへと近づきます。

* 任意の関数の所在やインターフェースをEVM上で一元的に管理できるようになる。
* 自動化されたツールや分析手法において、関数呼び出しをより安全かつ効率的に行える。
* コントラクトIDEやセキュリティ解析ツール、ブロックエクスプローラーなどが、dTypeの情報を基に高度な機能を提供できる

さらに、これらの登録は**ERC1900**と同様に、チェーンのステートを不必要に肥大化させないよう、合意形成に基づいた登録方法が採用されます。
これにより、重複登録や不適切な関数登録の問題を回避し、ネットワークの健全性を維持する仕組みも備えています。

このように、**ERC1921**はEVMの汎用性と再利用性を高めるだけでなく、スマートコントラクトの開発環境全体を向上させるための重要なステップとなります。

## 仕様

### 対象となる関数の種類

**ERC1921**は、スマートコントラクト内の `pure` と `view` に特化した提案です。
これらの関数はブロックチェーンのステートを変更せず、安全に外部から呼び出して値を取得できるため、dTypeのような再利用性を重視する型システムとの相性が非常に良いです。

### 登録対象の関数情報

関数をdTypeレジストリに登録する際には、以下の情報を構造化されたオブジェクトとして記録します。

* `name`
    関数の一意な名称。
    **ERC1900**に準拠した文字列型で、関数を識別するために必須です。
* `types`
    関数が受け取る引数の型情報とラベルを定義します。
    これも**ERC1900**に従い、すべての入力引数について定義する必要があります。
* `outputs`
    関数が返す出力値の型情報とラベルです。
    **ERC1921**で新たに追加された要素で、出力がある場合は必ず定義する必要があります。
* `contractAddress`
    関数が実装されているスマートコントラクトのアドレス。
    これはインターフェース登録時には省略可能です。
* `source`
    関数のソースコードに関する外部参照を表す `bytes32` 型の値で、ソースファイルへのリンクなどを指し示します。
    これは任意項目です。

この定義により、関数の入出力仕様が明確にされ、他のスマートコントラクトやツールが再利用しやすくなります。

### 登録オブジェクトの具体例

以下は、`setStaked` という関数をdTypeレジストリに登録する際のJSONオブジェクトの例です。

```json
{
  "name": "setStaked",
  "types": [
    {"name": "TypeA", "label": "typeA", "relation": 0, "dimensions": []}
  ],
  "typeChoice": 4,
  "contractAddress": "<コントラクトのアドレス>",
  "source": "<ソースコードを参照するbytes32ハッシュ>",
  "outputs": [
    {"name": "TypeB", "label": "typeB", "relation": 0, "dimensions": []}
  ]
}
```

このオブジェクトは `dTypeRegistry.insert({...})` によってレジストリに登録されます。

### 出力型の個別設定機能

出力情報は登録時だけでなく、後から個別に追加・更新することも想定されています。
そのために、dTypeレジストリに新たに `setOutputs` 関数が提案されています。

```solidity
function setOutputs(
    bytes32 identifier,
    dTypes[] memory outputs
) public
```

ここでの `identifier` はEIP-1900で定義された型識別子で、`outputs` は出力型の配列です。

### 実装における格納方法

レジストリの実装では、関数の出力情報を以下のようなマッピング構造で管理することが推奨されています。

```solidity
mapping(bytes32 => dTypes[]) public outputs;
```

これにより、関数ごとの出力型を効率的に管理・参照することができます。

## 引用

Loredana Cirstea (@loredanacirstea), Christian Tzurcanu (@ctzurcanu), "ERC-1921: dType Functions Extension [DRAFT]," Ethereum Improvement Proposals, no. 1921, April 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1921.

## 最後に

今回は「**ERC1900**のdTypeレジストリにスマートコントラクトの`pure`・`view`関数を登録し、再利用性を高める仕組み」についてまとめてきました！
いかがだったでしょうか？

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