Develop with pleasure!

福岡でCloudとかBlockchainとか。

TREZOR導入してみた

TREZOR本体に付属のUSBケーブル使ってPCに接続する。

繋いだらブラウザ開いて、trezor.io/start にアクセス。

ページ下部で、TRZORのセキュリティニュースなどを配信してるみたいなので、メールアドレスを登録。

続いてTREZORウォレットのセットアップ。「Install Extension」を選択してChrome Extensionをインストールする。インストールを実行するとTREZORのファームウェアのアップデートが始まる。

f:id:techmedia-think:20171201214839p:plain

続いてTREZOR側でアップデートが成功した旨メッセージが出るので、PCからTREZOR外して再度接続する。そうするとPCのブラウザでセットアップが始まる↓

f:id:techmedia-think:20171201214901p:plain

バイス名を入力すると、続いてPINの設定を求められる↓

f:id:techmedia-think:20171201215226p:plain:w300

PC上に表示されているマスと同じ形のマスがTREZOR上に表示されそこには1〜9の数字が表示されているので、PINに設定する数値をTREZOR上のマスの数値を見ながら、PC上のマスを選択して設定する。

PINの設定が終わるとHDウォレットのマスタードシードの元になる24個のワードリストがTREZOR上に表示されるので、各ワードをメモっていく。24個のワードリストが表示されると、確認用にもういちどワードリストが表示される。それが終わればセットアップは完了。

受信用のタブを開いてみると受信用のアドレスが表示されているが、そのアドレスの導出パスはm/49'/0'/0'/0/0と記載されていて、SegwitのP2WPKHをP2SHでネストした3から始まるP2SHアドレスになってる。

f:id:techmedia-think:20171201230743p:plain

BIP-49のアドレス導出の仕様は↓

techmedia-think.hatenablog.com

折角なのでbitcoinrbで、↑のアドレスを導出してみた↓

require 'bitcoin'

Bitcoin.chain_params = :mainnet

words = %w(↑のTREZORの24個のワードリスト).map(&:downcase)

m = Bitcoin::Mnemonic.new('english')

# シードを生成
seed = m.to_seed(words)

# マスターキーを生成
master_key = Bitcoin::ExtKey.generate_master(seed)

# m/49'/0'/0'/0/0 のパスの公開鍵を導出
pubkey = master_key.derive(2**31 + 49).derive(2**31).derive(2**31).derive(0).derive(0).pub

# 公開鍵からP2WPKHのスクリプト作ってそれをネストしたP2SHのアドレスを生成
bip49adrr = Bitcoin::Script.to_p2wpkh(Bitcoin.hash160(pubkey)).to_p2sh.to_addr

↑はアドレスの導出だけど、秘密鍵も導出できてるのでそれ使えばトランザクションの署名も可能。ただ秘密鍵導出してもプログラムで署名するとあまりTREZOR使ってる意味ないので、↓みたいに拡張公開鍵を導出して持っておくとそこから、受信用のアドレスを随時導出していくことは可能。

# m/49'/0'/0'/0 の拡張公開鍵
ext_pubkey = master_key.derive(2**31 + 49).derive(2**31).derive(2**31).derive(0).ext_pubkey

# 拡張公開鍵があれば、
xpub = ext_pubkey.to_base58
-> 'xpub...'

# 拡張公開鍵があればそこから子公開鍵を導出
ext_pubkey = Bitcoin::ExtPubkey.from_base58(xpub)
ext_pubkey.derive(1)
ext_pubkey.derive(2)