# [ERC190] コントラクトパッケージの標準使用の仕組みを理解しよう！

> この仕様は、コントラクトの作成、管理、配布をより良くするためのルールや方法を定めるものです。

- URL: https://cardene.dev/articles/51bcfc5f5d32fa1362f4
- 公開日: 2023-11-14
- 更新日: 2023-11-14
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、Ethereumコントラクトのパッケージの標準仕様を提案している規格である**ERC190**についてまとめていきます！

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

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

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

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

## 概要

この仕様は、コントラクトの作成、管理、配布をより良くするためのルールや方法を定めるものです。

この仕様の開発には、Ethereumの異なる開発ツールを作っている5人のメンテナーが協力しました。
彼らは、Truffle、Dapple、Populus、Eris PM、Embarkというツールの開発者です。
これらのツールは、コントラクトを作るためのさまざまな機能やサポートを提供しています。

この共同作業の結果、Ethereumでのコントラクト開発がもっと簡単で効率的になると期待されています。
また、異なるツール間での互換性や一貫性も改善されるでしょう。
これによって、Ethereumコミュニティ全体が恩恵を受けることになります。

## 動機

Ethereumエコシステムで現在、ソフトウェア開発において非常に重要な「**パッケージング**」が不足しているという問題があります。
パッケージングとは、コードの部品を再利用しやすくするためのシステムのことです。
この不足により、開発者が既存のコードを再利用するのが難しくなり、結果として生産性やセキュリティが低下しています。

たとえば、**ERC20**というスタンダードがあります。
これは、Ethereum上で使われるトークンの標準的なコントラクトのことです。
確かに再利用可能で安全に監査された**ERC20**コントラクトは存在しますが、開発者がこれらの既存コードを探し出して再利用するのは難しいため、多くの場合、自分たちで一からコントラクトを作成しています。

もしパッケージングの標準が確立されれば、以下のような良い影響が生まれるでしょう。

- 既存のコードを再利用することによる開発の全体的な生産性の向上。
- **ERC20**やクラウドファンディングなど、一般的なパターンの既存で安全に監査された実装を再利用することによるセキュリティの向上。

さらに、スマートコントラクトのパッケージングは最終的なユーザーにも直接的な利益をもたらします。
ウォレットソフトウェアは、リリースされたパッケージを利用して、その中に含まれるデプロイされたコントラクトとのやり取りのためのインターフェースを生成できます。
ENS（Ethereum Name Service）が導入されれば、ウォレットは人間が読める名前から、そのアプリケーションとのやり取り用のインターフェースをユーザーに提供できるようになります。

## 仕様

このEIP（Ethereum Improvement Proposal）は、Ethereumのパッケージングのための標準仕様に関するものです。
この標準の詳細な仕様は、**epm/epm-spec**という名前のリポジトリで管理されており、そこが公式の情報源となっています。

具体的には、この標準のバージョン1.0.0があり、その内容はGitHubの以下のURLで見ることができます：[https://github.com/ethpm/epm-spec/tree/v1.0.0](https://github.com/ethpm/epm-spec/tree/v1.0.0)。

重要な部分として、「**Release Lockfile**」というドキュメントが含まれています。
これは、パッケージのリリースに関連する情報を記録するファイルのことです。
「**Release Lockfile**」の具体的な仕様は、以下で確認できます。

[https://github.com/ethpm/epm-spec/blob/v1.0.0/release-lockfile.spec.md](https://github.com/ethpm/epm-spec/blob/v1.0.0/release-lockfile.spec.md)

また、このファイルのJSONスキーマは、以下で確認できます。

[https://github.com/ethpm/epm-spec/blob/v1.0.0/spec/release-lockfile.spec.json](https://github.com/ethpm/epm-spec/blob/v1.0.0/spec/release-lockfile.spec.json)

このEIPでは、仕様の詳細を直接文書に含めずに、リンクを通じて提供しています。
これは、仕様の情報を一元管理するための方法です。
つまり、このEIP自体にはすべての詳細が含まれていないので、公式の仕様を知るためには上記のリンク先を確認する必要があります。

## ユースケース

このスマートコントラクトのパッケージに関する仕様は、主に3つの異なるタイプのパッケージを取り扱っています。

#### 基礎コントラクト目的としたパッケージ

これらのパッケージは、他のコントラクトの基盤として機能します。
例としては、複数のコントラクトが共通の所有者を持つパターンなどがあります。

#### そのまま使用可能なコントラクトを含むパッケージ
このタイプのパッケージには、追加のカスタマイズなしで使用できるコントラクトが含まれています。
**ERC20** トークンコントラクトのように、すぐに利用可能なものです。

#### デプロイ済みのコントラクトを含むパッケージ
これらは既にブロックチェーン上に展開されているコントラクト、例えばライブラリやサービスを含んでいます。

これらの各パッケージタイプの具体的な使用例や詳細な説明は、**epm/epm-spec**リポジトリの`README.md`ファイルに記載されています。

## パッケージマネージャー

**Release Lockfile**はパッケージ管理ソフトウェアによる利用を想定しています。
パッケージマネージャが以下の機能をすべて実装できるよう工夫されています。

### 決定論的ビルド
これは、パッケージがいつも同じ依存関係とソースファイルに基づいて生成されることを保証します。
ソースファイルや依存関係は内容に基づいてアドレス指定されるため、参照される内容が変わることはありません。

### バイトコードの検証
パッケージマネージャーが、デプロイされたコントラクトのバイトコードを検査し、それがパッケージのソースコードからコンパイルされたバイトコードと一致するかどうかを確認するための情報が含まれています。

### マルチチェーンデプロイ
複数のブロックチェーンへのデプロイをサポートします。
これにより、パッケージは公式のメインネットとテストネットの両方に対するアドレスを定義することができます。

### 信頼できるパッケージ
コントラクトのバイトコードを検証するために必要なソースコードや他の要素を省略したパッケージを作成することを許可します。
これは、パッケージマネージャーが検証を行わない特別なケースにおいて、最小限のパッケージを作成することが可能になります。

## フレームワークのサポートと統合

**ERC190**は、Ethereumのスマートコントラクトをパッケージ化するための標準です。
この標準は、以下のようないくつかの主要な開発フレームワークでサポートされています。

#### Truffle
Ethereumのスマートコントラクトを開発しテストするための環境を提供します。

https://truffleframework.com/

#### Populus
PythonをベースにしたEthereumの開発フレームワークです。

https://populus.readthedocs.io/en/latest/

#### Dapple
Ethereumの開発とビルドのプロセスをサポートするツールです。

https://dapple.readthedocs.io/en/master/

#### Eris PM
コントラクトの管理やデプロイを行うためのツールです。

https://github.com/eris-ltd/eris-cli

#### Embark
分散型アプリケーション（DApps）の開発をサポートするフレームワークです。

https://github.com/iurimatias/embark-framework

#### Browser Solidity
ブラウザ上でSolidityのコードをコンパイルしデバッグすることができるツールです。

https://github.com/ethereum/remix-project/issues/238

これらのフレームワークが**ERC190**の標準に基づいたパッケージング方法をサポートすることによって、Ethereumのスマートコントラクトの開発がより効率的で安全になることが期待されます。

## 引用

Piper Merriam (@pipermerriam), Tim Coulter (@tcoulter), Denis Erfurt (@mhhf), RJ Catalano (@VoR0220), Iuri Matias (@iurimatias), "ERC-190: Ethereum Smart Contract Packaging Standard," Ethereum Improvement Proposals, no. 190, January 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-190.

## 最後に

今回は「Ethereumコントラクトのパッケージの標準仕様を提案している規格である**ERC190**」についてまとめてきました！
いかがだったでしょうか？

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