HD Wallet

privateKey * G = publicKey
(privateKey + i) * G = privateKey * G + i * G

i は推定不可能にするため、インデックスに加えて256ビットの巨大な乱数を1つ追加する
さらにハッシュ関数を適用する

乱数cとインデックスiを入力してハッシュ値をとったものをインデックス代わりに使用する
このインデックスと乱数を含んだハッシュ値をchain codeと呼ぶ

chain_code = h(i, c)

決定性ウォレットは最初の親秘密鍵と最初のチェーンコードだけをバックアップしておくだけで良い
最初の秘密鍵mはマスター秘密鍵、 M = mGはマスター公開鍵と呼ばれる
この二つの情報を生成するルールシードというデータを秘密情報の基点にしている。

マスターチェーンコード: mcc
インデックス: i=0, i=1,
インデックスiの子秘密鍵: priv0, …
インデックスiの子公開鍵: pub0, …
インデックスiのチェーンコードの左256ビット: cc0L, cc1L
インデックスiのチェーンコードの右256ビット: cc0R, cc1R

HMACとは暗号学的ハッシュ関数を使ったMAC
ビットコインではHMAC-SHA512のHMACが利用されている
マスターチェーンコードmccとマスター公開鍵M=mGからインデックスi=0の時のチェーンコードを計算し、その左256ビットを取り出す
このチェーンコードの左256ビットとマスター秘密鍵mの和がインデックスi=0の子秘密鍵になる。
iを0, 1, 2と変えることで、子秘密鍵・公開鍵を次々と作ることができる。

作成したチェーンコードの右側に256ビットのccRとインデックスからHMAC-SHA512からccL(左256ビット)と子秘密鍵で孫秘密鍵を作成できる
同様に子公開鍵から孫公開鍵を作ることもできる。