bitcoin x slack...
TRANSCRIPT
Bitcoin x Slackでマイクロペイメントを実現!
〜生活の必要上割り勘botを作るまで〜
株式会社ビズリーチ 古山亮@ryof
20170327
D3とは
D3 (ディーキューブ) とは
創業以来、高い技術力と戦略的なUI/UXを武器に、 世の中に価値あるサービスを生み出しているビズリーチ。 サービスの数が増えるにつれ、技術の幅が広がったため、 そのスキルやノウハウを社内のみならず、 世の中のエンジニアやデザイナーとも共有すべく、
私たちは「D3※」というプロジェクトチームを立ち上げました。
D3では、たくさんのイベントや勉強会を開催し、
世のエンジニア・デザイナーと共に、さらなる高みを目指します。
※D3=DESIGNER & DEVELOPER DIVISION
Agenda
● 会社紹介
● 自己紹介
● Bot作成の経緯
● お金の話
● Bitcoinの話
● bitcore-wallet-clientの話
● デモ
● 今後の課題
● 質疑
株式会社ビズリーチのご紹介
会社紹介
自己紹介
もう少し詳しく
● 古山 亮(ふるやま りょう)
● ジュネーヴにて生まれる
● 東京にて育つ(2歳〜)
● 早稲田大学大学院にて機械学習を専攻(工学修士)
● 株式会社リクルートHDに新卒入社、プロダクトオーナーなど
● シリコンバレーにある現地子会社ベンチャーに駐在 →退職
● 全国物見遊山(2016年11月)(無職)
● 2016年12月より株式会社ビズリーチのHRMOS事業部でインフラエンジニア
私事ですが、年初からルームシェアを始めました
ルームシェアはメリットがたくさん!
● 一人暮らしよりは広いところに住める○ 3人暮らし3LDK、居間が広いので大型 4Kテレビなど置ける、キッチンも広い!
● 食材を余らせない
● 光熱費も安い
● 家事も分担できる
● 帰ったら誰かいる○ 寂しさみたいなものは感じない(人によるかも)
● 鍵を忘れても帰れる
○ 昨日実家に鍵忘れました …このイベントの後また実家に帰ります … ● 連絡はSlackで
デメリットもある!
● 割り勘が頻繁に発生
○ 洗剤や掃除用具に固定費など、わりと日常的に発生
● 日頃現金をあまり使わないメンバー
○ クレジットカードやSuicaで事足りてしまう
● なかなか手元にちょうどいい額を持っていることが少ない…
● そもそも現金ってなんなの?21世紀なのに不便すぎない?
そもそも現金って…何?
現金とはなんなのか
● (日本においては)政府発行の通貨及び日本銀行券 ← 法定通貨
● それそのものには普遍的な価値(例: Gold)のない一種の証書
● 1931年、日本では兌換紙幣から不換紙幣へ(金本位制→管理通貨制)
○ 金との交換が保証されない信用通貨となった
○ 通貨の価値を保証するものは国の信用のみ
● 1971年、ニクソンショックで米ドルドルも金本位ではなくなる
● 世界経済は膨張を続ける
数値のやりとりだけ
● 口座への給与振込
● 物品の売買
● カード決済
● …全部数値をやりとりしてるだけ!
つまり我々は日々数値のやりとりをしているに過ぎない
ならば21世紀的にBitcoinで
でもBitcoinって…何?
Bitcoinとは
● Satoshi Nakamotoなる謎の人物により投稿された論文が元のアイデア
● P2Pな分散台帳システム(非中央集権的)
● 信用できない複数の参加者間で台帳の整合性を保証
○ 内部的にはブロックチェーンというアイデアを利用している
● 2009年よりネットワークが稼働している
● 2010年に2枚のピザと10,000BTCが交換される(史上初のBTC取引)
● 取引所Mt.Goxの破綻等、乱高下を繰り返しながらも高騰
● 2017年頭に時価総額2兆円を突破
● 3月2日、1BTCが純金1ozの価格を突破
ブロックチェーンとは?
● 計算によって分散台帳の整合性を保つ仕組み
● 各ブロックは取引の集合で、前ブロックのハッシュ値を持つ○ ブロックが鎖のように連なっていく=ブロックチェーン
● 任意の32bitの値を正解が見つかるまでハッシュ計算(SHA-256)し続ける
● 正解のハッシュ値を見つけた人には報酬として
12.5BTCが与えられる(2017年3月現在)
● 最初に見つかった正解ハッシュ値を次のブロックハッシュとして
ネットワーク全体にブロードキャスト、以後はこの値が使われる
正解のハッシュは誰が決めるの?
● 誰かが「次のブロックの正解はこれだよ」と決めるのでは中央集権的
● 一定の条件を満たすハッシュ値ならなんでも正解となる
● ビットコインでは、ハッシュ値の頭に0が並ぶ数で正解を決めている
○ 例)ハッシュ値の頭に0が8つ並んでいればそれが正解
● 正解を見つける難易度は、約10分に1回ブロックが生成されるよう、
ネットワークの演算資源量によって調整されている
○ 例) 頭に0が2つ並ぶハッシュ値と頭に0が8つ並ぶハッシュ値では後者のほうが見つけにくい
Bitcoinの概要はそんな感じ
…ということを同居者に話したところ
● とりあえずで作るからセキュリティとか甘々になると思うけど
○ 別に小額決済だしいいんじゃない?
● Fiat(法定通貨)とのレート変動リスクもあるよ
○ 別に小額決済だしいいんじゃない?
○ 面白そうだしいいんじゃない?
という反応(よかった〜
じゃあやるか
考えたこと
Slack的要件
● 割り勘の品目・価格と
請求相手を指定できる
● 債務者側は承認・否認できる
○ なんでも自動決済は流石に …
● なんか新しめのbot framework
Bitcoin的要件
● 採掘はしない
● トランザクション検証もしない
○ BC容量が数十GBとなっている…
● とりあえずtestnet
○ テスト用のネットワーク、
本番ネットワークは livenet
技術はこんな感じで決定
● Slack bot: Botkit○ Hubotでもよかったけどどうせ馴染みがない( jsほとんど書いたことない)ので
新しめのやつを使いたかった
○ 特にちゃんと比較したわけではないので Hubotとのメリデメは謎
● Bitcoin client: bitcore-wallet-client○ Bitpay社が開発している一連のモジュールのひとつ
○ Bitcore-wallet-serviceサーバと通信する
■ bwsサーバは自分で立てるか、 bitpay社の( https://bws.bitpay.com/bws/api )を使う
○ 同社のウォレットアプリCopayで使われている
■ 世界で唯一? testnetにも対応!
■ オープンソース
■ 検証・使い方を調べるのが楽!
例えば:
これがCopay
これが今回のbot
使い方の流れ
● (初回)Copayでウォレットを作成
● (初回)DMでSlack上にウォレットをアクティベートする(botに持たせる)
● 債権者(以下甲)が債務者(以下乙)を指定して債権を主張(JPYベース)
● 乙全員が承認したら、各乙のウォレットから甲のウォレットへBTCが移動
○ BTC額は全員承認した時点の JPYレート
○ 移動する額は乙がn人いたとして各乙に対し 1/(n+1) (割り勘だから)
…まで考えたはよいものの
bitcore-wallet-clientの使い方がよく分からない
● Documents的なサイトなし
● GithubにWikiなし
● README.mdに一応リファレンスはある
● サンプルなし
● 使ってみた系の情報なし(英語でも殆どなし)
● Stackoverflowで「bitcore-wallet-client」と検索したら3件だけヒット
全部インストール絡み…
仕方がないので実装にあたってはCopayのコードを参考に
ということで、bitcore-wallet-clientについて少し解説
ウォレットのアクティベート
● BIP-39で規定されているmnemonic wordsを利用
○ BIP-xxxはBitcoin Improvement Proposalsと呼ばれる文書群
○ RFCみたいなもの(たぶん)
○ Mnemonic wordsはウォレットの秘密鍵を覚えやすく表現するための 12 (or24) の単語群
○ バックアップに使われる
○ 単語群はCopay上で生成できる
○ 要するに「ふっかつのじゅもん」
● Botに「activate [12 WORDS]」と教えるとそのユーザ用にウォレットを復元
● これにより他のユーザにウォレットの秘密鍵を教えず生成が可能
○ もちろんbotの管理者は如何用にも知りようがあります …
ウォレットアクティベートのサンプル
1. bitcore-wallet-serviceのURLを渡してclientを初期化
2. Space-joinedなpassphraseを渡す
3. openWallet!
任意の額の送金
● 下記の手順で送金を実現する
● 受け手のアドレスを生成○ 今回は階層的決定性 (HD)ウォレットなので 1ウォレット=1アドレスではない
○ HDウォレットはシード( 12単語)からウォレットが生成でき、
紐づくアドレスを無限に生成できる
● 受け手のアドレス宛に任意の額でTxProposalを作成○ ※ tx = transaction
● TxProposalを発行
● TxProposalに署名
● TxProposalをブロードキャスト
送金のサンプル
● 1 BTC = 100,000,000 satoshi● ignoreMaxGap = true にするとなんの取引もないaddressをたくさん作れる
○ → デバッグ作業には便利
Botkitについて
…は日本語でも結構情報出てくるので割愛して
デモ
デモその前に
● 割り勘botはその名をricca.pay(りっか・ぺい)と言います
● 雪の降り頻る1月の奥飛騨温泉で古山が思いついたので、りっかです○ ろっか【六花】
○ 〔六弁の花の意から〕
○ 雪の異名。りっか。 - 大辞林より引用
● デモ中に大事な大事なmnemonic wordsが見えまくりますが、
Testnetでのデモなのでメモっても古山の資産は奪えません○ ※ 奪えるけど、、奪っても価値ないです
○ Livenetでmnemonic wordsを取り扱う時は誰にも分からないように厳重に保管を!
● ソースコードはべた書きしているところなど直したらGithubに公開予定
今後の課題
● Interactive button使いたい
○ 今はreactionベース。こういうのしたい →
● マルチシグウォレットを使ってみたい
○ N個の秘密鍵のうちM個があれば署名みたいなことができる
○ BIP 11: M-of-N Standard Transactions で規定
● コールバック地獄みたいなことになったのでなんとかする
○ js力不足
○ 勉強します…
最後に…
https://www.bizreach.co.jp/recruit/
ご清聴ありがとうございました!