階層的決定性ウォレットを理解しよう

22
階層的決定性(HD)ウォレットを理解する ビットバンク社 技術顧問 ジョナサン・アンダーウッド

Upload: bitbank-inc-tokyo-japan

Post on 16-Jul-2015

319 views

Category:

Technology


0 download

TRANSCRIPT

階層的決定性(HD)ウォレットを理解する

ビットバンク社 技術顧問

ジョナサン・アンダーウッド

・階層的決定性ウォレット(BIP32)とは・HDウォレットの日常的な使い方・アカウント派生スタンダード(BIP44)が目指す未来と現実①BIP32ワークショップ:パイソンでHDウォレット作ろう

ーマスターxprvの生成ー各種アウトプットーパスに従って子キーを生成

ーハードキーの生成の違い②BIP44の構成

ー各層の役割ーアカウント

・BIP44クイズ

概要

https://www.dropbox.com/s/x5dl6bnkgtzywme/BIP32.zip?dl=0

ワークショップ用ライブラリhttps://goo.gl/M8zuB7

http://www.tutorialspoint.com/execute_python_online.php

階層的決定性ウォレットとは

・一つのシードから無限大に鍵ペアを生成していく仕組み・各鍵ペアから更に生成ができ、階層に分けられて、管理がロジカル・同一アドレスの再利用を防止できるのでセキュリティーにも良い・バックアップはシードのみなので非常に楽・公開鍵を秘密鍵と独立した環境で生成できて、  紐付く秘密鍵は安全な場所で保管できる・マルチシグなどと併用することで本当のメリットが明確になる

階層的決定性ウォレットとは

・シードのバックアップは1回のみ、バックアップの心配をする必要なし・ウォレットソフト側でどのアドレスが残高を持っているかを管理し、  取引履歴の無いアドレスが常に新しく表示されているように・送金するごとにお釣り用に新しいアドレスを生成、その残高も裏で管理・条件の揃った別ウォレットアプリにインポートしても、ちゃんと残高確認をして、gap limitに到達すれば生成を止める。・単一アドレスより、ある程度のプライバシー向上は期待できる

HDウォレットの日常的な使い方

・現在、派生の考え方や使っている索引はたくさんある・BIP44の内容は、派生パスのルール。統一することでウォレットの互換性  向上を計らっている・将来の機能性を考えて色々と作りこまれている。・しかし、まだ導入しているウォレットが少ない。 -既存ウォレットの切り替えに抵抗

アカウント派生スタンダード(BIP44)が目指す未来と現実

・楕円曲線とビットコインのアドレス周りの関数が入ったライブラリをインポート・必要なパラメータを定義

str ーchaincode: 生成時のハッシュstr ーprivkey: 秘密鍵str ーpubkey: 公開鍵

   bool ーis_private: privkeyを知っているかint ーdepth: 派生パスの深さstr ーfingerprint: 親キーの繋がりint ーchild_num: キー索引

   bool ーhard: ハードキーか否か

BIP32ワークショップ:パラメータ

・@classmethodでパラメータとしてクラスを継承  (selfのものはインスタンスを継承している )・BIP32のスペック見ると 128bit ~ 512bitの間からと あるので、16バイト~64バイトの間じゃなければ ×・マスタ生成ではHMACのキーが「Bitcoin seed」 ハッシュはSHA512を利用・左右32バイトずつ分割、 左=秘密鍵 右= chaincode

BIP32ワークショップ:マスタ生成

・残りの値も初期状態にするため、全て0に。

・returnではクラスの初期データを挿入

・これでマスターキーができた

・HDの派生可能な鍵を出すフォーマットが xprv/xpub・フォーマットは下記の通り:①xprv = ‘0488ade4’; xpub = ‘0488b21e’ (4バイト)(testnetは tprv = ‘04358394’; tpub = ‘043587cf’)②depth(1バイト)③fingerprint(4バイト)④child_num(4バイト) (msbのビットがハードフラグ )⑤chaincode(32バイト)⑥(’00’ + privkey)(33バイト) OR  pubkey(33バイト)・それをアドレスと同じBase58Checkでエンコード

・例:xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi

BIP32ワークショップ:xprv/xpub

・各層の各キーをビットコインアドレスにできる。・bitcoinで用意した関数をそのまま利用。

BIP32ワークショップ:アドレス系

BIP32ワークショップ:CKD・子キーを生成するに当たって大事な分岐が 2つある

ー親がxprvかxpubかー (xprvのみ) ハードか否か

・右記がxprvからの生成・ハード生成の場合は子キーの索引の msbを1に・ハードだとハッシュに掛けるデータが秘密鍵

ー公開鍵のみの生成を不可能にするため・ハッシュの左半分と親秘密鍵を足し合わせることで 子キーの秘密鍵が出来上がる

ー楕円曲線マジでおもしれー!!!・秘密鍵を使って新公開鍵を算出・child_numはmsb取り除く・ハードかどうかはboolに収めておく

・親公開鍵⇒子公開鍵の生成も殆ど同じー次のスライドへ

BIP32ワークショップ:CKD

pubCKDとprivCKDの関係:

d = 親秘密鍵p = 索引ハッシュ

x = 子秘密鍵D = dG; P = pG; X = xG

X = D + PxG = dG + pG

x = d + p mod n

BIP32ワークショップ:派生パス

・m/0/145/0’/234のように、mで始まって各層の子キーの索引を 10進法で書いていく・「’」が数字の最後に付くものは ハード生成になる。

ーもう一つ「H」と書く人も

BIP32ワークショップ:その他

・クラスをxprv/xpubから構成する@classmethodと・クラスの持っているデータを xprvからxpubにするための関数

BIP44の基本パス: m/44’/k’/a’/c/x・44’:BIP43にて、1層目に関連するBIPの番号を入れる・k’:コインの種類、複数の暗号通貨を用いる将来を想定、 0’ = ビットコイン・a’:アカウントの索引、これより下はハードじゃなくなる・c:お釣り用か否か、1か0・x:鍵の索引、順番に数えていく

例: m/44’/0’/0’/1/4 = 1つ目のアカウントの5つ目のお釣り用キーm/44’/0’/6’/0/25 = 7つ目のアカウントの26個目の非お釣り用キーなどなど

BIP44の構成:各層の役割

BIP44の基本パス: m/44’/0’/a’/0/0・アカウントより下はハードではないため、xpubのみでの全ての鍵の生成が可能。・これで1つの元シードのバックアップで、用途別にアカウントを使い分けることが可能。・代理で公開鍵をしてもらいたいときに便利:マルチシグにもってこいの機能性。

BIP44の構成:アカウント

ルール:①提供したパイソンスクリプトでBIP32クラスをコマンドで作り、  そのクラスの派生を行います②お題の派生ルートの先には、ビットコインが少しだけあります③ビット先取制

ヒント:①to_WIFpriv() ⇒ http://goqr.me/ ⇒お好きなモバイルウォレットで全額入金②bip32.pyが完成しているものが https://github.com/junderw/benkyokai/

BIP44クイズ

from bip32 import *HD = BIP32.from_seed(‘bitbank japan bitcoin’)

BIP44クイズ:スタート地点

8つ目のアカウントの347個目のお釣り用アドレス

1Lm2Vm9dPJY5rr51YK1H5K3AADrsQrDxet200 bits

BIP44クイズ:お題①

2つ目のアカウントの24個目の非お釣り用アドレス

17X8cyg178AZLSuurc5xfGtsEfYpjUNkB8200 bits

BIP44クイズ:お題②

378個目のアカウントの2147483648個目のお釣り用アドレス

1B1uMeWB4QEk2J1EAzeZX2qR5A3kXS8FUd500 bits

BIP44クイズ:お題③

御清聴ありがとうございました。