ツールを作りかけたのでわかるbitcoin HD Walletのしくみ

sanemat {AT} tachikoma.io

これはなに

あやふやなところもあるからわかりにくかったら突っ込んでね

アドレスの固定

shiba-shop
shiba-shop

さっきbitcoin専門社内おやつ商店の話で、1アドレスを紙に書いてしまった話をした。

アドレスは使い捨てにする

WalletのUXTO (未使用残高)をwallet実装無しで計算するツール

送金依頼のような

HD Walletと BIP0032/BIP0044の説明

HD wallet(Hierarchical Deterministic Wallet) 階層的決定性ウォレット

mastering bitcoinを読むか、BIP0032/BIP0044直接読んでくれ! 以上

mastering-bitcoin

ウォレット

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

決定性ウォレット

ウォレットで共通のseedから一方向ハッシュで秘密鍵生成

HD wallet(Hierarchical Deterministic Wallet)

13個のmnemonic codeからseedを作成 seedからmaster key生成、そこからツリー上にchild keys, grandchild keys と生成

(mastering bitcoinからコピペ)

  1. ツリー構造に情報付加できる

keyのpath こんなやつ Bitcoin second change second m / 44' / 0' / 1' / 1 / 1

  1. ユーザーが秘密鍵に触れることなく公開鍵を生成できる

ビットコインアドレスを作れる、と同じ意味合い

気になるところ

拡張公開鍵がchain codeを含んでいる

拡張公開鍵って「公開鍵」って言いつついろいろ出来てしまうので、ふつうにsshの公開鍵みたいに全世界に公開していいの? って問題意識とも関連してくるんだけど

拡張公開鍵はchain codeを含んでいるため、もし子秘密鍵が知られているまたは漏洩してしまった場合、 このchain codeを使ってその他すべての子秘密鍵を導けてしまう このリスクへの解決策として、HDウォレットは hardened child key derivation 強化子公開鍵導出 関数を使っている もし拡張公開鍵の利便性を使い、しかもchain codeの漏洩リスクを回避したいのであれば、通常の親(親公開鍵)ではなく、 強化された親(親秘密鍵)から拡張公開鍵を導出すべきです。 ベストプラクティスとしては、マスターキーの1階層目の子供を常にhardened derivationを通して導出されるようにしておくことが良いでしょう。

なんか小さくベストプラクティスが書いてあるが、一般に使われるクライアントは、みんなこれやってると思っていいんだろうか…

UTXO

UTXO (unspent transaction output)

だいたいのwalletでwallet.balance() とかでとれるやつ

ここまで来てやっと意味がわかった。

まだわからないところ

まとめ

俺たちの戦いはこれからだ!!

ツールを作ると学習が進む(作れてない)

参照

ヨタ話

プログラム言語は何で実装見てたんですか

Nodejsです

各言語の実装はbipからリンクが貼ってある

nodejsでなんとなく見たのは