ビットコインとか勉強会 2 で話してきた #暗号通貨読書会

ビットコインとか勉強会#2 – connpassで20分もらって話してきた。

前口上ここから

bitcoin関連で仕事をしているみなさん、ってびりあるさんから話がありました。
ごめんなさい一ミリもしてないです。
働いてるのはマネーフォワードという会社で、普通に家計簿のrailsアプリ書いてます。

今日は2つ話を持ってきました。資料は #暗号通貨読書会

誰向けになんの話するかって言うと、二ヶ月前の俺向けですね。
bitcoinに興味あるけど、bitcoinさわったことない。
mastering bitcoin読んでみたけど、よくわかるようなわからないような。
bitcoin読書会来てみたらAsicBoost マークルルートのコリジョンの話、より効率的にマイニングできるかもしれないの論文の話してて全然わからんぞ、みたいな。
なので、まあこういうアプローチもあるんじゃない的な。

ぼくは自分でやってみないとわからなくて、やってみて学んだので、みなさんがやってみなくても持って帰れるようにしました。

WalletのUXTO (未使用残高)をwallet実装無しで計算するツールを作ろうとした。
現在進行形で作りかけ。
結論は「既存のWalletを使え」なんだけど、そのツールを作る過程でbitcoin HD Walletのしくみを理解してきたので、まとめました。

質問は雑談形式でどんどん投げて話止めてください。

前口上ここまで

発表中反応してくれた方、質問してくれた方、質問をまるなげして答えてくれた方、懇親会で話聞いてくれた方、ちょこちょこいらっしゃったので、自分の発表が手探り感満載だった割にはよかったんじゃないかなーと自画自賛しています。

資料よく読むとろくに実装面ではまだ手が動かせていないというのがわかるので、次次回ぐらいにはちゃんと実装を持っていって、感想を話します。

広告

bitcoin readonly wallet

bitcoinでreadonlyなwalletを使いたい。
リードオンリーじゃなくてもいいけど、レジ端末的なところには秘密鍵なし。
可能なら、取引ごとに異なるビットコインアドレスを生成して表示。
まあ無理でも、ウォレット単位の残高を見たい。見せたい。

結論として、公開鍵あれば読めることはわかった。ただその公開鍵公開していいかはまだよくわかってない。

規格

mastering bitcoinのHDウォレット周り読んだり、ググったりしたがいまいちピンとこない。
また、readonly address というのが、規格もあり実装しているクライアントもある。
しかし、addressをreadonlyにできても、アドレスは使い捨てるほうが良いわけで、だいぶナンダカナー感がある。

xpubで始まる master public key を持ち運べば良さそうに見える。
ただ、copay2.6.0でmaster public keyをimportする口がなさそう?。
なお、electrum 2.6.4にcopay2.6.0からwalletのmaster public keyをimportすることができた。よっしゃよっしゃ。

copayの実装

パスワード制限

いまいちなほうから。

copayは送金時にパスワードを必須にすることができる。
なので、レジ端末側に秘密鍵を入れ、送金するときにパスワードを要求することで、一応守れる。
あとMnemonic code吐き出しも設定から潰せるので、何かの時にだいぶ危ない以外は、目的が多少達成できる。
walletのexportも潰さないとダメな気がするけど、潰せるのかな。

export wallet, Do not include private key (独自実装?)

export wallet時にadvanced optionが設定できる。
秘密鍵含むことなしにexportできて、それにパスフレーズをつける。独自実装かな?

このファイルを別のcopayでimportできる(試したのはdesktop -> android)。
送金しようとすると、readonly側のウォレット的には送信のproposalを出し、秘密鍵持ってる側のウォレットに、approveの画面が出てくるところ。
このproposal機能はじめ独自実装かなと思ってたけど、独自実装じゃないっぽい。
master public key でimportしたreadonly walletのelectrumから送ってみたら、unsignedのtransactionが飛ぶ。
copay側でそれを拾って自分がsign出来そうだったらなんか出すんだ。かしこい。
そしてrejectしたらなかったことになる。かしこい。

master public key

ElectrumはWallet -> Master Public Keysから。
copayは歯車 -> Advanced -> Wallet Information -> Extended Public Keysから。
xpubではじまるやつ。

前述だけど、copayで出したpublic keyをelectrumでimportできた。ほかは試してない。

このmaster public keyがどの強度のやつなのかはよくわからない。

どの強度is何

まんまmastering bitcoinからの抜粋

強化子公開鍵導出(hardened child key derivation)
もし拡張公開鍵の利便性を使い、しかもchain codeの漏洩リスクを回避したいのであれば、
通常の親(親公開鍵)ではなく強化された親(親秘密鍵)からから拡張公開鍵を導出すべきです。
ベストプラクティスとしては、マスターキーの1階層目の子供を常にhardened derivationを通して
導出されるようにしておくことが良いでしょう。

unsigned

unsignedで送れてしまうから、うっかりするとうっかりしそう。

web api

web apiで取れるのかな。少なくともココにはなかった。
https://blockchain.info/api/blockchain_api

やりたかった定点観測

なんか作ったら or 既存のものでreadonlyのwallet定点観測できないかなーと思ってた。
親公開鍵を預ける/預かることがどのくらいリスクなのかまだよく理解してないから、まだあれ。

公開鍵を使って、ビットコインアドレスが生成できる。
また、トランザクションから自分のウォレットに属するかがわかってしまう。
秘密鍵/公開鍵という響きだけから感じる公開鍵は公開していいもの、という印象よりだいぶうかつに公開するとまずそうな気がする。

MASTERING BITCOIN二周目と商店

mastering bitcoin一周目が途中でさっぱりわからなくなったのでMastering Bitcoin一周目とbitcoin買うまで | 實松アウトプット、社内商店のとなりにbitcoinでしか買えない商店を開いて、実験してみた。

50-100円ぐらい単位で消費したい社内商店だとtransaction feesにまけちゃうなーとか、なかなかたのしい。一般的なモバイルクライアント?だとそこまでtransaction feesけちれない。

二周目はコレがこうなって、とblockchain.info みながら、なるほど、なるほどと読めた。秘密鍵なしにビットコインアドレスの残高は取れるけど、秘密鍵なしにウォレットの残高取れないと、決済とか資産管理とかつらいんじゃないかなーと思うけどどうなんだろう。

bitcoinで少額を送る

From electrum 2.6.4 (desktop)
8000bits送ろうとしたら、fee 40bitsでは送れなくて、50bitsかかった。

From Mycelium (android)
2000bits送ろうとしたら、41.46bitsかかった。

From Copay (android)
2000bits送ろうとしたら36bitsかかった。

一度8000bits受け取って、それを原資に2000bitsおくると、お釣りの計算できるまで5964bitsあるわけではなく、
0bitsになるんだ。なるほど…

Copay androidはよくあることだけどnexus 5xでカメラが逆になる。
phonegap のplugin?のバージョン上げる必要がありそうだ。

bitcoinとmoneyforward

moneyforwardでbitcoinはアグリゲーションできる。できるのだけど、1ビットコインアドレスあたり1金融機関扱いになってしまうので、実用性があんまりない。せめて1walletが1金融機関扱いじゃないとなあ。もっというと、1walletはビットコインという金融機関下の、普通預金とか定期預金とかそのカテゴリーでほしい。

現状こんなかんじになってしまう。

Screenshot from 2016-08-14 16-48-46

bitflyerだと1金融機関にまとめられる気はするが、取引所においておくってのナンセンスなのでなし。

Mastering Bitcoin一周目とbitcoin買うまで

Mastering Bitcoinの日本語版がCC by SAで読めるTranslations of Mastering Bitcoin | Mastering Bitcoinので、読んだ。

一周目、途中でさっぱりわからなくなったが最後までたどり着いた。

翻訳にむむむってところがあれば、ここから直しに行くと良さそう。多分typo直せた気がする。
Mastering Bitcoin | Overview

あとは自分でいじってみたり、alt coinやalt chain作ってみたりしないとわからんな、ということでbitcoinを買った。

1JvMhFUq7BDF1RFxXednUHSVbdvQ4j3RW7 Screenshot from 2016-08-14 00-17-37 送ってみたい人受け取ってみたい人は連絡ください。

ビットコインの保管(ウォレット比較) | Bitcoin日本語情報サイト こういうところ読んだりしつつ、まあたいていこういうのの日本語情報って周回遅れになってること多いので、コレも話半分に見ていく。

ubuntu desktop環境なので、いろいろ困るかと思いきや、Electrum (Pythonベース、GUIも)とCopay(Javascriptベース、nwjs)とで、Electrumはaptで、Copayはファイル伸長するだけで動いた。先にElectrumで環境整えたので、Electrumでやってるが、制限などなければChrome extensionなどあるCopayもよさそう。

スマホ側はandroidなのでMyceliumいれた。iosにはbreadwallet入れたが、breadwalletはまだ試してない。

クライアント側の準備ができたので、早速ビットコインを買う。ビットコインは購入所と交換所がある、などの基礎的なところからふむふむ読んでいく。bitflyer.jp にアカウント作って、銀行口座登録して承認され、住信SBIネット銀行から7000円入金。ビットコインが0.01BTC単位で買えるので、1BTC 61000円ぐらいだったので 0.11BTC購入。取引所に滞空させておく意味はないので、bitflyerの自分のアドレスから、デスクトップの自分のアドレスに送金してbitflyerの出番は終わり。transaction feeはbitflyerが今のところ負担してくれる。日本円端数がbitflyerに残り続けてしまうけど、まあしゃーない。

最小単位は現在のところ1 satoshi。100 satoshis = 1 bits (あるいは1 μBTC)。1000 μBTC = 1 mBTC、1000 mBTC = 1 BTC。
546 satoshis 以下はdustとして送金できない。
1BTC 60000円ぐらいなので、1 mBTC 60円、 1μBTC 0.06円 ぐらい。

よく、手数料安いよ、最高!の文脈でbitcoin出てくることある。ただ、それは相場として情報転送量あたりに値段をつけて、それを処理してもらうので、supereconomyモードでもコレぐらいだよ、ってcopayは表示してる。 165bits/kiB。なので、安い安いとはいっても、少ない額を送金するほど手数料の割合は増す。実際Electrumでは、少なすぎるfeeは弾かれてしまった。800bitsにfee8bitsとかそのくらい。Electrumは圧縮転送サポートしてないからデータでかくなりがち、っての数年前のフォーラムで出てきたけどいまどうかはよくわからない。8000bitsにfee40bitsは送れた。ずっと承認されなかったらどうなるんだろ?とおもうが承認されたので良かった。少額決済はやっぱりまとめないとダメなのかなあ。むー。