Edited at

Counterwallet の mnemonic から,オフラインで Bitcoin アドレスを取得する方法

More than 1 year has passed since last update.


背景

自社サービスに Counterparty トークン SEMORA を採用したい。

まずは顧客が購入したトークンの口座に相当する Bitcoin アドレスを,顧客ごとに割り当てる必要がある。BIP32/BIP44 辺りを使っているだろうから難しいことではないはず。

自社内で counterblockd は動いているし他社提供の API を使う手もありそうだ。

しかし,顧客に割り当てる Bitcoin アドレス表示のたびに JSON RPC を発行するのも効率が悪い。

よって,オフラインでも seed から Bitcoin アドレスを割り出せるようにしたい。


課題

Counterwallet では認証方法として 12words mnemonic が使われている。しかし,用いている単語リストが BIP39 と異なっている。なんてこった。

そのため,BIP39 を扱うライブラリでは BIP32/BIP44 用の seed が得らず,Bitcoin アドレスのリストも得られない。


ハマりどころ


Node ユーザのみ

npm で配布されている bip39 パッケージは,mnemonic に BIP39 が定義しない単語が含まれていてもエラーを出さず,しれっと seed らしきものを返す。

もちろん誤った seed なので,正しい Bitcoin アドレスは得られない。

Counterwallet で表示されるアドレスと目視比較すればすぐに分かるけれども,うっかりすると危険。

bitcore-lib が提供する BIP39 関連のコードからは,きちんとエラーが得られる。


たぶん全員

Counterparty の公式情報によると「CounterWalletHelper.py スクリプトを使え」とある。

しかし,手元の環境 1 では動作しなかった。

追試した日本語圏の方もいらっしゃるようなので,どこかの時点までは期待通りに動作していたはずとは思うのだが…。

Python わからんので,深追いはしていない。


オススメ

Blockscan が,Counterwallet の nmemonic から Bitcoin アドレスを生成する静的 web サイトの雛形を公開している。

手元環境では,これは正しく動作する。サーバサイドで動かすには一手間かかりそうだけれども,コードは比較的きれいなので,なんとかなりそう。


感想

さすが Blockchan 様。





  1. Ubuntu 14.04 / Python 2.7.6 (default, Oct 26 2016, 20:30:19)