[ERC601] Bitcoinを参考にした新しいEthereumのウォレット生成の仕組みを理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、決定論的ウォレットのためのイーサリアム階層の仕組みを提案している規格である**ERC601**についてまとめていきます！

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

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

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

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

# 概要

このEIP（イーサリアム改善提案）は、イーサリアムのウォレットをもっと効率的に作るための新しいルールを提案しています。
このルールは、ビットコインの**BIP32**という提案と、**BIP43**という別の提案をベースにしています。

:::note info
### BIP32
**BIP32（Bitcoin Improvement Proposal 32）** は、ビットコインのウォレットアドレスや秘密鍵を生成するための方法を定義した技術的な提案です。
これは「**決定論的ウォレット**」とも呼ばれ、一つの「**シード**」（秘密のデータの一種）から、たくさんのアドレスや秘密鍵を生成できる仕組みです。

具体的には、**BIP32**では「**階層的決定論的ウォレット（Hierarchical Deterministic Wallets、略してHDウォレット）**」というシステムを使います。
これにより、一つのシードから無限に近い数のアドレスや鍵を生成でき、それぞれが互いに関連しているため、バックアップや管理が簡単になります。

例えば、あなたがビットコインウォレットを作る時、最初に「**マスターシード**」という秘密のデータが生成されます。
このマスターシードから、「**マスター秘密鍵**」と「**マスターチェーンコード**」という二つの重要な要素が作られます。
これらを使って、さまざまな「**子秘密鍵**」と「**子アドレス**」を生成できます。

このシステムの利点は、全ての秘密鍵やアドレスが元のマスターシードに関連しているため、マスターシードさえ安全に保管しておけば、生成された全てのアドレスや秘密鍵を復元することができる点です。
また、階層的な構造により、異なる目的やアカウントごとに異なる「**ブランチ**」を作成することができ、整理や管理が容易になります。

例として、あるウォレットが個人的な支出用、貯蓄用、ビジネス用といった複数のカテゴリーを持っている場合、それぞれのカテゴリーに対応するアドレスを分けて生成することができます。
これにより、トランザクションの整理や資金の管理が容易になるのです。
:::

:::note info
### BIP43
**BIP43（Bitcoin Improvement Proposal 43）** は、ビットコインなどの暗号通貨のウォレットアドレスを生成する時の階層的決定論的ウォレット（HD Wallet）の構造における、特定の標準化された規則を提案した文書です。
**BIP43**の主な目的は、ウォレットが異なる目的やアプリケーションごとにアドレスを分けて管理するための標準を設けることです。

### BIP43の基本概念
**BIP43**では、「**目的コード（Purpose Code）**」と呼ばれる特定の番号をウォレットの導出パスの最初の部分に設定することを提案しています。
この目的コードによって、ウォレットがどのような目的やアプリケーションに使用されているかを識別できます。
これにより、異なる種類のウォレット機能やアプリケーションが同じウォレット内で衝突することなく共存できるようになります。

### 具体例
例えば、あなたがビットコインを使って通常の取引を行う場合と、マルチシグウォレット（複数の署名が必要なウォレット）を使用する場合があります。
**BIP43**を使用すると、これらの異なる用途を明確に区別できます。

- **通常のビットコイン取引用ウォレット**
    - ここでは、目的コードが「`44`」（**BIP44**に対応）である場合の導出パスを使用します。
    - つまり、このウォレットは「`m/44'/...`」というパスで始まります。
- **マルチシグウォレット**
    - 別の目的コードを使用します。
    - たとえば、「`45`」を目的コードとするマルチシグウォレットの場合、導出パスは「`m/45'/...`」となります。

このように、**BIP43**ではウォレットの用途ごとに異なる「**目的コード**」を設定することで、ウォレットの管理を効率的かつセキュアに行うことができます。
ウォレットはこれらのコードに基づいて適切なアドレスや鍵を生成し、異なるタイプのトランザクションやアプリケーションに対応することができるのです。
:::

「**決定論的ウォレット**」というのは、ウォレットを特定の方法で生成することです。
この方法を使えば、同じ情報からいつでも同じアドレスや秘密鍵を作り出せます。
つまり、ウォレットをなくしても、同じ情報があれば元通りにできるということです。

**BIP32**は、このようなウォレットを作る方法を教えてくれます。
**BIP43**は、それぞれのウォレットがどんな目的（ロール）で使われるかを区別する方法です。

このEIPでは、これらをイーサリアムに合わせた形で使っています。
特に、イーサリアムのコントラクトや**ERC20**、**ERC721**などのトークンと上手くやり取りできるようにすることを考えています。
これにより、イーサリアムで資産を管理したり、ウォレットを使ったりするのが、より簡単で安全になります。

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

https://chaldene.net/erc20

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

https://chaldene.net/erc721

# 動機

イーサリアムに関わる様々なクライアントやウォレットは、それぞれ異なる方法（導出パス）でウォレットのアドレスや鍵を生成しています。
しかし、これらの方法の中には、**BIP44**という一般的な基準に反しているものがあります。
**BIP44**は、`m/44'/`という形で始まる導出パスを使うことを標準としています。
これらの基準に反する導出パスを使っているため、ウォレット間での互換性に問題が生じています。
結果として、あるウォレットで使っていた資金が別のウォレットでは使えなくなったり、ユーザーが自分で導出パスを入力しなければならない状況が生じています。

加えて、**BIP44**は元々UTXO（未使用トランザクション出力）ベースのブロックチェーン用に設計されているため、イーサリアムのようなアカウントベースのシステムには適していません。
イーサリアムはアカウントの抽象化を使用しています。

この問題を解決するために、イーサリアム特有の要件に合わせた新しい決定論的ウォレット階層を提案します。
この新しい階層は、イーサリアムのコントラクトや**ERC20**、**ERC721**などのトークンとのやり取りをよりスムーズにし、ユーザーがウォレットを使いやすくすることを目指しています。

:::note info
### BIP44

**BIP44（Bitcoin Improvement Proposal 44）** は、ビットコインや他の仮想通貨のウォレットアドレスを生成するための特定の規則を提案した技術的な文書です。
**BIP44**は**BIP32**の「**階層的決定論的ウォレット**」の概念に基づいており、それに「**マルチアカウント階層**」と「**コインの種類**」の概念を追加しています。

**BIP44**は、ウォレットが複数のアカウントを持ち、それぞれのアカウントが異なる通貨に対応している場合の管理を容易にするために設計されています。
この仕組みにより、1つのウォレット内でビットコイン、イーサリアム、リップルなど、複数の異なる仮想通貨を分けて管理できるようになります。

### 具体例

例として、あなたがビットコインとイーサリアムを持っているとしましょう。
**BIP44**に基づいたウォレットを使用すると、以下のような構造でそれらを管理できます。

1. マスターシードが生成されます。
2. マスターシードから、ビットコイン用の秘密鍵とイーサリアム用の秘密鍵が生成されます。
    - これらは「**コインの種類**」として区別されます。
    - 例：ビットコインは「`m/44'/0'`」、イーサリアムは「`m/44'/60'`」のように表されます（ここで「`44'`」は**BIP44**を意味し、「`0'`」や「`60'`」はそれぞれビットコインとイーサリアムのコイン種類を指します）。
3. 各コインの種類の下に、複数のアカウントを持つことができます。
    - 例：ビットコイン用の「**貯蓄アカウント**」は「`m/44'/0'/0'`」、ビットコイン用の「**支出アカウント**」は「`m/44'/0'/1'`」となります。
4. さらに、各アカウント内で複数のアドレスを生成できます。
    - 例：「`m/44'/0'/0'/0/0`」、「`m/44'/0'/0'/0/1`」などがビットコインの貯蓄アカウントの異なるアドレスです。

このように、**BIP44**では各コインの種類、アカウント、アドレスが明確に区分され、整理しやすくなっています。
また、これによりウォレットのバックアップと復元が、マスターシード一つで可能になり、セキュリティと利便性が向上します。
:::

# 仕様

**BIP32**のパス構造では、ウォレットの鍵を生成するために4つの階層が定義されています。

```
m / purpose' / subpurpose' / EIP' / wallet'
```

:::note info
**BIP32**の導出パスにおけるアポストロフィ（'）について。

**BIP32**では、ウォレットの秘密鍵やアドレスを生成する際に「**導出パス**」というものが使われます。
この導出パスは、特定の数列で構成され、ウォレットのさまざまな鍵を生成するための「**道筋**」を示しています。

導出パス内でアポストロフィ（`'`）が使われる場合、それは「**強化された導出（hardened derivation）**」が使われていることを意味します。
強化された導出は、ウォレットのセキュリティを高めるための特別な方法です。
この方法では、生成された子鍵が親鍵の情報を露呈するリスクを減少させます。
つまり、ある特定の子鍵が露呈したとしても、他の鍵や親鍵への影響が少ないという利点があります。

例えば、導出パスが「`m/44'/0'/0'`」のようになっている場合、このパスの各レベル（`44', 0', 0'`）で強化された導出が使われていることを示しています。
これにより、そのウォレットはよりセキュアな鍵の生成方法を採用していることになります。
:::

それぞれの階層には特別な意味があり、以下のように説明されています。

## Purpose（目的）
この階層では、鍵がビットコイン以外の暗号通貨用に生成されることを示します。
この目的のために設定される数値は「`43`」です。ここで使用される「**強化された導出**」は、セキュリティを高めるための方法です。

## Subpurpose（副目的）
この階層では、具体的にどの暗号通貨に対応するかを示します。
イーサリアムの場合、**SLIP-44**コードである「`60`」が設定されます。
この階層でも「**強化された導出**」が使用されます。

BIP32の導出パスにおける「EIP」と「ウォレット」のレベルをもっと簡単に説明します。

## EIP
この階層では、**BIP32**の導出パスを特定するためのEIP番号に設定されます。
このEIPに従う導出パスを使用する場合、そのEIPに割り当てられた番号をここに入れます。
この階層でも「**強化された導出**」が使用されます。

## ウォレット
この階層では、1つのウォレット内で複数の異なるユーザーアイデンティティ（アカウント）を作成するために使われます。
これにより、1つのウォレットで複数の公開アイデンティティが管理できます。
アカウントは`0`から順番に番号が割り当てられ、この番号が**BIP32**導出の子インデックスとして使われます。
この階層でも「**強化された導出**」が使用されます。

## ソフトウェアの役割
ソフトウェアは、新しいアカウントを作成する前に、前のアカウントがトランザクション履歴を持っているか（つまり、そのアドレスが以前に使われたことがあるか）を確認する必要があります。
シードが外部からインポートされた後、ソフトウェアはすべての使用されているアカウントを探す必要があります。

:::note info
この設定では、イーサリアムや他の暗号通貨のウォレットを管理するために特定のEIP番号を使っています。
ウォレットレベルでは、1つのウォレット内で複数のアカウントを持つことができ、それぞれが異なる用途に使われます。
ソフトウェアはこれらのアカウントを効率的に管理し、ウォレットのセキュリティを確保するために、新しいアカウントが作成される前に前のアカウントが適切に使われているかを確認します。
これにより、ウォレットの安全性と効率的な管理が実現されます。
:::

# 補足

現在、イーサリアムのウォレットアドレスを作る一般的な方法では、`m/44'/60'/*`というパス形式が使われています。
これは「**Ethereum**」というコインタイプを基にしています。
しかし、この方法は本来、UTXO（未使用トランザクション出力）を基にしたコインに適したものであり、イーサリアムの特性には必ずしも適していません。
このため、ウォレットの標準化や使いやすさ、セキュリティ面での問題が生じることがあります。

そこで、イーサリアムにより適した新しいウォレットの階層構造を定義する提案が行われています。
この新しい方法は、イーサリアムの特性をより考慮しており、イーサリアムのコントラクトや**ERC20**、**ERC721**などのトークンとのやり取りを、より効果的かつ安全に行うことを目的としています。

# 後方互換性

新しいウォレットアドレスの生成方法（導出パス）を採用することにより、既存のソフトウェアはこの新しい方式に加えて、従来の方式もサポートする必要があります。
イーサリアムのウォレットの現在の導出パスは既に混乱が見られるため、新しい導出パスを導入しても追加的な混乱はそれほど大きくないと考えられています。
長期的には、この変更がイーサリアムのウォレットの使い勝手やセキュリティを改善する可能性があります。

また、ニーモニック（覚えやすい単語の並び）を使用するアプリケーションについては、新しい導出パスへの移行において後方互換性の問題を避ける方法を説明する別のEIP（イーサリアム改善提案）草案が提出される予定です。

:::note info
新しい導出パスはイーサリアムのコントラクトや**ERC20**、**ERC721**などのトークンとのやり取りをより良くするための提案です。
既存のソフトウェアは更新が必要ですが、この変更はイーサリアムのウォレット全体にとってプラスに働くことが期待されています。
また、ニーモニックを使うアプリケーションにとっても、スムーズな移行が可能になるような追加の提案が検討されています。
:::

# 参考

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

# 引用

Nick Johnson (@arachnid), Micah Zoltu (@micahzoltu), "ERC-601: Ethereum hierarchy for deterministic wallets," Ethereum Improvement Proposals, no. 601, April 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-601.

# 最後に

今回は「決定論的ウォレットのためのイーサリアム階層の仕組みを提案している規格である**ERC601**」についてまとめてきました！
いかがだったでしょうか？

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