ビットコイン・インスティテュート

BIP 44 — ​決定性ウォレットの​ための​マルチアカウント階層

BIP: 44
  Layer: Applications
  Title: Multi-Account Hierarchy for Deterministic Wallets
  Authors: Marek Palatinus <slush@satoshilabs.com>
           Pavol Rusnak <stick@satoshilabs.com>
  Comments-Summary: Mixed review (one person)
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0044
  Status: Deployed
  Type: Specification
  Assigned: 2014-04-24
  Requires: 32, 43

概要

本 BIP は、BIP-0032(以下 BIP32)に記述されたアルゴリズムと、BIP-0043(以下 BIP43)に記述された purpose スキームに基づき、決定性ウォレットのための論理階層を定義する。

本 BIP は BIP43 の具体的な応用の一つである。

動機

本稿で提案する階層はかなり包括的である。これにより、複数のコイン、複数のアカウント、アカウントごとの外部・内部チェーン、そしてチェーンあたり数百万のアドレスを扱えるようになる。

パスの階層

BIP32 パスにおいて、以下の 5 つの階層を定義する。

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

パス中のアポストロフィは、BIP32 のハード化導出が用いられていることを示す。

各階層には固有の意味があり、以下の各節で説明する。

Purpose

Purpose は、BIP43 の推奨に従い 44’(あるいは 0x8000002C)に固定される定数である。このノード配下のサブツリーが本仕様に従って使われることを示す。

この階層ではハード化導出が用いられる。

Coin type

1 つのマスターノード(シード)を、ビットコイン・ライトコイン・ネームコインなど無制限の数の独立した暗号通貨に使用できる。しかし、様々な暗号通貨で同一の空間を共有すると、いくつかの不都合が生じる。

この階層は暗号通貨ごとに独立したサブツリーを作成し、暗号通貨をまたいだアドレスの再利用を避け、プライバシー上の問題を改善する。

Coin type は、各暗号通貨に対して設定される定数である。暗号通貨の開発者は、自身のプロジェクト用に未使用の番号の登録を申請できる。

既に割り当て済みの coin type の一覧は、後述の「登録済み coin type」の章にある。

この階層ではハード化導出が用いられる。

Account

この階層は鍵空間を独立したユーザー識別子へと分割し、ウォレットが異なるアカウント間でコインを混在させることのないようにする。

ユーザーはこれらのアカウントを、銀行口座と同じような形で資金を整理するために使える。たとえば、すべてのアドレスが公開されることを前提とする寄付用途、貯蓄用途、共通経費用途などである。

アカウントはインデックス 0 から順に増加する形で番号付けされる。この番号は BIP32 導出における子インデックスとして用いられる。

この階層ではハード化導出が用いられる。

ソフトウェアは、直前のアカウントにトランザクション履歴がない場合(つまりそのいずれのアドレスも一度も使用されていない場合)、新たなアカウントの作成を防ぐべきである。

ソフトウェアは、外部ソースからシードをインポートした後、使用済みのすべてのアカウントを発見する必要がある。そのようなアルゴリズムは「アカウント発見」の章で説明する。

Change

外部チェーンには定数 0 が、内部チェーン(チェンジアドレスとも呼ばれる)には定数 1 が用いられる。外部チェーンは、ウォレットの外部から見えることが意図されたアドレス(たとえば支払いの受け取り用)に使われる。内部チェーンは、ウォレットの外部から見えることを意図しないアドレスに使われ、送金の釣り銭(チェンジ)に用いられる。

この階層では公開導出が用いられる。

Index

アドレスはインデックス 0 から順に増加する形で番号付けされる。この番号は BIP32 導出における子インデックスとして用いられる。

この階層では公開導出が用いられる。

アカウント発見

マスターシードが外部ソースからインポートされた場合、ソフトウェアは以下の手順でアカウントの発見を開始すべきである。

  1. 最初のアカウントのノード(インデックス = 0)を導出する
  2. このアカウントの外部チェーンのノードを導出する
  3. 外部チェーンのアドレスをスキャンする。以下で説明するギャップ制限を守る
  4. 外部チェーンでトランザクションが見つからなければ、発見を停止する
  5. トランザクションが見つかれば、アカウントインデックスを増やしてステップ 1 へ戻る

このアルゴリズムが成立するのは、上記「Account」の章で説明したとおり、ソフトウェアが直前のアカウントにトランザクション履歴がない場合に新規アカウントの作成を許可すべきではないためである。

このアルゴリズムはアカウント残高ではなくトランザクション履歴を対象に動作する点に注意されたい。したがって、合計コイン数が 0 のアカウントがあっても、アルゴリズムは発見を継続する。

アドレスギャップ制限

アドレスギャップ制限は現在 20 に設定されている。ソフトウェアが未使用アドレスに連続して 20回到達した場合、それ以降には使用済みアドレスが存在しないと見なし、アドレスチェーンの探索を停止する。内部チェーンは対応する外部チェーンから発生したコインのみを受け取るため、スキャンするのは外部チェーンのみである。

ウォレットソフトウェアは、ユーザーが新規アドレスを生成することで外部チェーンのギャップ制限を超えようとした場合、警告すべきである。

登録済み coin type

以下は、上記「Coin type」の章で説明した BIP44 の第 2 階層で使用するための、デフォルトで登録済みの coin type である。

これらの定数はすべてハード化導出として用いられる。

indexhexacoin
00x80000000Bitcoin
10x80000001Bitcoin Testnet

本 BIP は登録済み coin type の中央ディレクトリではない。全リストを管理している SatoshiLabs を参照されたい。

SLIP-0044 : Registered coin types for BIP-0044 (https://github.com/satoshilabs/slips/blob/master/slip-0044.md)

新しい coin type を登録するには、本仕様を実装した既存のウォレットが必要であり、上記ファイルへのプルリクエストを作成する必要がある。

コインアカウントチェーンアドレスパス
Bitcoin1番目外部1番目m / 44’ / 0’ / 0’ / 0 / 0
Bitcoin1番目外部2番目m / 44’ / 0’ / 0’ / 0 / 1
Bitcoin1番目チェンジ1番目m / 44’ / 0’ / 0’ / 1 / 0
Bitcoin1番目チェンジ2番目m / 44’ / 0’ / 0’ / 1 / 1
Bitcoin2番目外部1番目m / 44’ / 0’ / 1’ / 0 / 0
Bitcoin2番目外部2番目m / 44’ / 0’ / 1’ / 0 / 1
Bitcoin2番目チェンジ1番目m / 44’ / 0’ / 1’ / 1 / 0
Bitcoin2番目チェンジ2番目m / 44’ / 0’ / 1’ / 1 / 1
Bitcoin Testnet1番目外部1番目m / 44’ / 1’ / 0’ / 0 / 0
Bitcoin Testnet1番目外部2番目m / 44’ / 1’ / 0’ / 0 / 1
Bitcoin Testnet1番目チェンジ1番目m / 44’ / 1’ / 0’ / 1 / 0
Bitcoin Testnet1番目チェンジ2番目m / 44’ / 1’ / 0’ / 1 / 1
Bitcoin Testnet2番目外部1番目m / 44’ / 1’ / 1’ / 0 / 0
Bitcoin Testnet2番目外部2番目m / 44’ / 1’ / 1’ / 0 / 1
Bitcoin Testnet2番目チェンジ1番目m / 44’ / 1’ / 1’ / 1 / 0
Bitcoin Testnet2番目チェンジ2番目m / 44’ / 1’ / 1’ / 1 / 1

参考文献

  • BIP32 - Hierarchical Deterministic Wallets
  • BIP43 - Purpose Field for Deterministic Wallets