# [ERC600] BIP32の仕組みをEthereumに適用する仕組みを理解しよう！

> このEIP（イーサリアム改善提案）は、ビットコインのBIP32（ビットコイン改善提案32）に基づく決定論的ウォレット（Deterministic Wallet）の階層構造をイーサリアムに適用するものです。

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

## はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、**BIP32**の決定論的ウォレットに基づく階層構造をEthereumに適用する規格である**ERC600**についてまとめていきます！

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

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

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

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

## 概要

このEIP（イーサリアム改善提案）は、ビットコインの[**BIP32**](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)（ビットコイン改善提案32）に基づく決定論的ウォレット（Deterministic Wallet）の階層構造をイーサリアムに適用するものです。
決定論的ウォレットとは、同じシードから一連のアドレスを生成するウォレットのことです。

また、このEIPは[**BIP43**](https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki)の応用でもあります。
**BIP43**では、ウォレットが作るアドレスごとに「**目的**」を設定できます。
これにより、ウォレットは異なる種類のトランザクションやコントラクトを識別できるようになります。
例えば、**ERC20**トークンや**ERC721**トークンの取引に対応するアドレスを作ることができます。

:::message
**ERC20**については以下を参考にしてください。
:::

https://chaldene.net/erc20

:::message
**ERC721**については以下を参考にしてください。
:::

https://chaldene.net/erc721

このEIPによって、イーサリアム上でのコントラクトやトランザクションがより効率的に管理されます。
それぞれのロールや関数（例：`transfer`や`approve`）のやり取りがスムーズになり、ウォレットの使用がより便利かつセキュアになります。

## 動機

イーサリアムとビットコインでは基本的な動作原理が異なります。
ビットコインはUTXO（未使用トランザクション出力）モデルを採用しており、各トランザクションは個々の出力を追跡します。
これに対して、イーサリアムはアカウント残高ベースで動作します。
つまり、イーサリアムではトランザクションの履歴ではなく、各アカウントの現在の残高が重要になります。

:::message
詳しくは以下を参考にしてください。
:::

https://chaldene.net/erc20permit#st-toc-h-2

この違いのため、ビットコイン用に設計された**BIP44**の階層構造は、イーサリアムには適していません。
**BIP44**は、ビットコインのUTXOモデルに基づいて構築されていますが、イーサリアムはこのモデルを使用していないためです。

この問題を解決するために、イーサリアム用の決定論的ウォレット（Deterministic Wallet）向けに、さまざまな導出パス戦略が開発されました。
しかし、これらの戦略はクライアント間で互換性がなく、統一された基準が必要とされています。

ここで登場するのがこのEIPです。
このEIPの目的は、イーサリアムの特有の要件に合わせて問題を標準化し、新しいより適した階層構造を定義することです。
これにより、異なるイーサリアムクライアント間での互換性が向上し、ウォレットの管理やコントラクト、**ERC20**や**ERC721**トークンなどのやり取りがよりスムーズになることが期待されています。

## 仕様

**BIP32**パスでは、以下の2つのレベルを定義しています。

```text
m / purpose' / subpurpose' / EIP'
```

パス内のアポストロフィ（'）は、セキュリティを高めるための「**Hardened Derivation**」が使われていることを表しています。
これはより安全な方法でアドレスを生成するためのものです。

:::message
**Hardened Derivation**

暗号通貨ウォレットのセキュリティを高めるための方法です。
これは特に、階層的決定論的ウォレット（HD Wallets）で使われます。
HDウォレットは、単一のシード（秘密のデータ）から複数のキーペア（公開鍵と秘密鍵）を生成することができます。

通常の導出方法では、公開鍵と導出パスから次の公開鍵を計算することができますが、この方法では秘密鍵を知らなくても公開鍵を推測することができるリスクがあります。

ハード化された導出では、次の秘密鍵（およびそれに関連する公開鍵）を生成するために現在の秘密鍵と導出パスが必要です。
これにより、公開鍵から秘密鍵を推測することが非常に困難になります。
つまり、ハード化された導出は、秘密鍵のセキュリティを強化し、ウォレット全体の安全性を高めるための手段となります。

簡単に言うと、ハード化された導出は、秘密鍵の漏洩リスクを最小限に抑え、ウォレットのセキュリティを向上させるために使用される技術です。
:::

最後に、**EIP'（イーサリアム改善提案）**のレベルは、特定のEIPに合わせてウォレットを使うための設定をします。
EIPは、イーサリアムの機能を改善するための提案です。

このように、**BIP32**のパスはウォレットの使い方や機能に合わせて、アドレスをより詳細に制御するために設計されています。

### Purpose（目的）
ここでは「`43`」という値が設定されています。これは**BIP43**（ビットコイン改善提案43）の変更案で文書化されており、このパスがビットコイン以外の暗号通貨に使用されることを示しています。
このレベルではセキュリティを強化するために「**Hardened Derivation**」が用いられています。

### Subpurpose(coin_type)
ここには「`60`」という値が設定されており、これは**SLIP44**（SatoshiLabs Improvement Proposal 44）のコードでイーサリアムを指します。

:::message
Bitcoinには`0`が割り当てられています。
:::

このレベルでもセキュリティを高めるために「**Hardened Derivation**」が使用されます。

### EIP（イーサリアム改善提案）
EIPのレベルでは、**BIP32**導出パスの残りの部分を指定するEIP番号が設定されます。
これにより、決定論的ウォレットの新しいイーサリアムに焦点を当てた応用が可能になり、BIPプロセスとのインターフェースを必要としなくなります。
このレベルでも、「**Hardened Derivation**」が用いられています。

:::message
このパスはイーサリアムのウォレットに特化した構造であり、セキュリティを重視した方法で各レベルの値が設定されています。これにより、イーサリアム用の決定論的ウォレットをより効率的かつ安全に使用することができるようになります。
:::

## 補足

イーサリアムのウォレットアドレスを生成する現在の一般的な方法は、`m/44'/60'/*`というパスを使います。
この方法は、「**Ethereum**」という仮想通貨タイプに基づいています。
しかし、この方法はもともとビットコインのUTXO（未使用トランザクション出力）モデルを想定して作られたもので、イーサリアムのシステムには完全には合っていません。
その結果、標準化や使い勝手、セキュリティの面で妥協することになっています。

この問題を解決するため、イーサリアムに特化した新しい階層構造の提案が行われています。
この新しい構造は、イーサリアムの特性に合わせて、ウォレットアドレスをより効果的に生成し管理することを目的としています。
つまり、イーサリアムのウォレットの使いやすさとセキュリティを向上させるための新しい方法です。

:::message
現在のイーサリアムのアドレス生成方法はビットコインのシステムに基づいているため、イーサリアムに完全には適していないという問題があり、これを解決するためにイーサリアム専用の新しいアドレス生成方法の提案がなされています。
:::

## 後方互換性

新しい導出パスを導入するということは、既存のウォレットやソフトウェアにとっては、追加のサポートやアップデートが必要になります。
すでにあるウォレットの方法とは別に、この新しい方法にも対応する必要があります。
イーサリアムのウォレットの設定は現在、少し複雑でわかりにくい部分がありますが、新しい導出パスを追加しても、それによる混乱はそこまで大きくないと考えられています。
むしろ、新しい導出パスを採用することで、将来的にはイーサリアムのウォレットがより使いやすく、安全になると期待されています。

:::message
新しい導出パスは最初は少し手間がかかるかもしれませんが、長い目で見ればイーサリアムのウォレットの使い勝手や管理を改善する大きな利点があります。
:::

## 参考

以下の議論が参考になります。

https://github.com/ethereum/EIPs/issues/84

## 引用

Nick Johnson (@arachnid), Micah Zoltu (@micahzoltu), "ERC-600: Ethereum purpose allocation for Deterministic Wallets," Ethereum Improvement Proposals, no. 600, April 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-600.

## 最後に

今回は「**BIP32**の決定論的ウォレットに基づく階層構造をEthereumに適用する規格である**ERC600**」についてまとめてきました！
いかがだったでしょうか？

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