Develop with pleasure!

福岡でCloudとかBlockchainとか。

HDウォレットのマルチアカウント階層を定義したBIP-44

以前BIP-32の階層的決定性ウォレットについて書いたけど↓

techmedia-think.hatenablog.com

このHDウォレットの階層を論理的に定義したBIP-44についてみてみる↓

https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

動機

このBIPで提案している階層構造はとても包括的で、複数のコイン、複数のアカウントの管理に加え、アカウント毎に内部チェーン・外部チェーン、チェーン毎に何百のアドレスを管理できるようになる。

Path level

このBIPでは、BIP-32のパスを以下の5つのレベルで定義する。

m / purpose' / coin_type' / account' / change / address_index

↑のアポストロフィー(')は、BIP-32の強化鍵を使用することを示す。

各レベルは以下の特別な意味を持つ。

Purpose

PurposeにはBIP-43の勧告に従い定数44' (or 0x8000002C)がセットされ、このノードのサブツリーがBIP-44の仕様に従っていることを示す。

このレベルでは強化導出が使われる。

Coin type

BitcoinやLitecoin、Namecoinなどの独立した暗号通貨は1つのマスターノード(シード)を使用できるが、いろいろな暗号通貨で同じスペースを共有するのは問題がある。

このレベルでは、各暗号通貨についてそれぞれ別々のサブツリーを作成し、暗号通貨全体でアドレスの再利用やプライバシーの問題を回避する。

Coin typeは各暗号通貨毎に設定された定数で、暗号通貨の開発者は未使用の番号の登録を要求することができる。既に登録済みのCoin typeは後述。

このレベルでは強化導出が使われる。

Account

このレベルではユーザー毎に鍵スペースを分割することで、ウォレットが異なるアカウント間でコインを混在させることが無いようにする。

ユーザーはこのAccountを使って銀行口座と同じ方法で資金を整理することができる(寄付用口座、貯蓄口座、共用口座などのように)。

Accountはインデックス 0から順番に増加するよう番号が割り当てられ、この番号がBIP-32の鍵導出の際の子インデックスとして使われる。

このレベルでは強化導出が使われる。

以前のアカウントでトランザクション履歴がない場合(=そのアドレスが使用されたことがない場合)、ソフトウェアはそのアカウントを作成できないようにする必要がある(後述のアカウント検出の際にこのルールが必要)。

ソフトウェアはシードを外部からインポートした後、使用された全てのアカウントを検出する必要がある。このアルゴリズムについては"アカウント検出"の章で説明。

Change

このレベルでは、定数0が外部チェーン、定数1が内部チェーン(お釣り用のアドレス)として使われる。外部チェーンはウォレットの外側に見えるように意図されたコインの受け取り用のアドレスに使われる。内部チェーンはウォレットの外部に表示されることはなく、トランザクションでお釣りを受け取る際のアドレスに使われる。

このレベルでは強化導出でなく通常の鍵導出が行われる。

Index

アドレスはインデックス 0から順番に増えるよう番号が割り当てられる。この番号はBIP-32の鍵導出の際の子インデックスとして使われる。

このレベルでは強化導出でなく通常の鍵導出が行われる。

アカウント検出

マスターシードが外部からインポートされると、ソフトウェアは以下のステップでアカウントの検出をする。

  1. 最初のAccountノード(index = 0)を導出
  2. このAccountの外部チェーンノードを導出
  3. 後述するgap limitの数まで外部チェーンのアドレスをスキャンする。
  4. 外部チェーン上のトランザクションが見つからなければ、検出を停止する。
  5. トランザクションが見つかったら、indexをインクリメントして1のステップに戻る。

↑の"Account"の章で説明しているように、以前のAccountに取引履歴がない場合、新しいアカウントの作成を禁止するため、このアルゴリズムは成立する。

このアルゴリズムはAccountの残高ではなく取引履歴をベースに動作するので、残高が0コインのAccountがあっても検出は継続する。

アドレスのgap limit

アドレスのgap limitは現在20に設定されている。ソフトウェアはスキャンの際に、20個連続してアドレスが使われていない状態だったら、これ以上スキャンしても使用済みのアドレスは検出されないとみなし、アドレスの検出を停止する。内部チェーンは関連する外部チェーンのコインのみを受け取るので、外部チェーンだけをスキャンすればいい。

ウォレットのソフトウェアは、ユーザーがgap limitを超える数の新しいアドレスを生成しようとした場合、警告する必要がある。

登録済みのCoin type

以下は、このBIPのレベル2で使用するデフォルトの登録済みCoin type。

これらの定数は全て強化導出で使われる。

index hexa coin
0 0x80000000 Bitcoin
1 0x80000001 Bitcoin testnet

このBIPは登録済みのCoin typeのリポジトリではないので、登録済みの全Coin typeは以下を参照↓

https://github.com/satoshilabs/slips/blob/master/slip-0044.md

新しいCoin typeを登録する際は、そのコインを実装した既存のウォレットが必要で、上記ファイルへのプルリクを作成する必要がある。

サンプル

BIP参照

互換性のあるウォレット

参照

上記仕様はあくまでBIP-44に対応したウォレットでのみ有効な導出方法で、BIP-44に対応していないウォレットでは異なるルールで鍵導出されているので要注意。