MinChain
– Bitcoin ライクな最小限のブロックチェーン実装
竹井 悠人
ソフトウェア エンジニア
株式会社 bitFlyer
2017/6/10 第9回「広域センサーネットワークとオーバレイネット
ワークに関するワークショップ」
https://goo.gl/q1AzCe
自己紹介
Yuto Takei
Software Engineer
東京大学 CS専攻 修士 ‘13 (形式検証)
未踏 ‘13 (予定調整最適化アルゴリズム)
守備分野 : 型理論, セキュリティ
C# / OCaml 使い
bitFlyer のブロックチェーン
C# でスクラッチから設計した
ブロックチェーンを研究・開発
弊社、困っています
ブロックチェーンを作れるエンジニアが、まだまだ少ない
一緒にチームで開発したいひとは、
● 高いプログラミング能力をもっており、
● 英語の文献を追いかけられる英語力があり、
● 計算機科学に対して十分な理解があり、
● Bitcoin などの基礎を理解している人
では Bitcoin を理解しているとは?
Bitcoin を理解しているとは
「Bitcoin もってる?」
● 儲かった?
私はトレードを始めてから
一度も利益を出せたことがないので
技術能力とまったく関係ない
Bitcoin を理解しているとは
「マイニングしてみたことある?」
● 掘れた?
初期のころに採掘して稼いだ人なら
感度が高いということで別枠としても、
(残念ながら) 技術能力とあまり関係ない
Bitcoin を理解しているとは
「Mastering Bitcoin 読んだ?」
● どうして Bitcoin は信用できるの?
● 支払いをするにはどうすればよい?
● ハッシュ関数はどの場面で使われている?
● 公開鍵暗号は Bitcoin にどう活用されている?
● マイニングでは何をするの?
ブロックチェーンにかかわるエンジニア
としては必須レベル
Bitcoin を理解しているとは
 (Bitcoin じゃないけど)
「Ethereum って知ってる?」
● スマート コントラクトとは?
● Solidity 書ける?
● geth 走らせたことある?
● 最近儲かった?
Bitcoin 以外を知っていたら
興味レベルは高い!
(Source: https://www.ethereum.org/)
Bitcoin を理解しているとは
「BIP って知ってる?」
● BIP 9 : フォーク方法
● BIP 11 : Multisig (M-of-N)
● BIP 16 : Pay-to-script-hash (P2SH)
● BIP 32 : 階層型 Wallet 実装
● BIP 37 : Bloom filter 導入
● BIP 62 : DER 署名
めちゃくちゃ詳しい
(ここまでは求めない)
(Source: https://github.com/bitcoin/bips)
Bitcoin を理解しているとは
「SegWit / Bitcoin Unlimited 問題?」
● BIP 102 : 2MB Block
● BIP 141 : Segregated Witness
● BIP 148 : User Activated Soft Fork
● BUIP 2 : Bitcoin Unlimited
大いに政治要素が絡んでくるので
ここまで追いかけているエンジニアは
現場にしか生息しない
Support by Bitcoin Proposal
Explicit Mining Pool Support by Proposal
(Source: https://coin.dance/ 2017/6/9 5:00 UTC)
ブロックチェーンに必要な計算機の知識とは
「アルゴリズム イントロダクション読んだ?」
● 暗号プロトコル設計したことある?
● コンパイラ作ったことある?
● 独自言語つくってみたくない?
● CPU 作ったことある?
● ブロックチェーン OS ってカッコよくない?
元ネタ : エンジニアが作ってみたい三大オレオレ (要出典)
(だいぶ誇張がありますことをご承知ください...)
ブロックチェーンに関係する技術 (一般論)
● セキュリティ
○ ハッシュ関数
○ 電子署名 / 楕円曲線暗号
● マルチ エージェント
○ 合意形成問題 / 非同期処理
● ネットワーク
○ ソケット管理 / Peer-to-Peer 通信
○ 分散ハッシュ テーブル
● データ構造・アルゴリズム
○ ハッシュ木 (マークル木)
○ ブルーム フィルタ
○ ハッシュ テーブル / KVS
● OS
○ プロセス / スレッド管理
○ メモリ管理 / GC
○ 排他処理 / セマフォ
○ ファイル システム
● コンパイラ関連 / script 実行等
● 情報数学
○ 確率論 / 誕生日パラドックス
○ データ圧縮
● 開発プロセス / その他
○ 設計 / テスト
○ 適切な例外処理
ブロックチェーン エンジニアが誕生するまで
計算機科学
への理解
ブロックチェーン
への理解
プログラム
かける << <<<<
越えられない壁!
つくりました、学習用ブロックチェーン
MinChain
ブロックチェーンへの理解を深める (or 確かめる) ために、
Bitcoin に類似した最低限の機能だけを備えた、オープン ソース プロジェクト
● 最低限のデータ構造 : トランザクション、ブロック
● 簡単なネットワーク接続モジュール
● ブロック実行をして、資産の移動を管理
● マイニングをおこなう
たった 2,000 行!
(Bitcoind はだいたい C++ で 8 万行くらい)
MinChain のモジュール構成
Executor
Mining
KeyGenerator
Config
Genesis
ツール群
InventoryManagerConnectionManager
解釈前のブロック保持
Memory Pool 保持
InventoryMessage 処理
Executor ブロック通知
Listener 新規接続待ち受け
Peer 一覧を保持
特定ピアへの送信
ブロードキャスト
Message 受信コールバック
実行済みブロック保持
UTXO の追跡
未実行ブロック一覧保持
ブロック適用/ 取消
Runner
各モジュールの
初期化 / 終了
Program
エントリ ポイント
コマンド振り分け
どういう拡張ができるか
● 今、使っているシリアライザは MessagePack for C# だけど速くできる?
● トランザクション、ブロックを全員に配るコードになっているが
効率的に配布したほうがネットワーク輻輳を防げるのでは?
● 実際のクライアントはウォレット実装がないと使い物にならないのでは?
● フォーク化でのブロック実行がナイーブだけど、高速化できる?
● Multisig や、SegWit をサポートすることはできる?
● マイニングでより多くの報酬を生むにはどうすればよい?
まとめ
● ブロックチェーンを実装できるエンジニアを増やしたい
○ コンピュータ科学に関する十分な理解
○ Bitcoin, Ethereum などのブロックチェーン実装の知識
● MinChain – Bitcoin ライクな最小限のブロックチェーン実装
○ Proof of Work スタイルのコンセンサス アルゴリズム
○ 最低限のトランザクション実行の仕組み
○ 単純なメモリ プールと UTXO の実行の仕組み
● さまざまな拡張ができる
○ 動作の高速化 / 署名関連の機能追加 / 効率的なマイニング

MinChain – Bitcoin ライクな最小限のブロックチェーン実装