g-hyoga
6/7/2018 - 10:36 AM

Key_and_Address.md

ウォレット

ウォレットは秘密鍵の容器. 構造化されたファイルか簡単なデータベースで実装されている.

鍵を作る方法として決定性鍵生成がある. ここでは, 一方向ハッシュ関数を用いて秘密鍵から秘密鍵を作ってみる. 秘密鍵の再生成に必要なものは 最初の秘密鍵のみ.

tips

ウォレットに入っているのはbitcoin自体ではなく  鍵である. キーホルダーのイメージ.

非決定性(ランダム)ウォレット

Type-0非決定性ウォレットと呼ばれ, ランダムな関連性のない鍵の集まり. 鍵を複数保持するため鍵束というニックネームがついている.

決定性ウォレット

seedという秘密鍵から一方向ハッシュ関数を用いて新たな 秘密鍵をもちいるウォレット.

seedさえあれば生成された鍵を複製できる.

Mnemonic Code Words

mnemonic codeはseedをエンコードする英単語の列.

mnemonic codeをもちいるウォレットは 初期設定時にユーザに対して12から24個の英単語の列をしめす. この英単語の列はウォレットの移行や再生成用いることができる.

bip0039というもので定義されており、 BIPというものは現在草案段階にあるので注意.

BIP0039の定義

  1. 128bitまたは256bitのランダムな文字列を生成
  2. ランダムな配列のSHA256ハッシュの先頭4bitを取得しチェックサムを生成
  3. チェックサムをランダムな文字列の最後に付与
  4. 2048個のあらかじめ決められた英単語の辞書のインデックスとして使うために、文字列を11bitずつの部分に分割
  5. mnemonic codeを表す12から24個の英単語を生成
思ったこと

chainをイメージすると良いのかな

階層的決定性(HD)ウォレット

決定性ウォレットの最も進んだ形らしい. 親鍵が子鍵を生成し、ツリー状の形状を持ったウォレット.

シードからマスター鍵が生成され、 マスターをルートとして鍵が生成される.

利点

  • ツリー上なのでブランチごとに役割をもたせることができる
  • 秘密鍵にアクセスすることなくユーザが公開鍵を生成できる

ウォレットの作成手順

ルートシードをHMAC-SHA512というアルゴリズムを通した結果である ハッシュ値をもとに マスター秘密鍵と マスターchain code が生成される.

マスターchainについては次章で説明する.

小秘密鍵の導出

子鍵導出関数を使って親鍵から小鍵を生成します.

小鍵導出関数は以下の要素を組み合わせ 一方向ハッシュ関数(HMAC-SHA512)に通すことで得られる.

  • 親秘密鍵または親公開鍵
  • chain code(256bit)と呼ばれるseed
  • index(32bit)

小鍵を持っていても chain codeを持っていなければ 他の小鍵を見つけることができない.

ハッシュ関数から出力された値は 512bitのハッシュ値で 256bitづつに分けられる.

右半分はchain codeになり、 左半分の256bitとインデックスを足し合わせて小鍵を生成する.

何が嬉しいのか

秘密鍵だけを見たとき、 非決定性ウォレットで生成された鍵と見分けがつかない.

鍵拡張

親鍵とchain codeで生成する方法を鍵拡張という.

小公開鍵の導出

作りかたには2種類ある. 親公開鍵から生成するか、 親秘密鍵から生成する.

無制限に安全に公開鍵とビットコインアドレスを生成できるが、 使うことはできない. 拡張秘密鍵を使って対応した秘密鍵を生成しトランザクションに署名すると 使用可能になる.

応用

拡張秘密鍵を コールドストレージや ハードウェアウォレットに保存する.

受け取り用のビットコインアドレスを 自由に作ることができる.

強化子公開鍵の導出

潜在的なリスクがある. 拡張公開鍵に触れても子秘密鍵には触れないが、 拡張公開鍵はchain codeを 含んでいるため もしこ子秘密鍵が漏洩してしまった時、 他の子秘密鍵が導出できてしまう.

解決策として 強化導出と呼ばれる導出関数を使っている.

この関数は 親公開鍵と 子chain codeの関係を壊すもの.

強化導出関数は 親公開鍵の代わりに 親秘密鍵を使って 子chain codeを導出する.

何をしているのか

ツリーの関係性を壊すことで 拡張が行われた階層よりも上にいけない ファイアウォールのようなものを作り出す. マスターキーと一階層の間には常に強化導出関数を用いることが望ましい.

indexについて

導出関数で用いられているindexは32bit. 何故か導出関数と強化導出関数で得られたindexを区別したいらしく 0~2^31-1は通常の導出関数, 231~232-1は強化導出関数に使われる.

読んだり、表示したりしやすいように.... (心の声:そもそも読ませるものなの?先に何の意図があるものなのか書いて)

HDウォレット鍵識別子(path)

HDウォレットにある鍵は path命名規則によって一意に指定される.

linuxのディレクトリ構造みたいなもの. マスターキーをmと表し, 階層を/で区切って表示する.

HDウォレットのツリーをたどる

無限のツリー構造を辿るのは辛いよねって話. 解決策としてBitcoin Improvement Proposal(BIP)が提案された.

要約すると予めツリー構造を指定しておいてあげようよって考え.

高度な鍵とアドレス

暗号化秘密鍵(BIP0038)

持ち出しなどが可能で便利な 暗号化秘密鍵.

パスフレーズで秘密鍵を暗号化し, Base58Checkでエンコードする.

紙にバックアップする時によく使われる.

Pay-to-Script Hash(P2SH)とマルチシグニチャアドレス

3から始まるビットコインアドレス.

ビットコイントランザクションの受取人を 公開鍵の所有者ではなく、 scriptのハッシュを指定する.

このトランザクションに送った資金は 公開鍵ハッシュと秘密鍵署名以上のものが必要になる.

(例えば何が必要かくらい例示してくれ)

マルチシグニチャとP2SH

もっとも一般的なP2SHの実装は

Vanity Address

人間が読むことのできるメッセージを含んだビットコインアドレス.

望んだメッセージが含まれるビットコインアドレスがでるまで 生成を数十億回繰りかえすらしい.

セキュリティ

同じメッセージを持ったビットコインアドレスを作ることはできる.

なんかVanity Addressをつくるコストに見合わない的なこと書いてるけど、 まあセキュリティ的にはむっちゃ微妙ということだね.

ペーパーウォレット

秘密鍵を紙に印刷したもの. コールドストレージとも言われる.