ウォレットは秘密鍵の容器であり、ビットコイン自体がウォレット内に入っているわけではありません。つまり、ユーザーはビットコインではなく秘密鍵が入ったウォレットを持っているというのが正しい認識です。
UTXOとしてバラバラに存在しているトランザクションに秘密鍵を使用して署名をすることで、自身の所有物としての証明をします。この証明をしているのがUTXO内に含まれるトランザクションスクリプトであることは下記記事で説明しました。
ビットコインにおけるトランザクションの仕組み
今回の記事ではウォレットの構造について説明したいと思います。
非決定性ウォレット
初期のウォレットというのは、ランダムに生成された秘密鍵の単なる集まりでした。これをType-0非決定性ウォレットと呼んでいます。
このタイプのウォレットは、初回起動と同時に100個のランダムな秘密鍵とそれに付随する公開鍵が同数生成されます。ユーザーは生成された秘密鍵の厳重な管理とすべての秘密鍵をバックアップする必要があります。
なぜならば、ウォレットにアクセスする際に秘密鍵をバックアップしていないと、鍵に紐ずく資金にアクセスできなくなってしまうからです。よってType-0非決定性ウォレットはビットコインコア(*1)開発者たちからは推奨されておりません。
*1 ビットコインコア:Satoshi Nakamotoの論文を元に集開発開発者。
構造はシンプルですが、大量に生成された分の秘密鍵の管理はハードルが高く実用的ではないと言えるでしょう。
決定性ウォレット
Seeded(シード)ウォレットとも呼ばれており、一方向性ハッシュ関数を用いて導出された秘密鍵の入ったウォレットを指します。
またシードウォレットでは、インデックス番号とChaincodeと呼ばれる他のデータと組み合わせることで複数の秘密鍵を生成することができます。
このシード(*2)さえバックアップしておけば、生成された全ての秘密鍵を復元することが可能であり、非決定性ウォレットとは対照的にウォレットの管理と鍵の移行を容易にしています。
*2 シード:初期設定時にユーザーに対して12から24個の英単語の列を表示します。この英単語の列がウォレットのバックアップになります。余談にはなりますが、ハッシュ関数SHA256を用いると24文字の列となり、SHA128を用いると12文字の列となります。
ハッシュ関数に関する記事はこちらをご覧下さい。
ビットコイン におけるハッシュ関数について
階層決定性ウォレット
HDウォレットとも呼ばれており、上述した決定性ウォレット(シードウォレット)をBIP32(*3)で定義した最も推奨されるウォレットとなります。
*3 BIP:BIPとは (Bitcoin Improvement Proposal) の略称で「ビットコイン改善案」という意味を持ち、ビットコインの性能や機能について定義しています。
HDウォレットでは、鍵がツリー構造をなしていて親鍵が子鍵群を生成して、それぞれの子鍵が孫鍵群を生成するといった形で、生成が無限に続いていきます。
具体的なHDウォレットの生成方法としては、シードを起点としてマスター秘密鍵とマスターChaincodeが生成され、マスター秘密鍵からマスター公開鍵が生成されます。一方でマスターChaincodeは、親鍵から小鍵、小鍵から孫鍵と階層上に秘密鍵を生成するために使用されます。
もう少し細かく説明すると、親鍵から小鍵を生成するためには親秘密鍵または親公開鍵とChaincodeとインデックス番号が必要で、Chaincodeによって小秘密鍵にランダム性が生まれインデックスによって小鍵の階層が決まります。つまりインデックス番号を変えることで、小鍵0、小鍵1、小鍵2と作り出していくことができます。
このように最初はランダムに生成されたマスター秘密鍵とChaincodeですが、小鍵や孫鍵の生成がされていくことで親の情報が引き継がれていきます。
HDウォレットには2つのメリットとデメリットが考えられます。
メリット
- ツリー構造の利点を生かしてそれぞれの階層に役割を与えることができる。例えばおつり用、支払い用、受け取り用などと用途を分類化することができます。
- シードさえあれば全ての鍵の復元が可能なため管理が楽になります。
デメリット
- シードを紛失した場合、関連したビットコインは全て凍結してしまいます。
- シードを誰かに知られた場合、関連したビットコインは全て盗まれてしまいます。
HDウォレットの識別子
HDウォレットにある鍵は「Pach」命名規則を使用して一意に指定されています。この命名規則はスラッシュ(/)を使って区切ります。
実際の規則例を見たほうが理解が早まりますので、まずは下記をご覧下さい。
m / 0:マスター秘密鍵から生成された最初の子秘密鍵
m / 0 / 0:最初の子供(m/0)の最初の孫秘密鍵
m / 0’ / 0:最初の強化された(*4)子供(m / 0’)の最初の通常の孫秘密鍵
m / 1 / 0:2番目の子供(m / 1)の最初の孫秘密鍵
M / 23 / 17 / 0 / 0:24番目の子供の18番目の孫の、最初の曽孫の最初の玄孫の公開鍵
*4 強化された鍵:強化導出関数と呼ばれており、詳細は割愛しますが、簡単に説明すると生成された鍵のセキュリティーが向上している状態を言います。
マスター秘密鍵から得られた秘密鍵は「m」から始まります。マスター公開鍵から得られた秘密鍵は「M」から始まります。また注意点として数字は0から数えはじめるため、m / 1 はマスター秘密鍵から生成された2番目の子秘密鍵ということになります。
右から左に進むほどに先祖の鍵であることを意味しており、1番左はマスター鍵になります。1つの親鍵はま40億個の子鍵を持つことができます。つまり、ツリー状にどんどん鍵を生成することが可能ですがその分複雑になります。
その改善案としてBIP44が提案されました。
BIP44ではウォレットの目的が明確化されており、下記のような5つの階層構造になっています。
m / purpose’ / coin_type’ / account’ / change / address_index
構造例を下記に示します。
M / 44’ / 0’ / 0’ / 0 / 2:最初のビットコイン口座に対する3番目の受信用公開鍵
M / 44’ / 0’ / 3’ / 1 / 14:4番目のビットコイン口座に対する15番目のおつり用公開鍵
m / 44’ / 2’ / 0’ / 0 / 1:トランザクションに署名するための、ライトコインメイン口座の2番目の秘密鍵
先程と同様にマスター秘密鍵から得られた秘密鍵は「m」から始まります。マスター公開鍵から得られた秘密鍵は「M」から始まります。
最初の構造である「purpose」は常に44となります。
第2階層「coin_type」では、トークンの種類を表しており、ビットコインはm/44’/0’、ビットコインテストネットはm/44’/1’、ライトコインはm/44’/2’によって表されます。
第3階層「account」では、同じ階層内でユーザーが何番目の口座を使用しているのかを示しています。
第4階層「change」では、受け取り用アドレスまたはおつり用アドレスを区別しています。m/44’/0’/0/0が受け取り用アドレス、m/44’/0’/0/1が受け取り用アドレスを示しています。
第5階層「address_index」では、第3階層で指定した口座内の何番目のアドレスなのかを示しています。
CoinPicks LINE@
おかげさまで現在お友達が1057名を突破しました。仮想通貨の最新情報や重要なファンダ情報などを「プッシュ通知」にて誰よりもはやくお届けします。
https://platform.twitter.com/widgets.js
CoinPicks Lab

学習項目
- 分析レポート
- Bitcoinについて
- Ethereum経済圏について
- ST(セキュリティートークン)について
- PoS型プラットフォームトークンについて
- ステーブルコインについて
- コンセンサスアルゴリズムについて
- トークン設計について
- 流通設計について
- CBDCについて
- 各インフルエンサーによる特化した情報
- Q&A項目の共有
- 基礎学習
- 掲示板
https://lounge.dmm.com/detail/761/
などなど…
今後も学習項目は増えていきます。