ウォレットは秘密鍵の容器. 構造化されたファイルか簡単なデータベースで実装されている.
鍵を作る方法として決定性鍵生成がある. ここでは, 一方向ハッシュ関数を用いて秘密鍵から秘密鍵を作ってみる. 秘密鍵の再生成に必要なものは 最初の秘密鍵のみ.
ウォレットに入っているのはbitcoin自体ではなく 鍵である. キーホルダーのイメージ.
Type-0非決定性ウォレットと呼ばれ, ランダムな関連性のない鍵の集まり. 鍵を複数保持するため鍵束というニックネームがついている.
seedという秘密鍵から一方向ハッシュ関数を用いて新たな 秘密鍵をもちいるウォレット.
seedさえあれば生成された鍵を複製できる.
mnemonic codeはseedをエンコードする英単語の列.
mnemonic codeをもちいるウォレットは 初期設定時にユーザに対して12から24個の英単語の列をしめす. この英単語の列はウォレットの移行や再生成用いることができる.
bip0039というもので定義されており、 BIPというものは現在草案段階にあるので注意.
chainをイメージすると良いのかな
決定性ウォレットの最も進んだ形らしい. 親鍵が子鍵を生成し、ツリー状の形状を持ったウォレット.
シードからマスター鍵が生成され、 マスターをルートとして鍵が生成される.
ルートシードをHMAC-SHA512というアルゴリズムを通した結果である ハッシュ値をもとに マスター秘密鍵と マスターchain code が生成される.
マスターchainについては次章で説明する.
子鍵導出関数を使って親鍵から小鍵を生成します.
小鍵導出関数は以下の要素を組み合わせ 一方向ハッシュ関数(HMAC-SHA512)に通すことで得られる.
小鍵を持っていても chain codeを持っていなければ 他の小鍵を見つけることができない.
ハッシュ関数から出力された値は 512bitのハッシュ値で 256bitづつに分けられる.
右半分はchain codeになり、 左半分の256bitとインデックスを足し合わせて小鍵を生成する.
秘密鍵だけを見たとき、 非決定性ウォレットで生成された鍵と見分けがつかない.
親鍵とchain codeで生成する方法を鍵拡張という.
作りかたには2種類ある. 親公開鍵から生成するか、 親秘密鍵から生成する.
無制限に安全に公開鍵とビットコインアドレスを生成できるが、 使うことはできない. 拡張秘密鍵を使って対応した秘密鍵を生成しトランザクションに署名すると 使用可能になる.
拡張秘密鍵を コールドストレージや ハードウェアウォレットに保存する.
受け取り用のビットコインアドレスを 自由に作ることができる.
潜在的なリスクがある. 拡張公開鍵に触れても子秘密鍵には触れないが、 拡張公開鍵はchain codeを 含んでいるため もしこ子秘密鍵が漏洩してしまった時、 他の子秘密鍵が導出できてしまう.
解決策として 強化導出と呼ばれる導出関数を使っている.
この関数は 親公開鍵と 子chain codeの関係を壊すもの.
強化導出関数は 親公開鍵の代わりに 親秘密鍵を使って 子chain codeを導出する.
ツリーの関係性を壊すことで 拡張が行われた階層よりも上にいけない ファイアウォールのようなものを作り出す. マスターキーと一階層の間には常に強化導出関数を用いることが望ましい.
導出関数で用いられているindexは32bit. 何故か導出関数と強化導出関数で得られたindexを区別したいらしく 0~2^31-1は通常の導出関数, 231~232-1は強化導出関数に使われる.
読んだり、表示したりしやすいように.... (心の声:そもそも読ませるものなの?先に何の意図があるものなのか書いて)
HDウォレットにある鍵は path命名規則によって一意に指定される.
linuxのディレクトリ構造みたいなもの. マスターキーをmと表し, 階層を/で区切って表示する.
無限のツリー構造を辿るのは辛いよねって話. 解決策としてBitcoin Improvement Proposal(BIP)が提案された.
要約すると予めツリー構造を指定しておいてあげようよって考え.
持ち出しなどが可能で便利な 暗号化秘密鍵.
パスフレーズで秘密鍵を暗号化し, Base58Checkでエンコードする.
紙にバックアップする時によく使われる.
3から始まるビットコインアドレス.
ビットコイントランザクションの受取人を 公開鍵の所有者ではなく、 scriptのハッシュを指定する.
このトランザクションに送った資金は 公開鍵ハッシュと秘密鍵署名以上のものが必要になる.
(例えば何が必要かくらい例示してくれ)
もっとも一般的なP2SHの実装は
人間が読むことのできるメッセージを含んだビットコインアドレス.
望んだメッセージが含まれるビットコインアドレスがでるまで 生成を数十億回繰りかえすらしい.
同じメッセージを持ったビットコインアドレスを作ることはできる.
なんかVanity Addressをつくるコストに見合わない的なこと書いてるけど、 まあセキュリティ的にはむっちゃ微妙ということだね.
秘密鍵を紙に印刷したもの. コールドストレージとも言われる.