参加録「bitFlyerのC#erたちが語る、あなたの知らないBitcoin,Blockchainの世界」
2017/01/31 (火) 19:30 ~ 21:30 in 渋谷ヒカリエ
bitFlyerのC#erたちが語る、あなたの知らないBitcoin,Blockchainの世界
コンテンツ
Jeremyさん:
「Approaching some everyday (C#) programming problems practically」(20分)柴田さん:「日本最大のビットコイン取引所の裏側(仮)」(20分)
竹井さん:「フルスクラッチ Blockchain」(30分)
bitFlyerとは…
C#、.Net、Azureでサービスを運用
35名うち半数エンジニア
C#エンジニア内訳
5人フルタイム(2名デザイナー、2名エンジニア、1名ブロックチェーン)
Private Blockchainを開発している会社です。
講演①: Jeremy Simmonsさん
「Approaching some everyday (C#) programming problems practically」
F#好き
10年くらいエンジニア
保守しづらいコードについて、サンプルコードをもとに解説。
Order
OrderItem
OrderCreaterとCreateOrderがある…
voidでなにやってるか
CalicurateTotals…とか
いざ、リファクタリング。DDD的にやってみる。
OrderにBehaviorをもたせよう
public class Order
{
public Order(TaxCalculator calc)
{
/*..*/
}
}
ここで、デザインパターンの Memento Pattern を使う。
Stateの保存と保存されたStateの呼び出しのため。
Immutable Orderが作れればOK。
単体テストつくる
ダイスを振る
ランダムに目が出る
…と、あって以上。
講演②:柴田航平さん
「ビットコイン取引所の裏側 」
Webアプリエンジニア
サーバサイド、クライアントサイド担当
売買のマッチング
世界一取引量
39,098 BTC取引
サービス:"bitFlyer Lightning"
3層構成
Worker
取引所エンジン
注文マッチング
Webサーバ
JSON RPC
イベントPush(注文通知等)
クライアント
ブラウザ
Worker
取引所(同時稼働数は最大1台)…シリアルで処理する
ダウンタイムは最小限にする
アクティブ、スタンバイ構成にしたい
Azure:PaaSを利用
Azure Cloud Service
Cloud Service
冗長構成、クラスター化のサポートないので切替時を自作した
Azure Service Fabric
2016/03 GA
マイクロサービス構築用
クラスター化前提
Webサーバ
ASP.net SignalR(WebSocket使用、SocketIOみたいな挙動)
Push通知をさばく
SignalR
複数サーバでデータ共有のための”backplane”という仕組みがある
下記サポート
AzureServiceBus(初期はこれで1年くらい)
SQL Server
Redis(いまはこれ)
Azure上で障害
AzureServiceBus
メッセージングが不安定になる
Redis
いい感じ
課題:
通信料が高い
SignalRでデータ垂れ流すのも限界では?
モバイルバッテリー消費も問題
クライアントサイド
“RxJS"のデータフロー管理
SignalRのイベント、APIコール、ユーザー操作、タイマーのObservableとしてI/F
LINQもOK
サーバ側でReactiveExtensionを使ってない
Rx
SignalRでデータ受け取ったらAPIを呼び出す
1秒に1回とか
要件に応じて複雑化
型が欲しいのでTypeScript検討
Q&A:
現行のワーカーはFabricで実現可能?
→可能だが、現状いい感じに抽象化されてるため緊急要件ではない。
講演③:竹井悠人さん
「ゼロからつくるBlockChain」
MS MVP C#
C#大好き人間、16年
※スライドは追って公開予定
.Net Core 1.1.0 SDK
最小限の機能をもったブロックチェーンを動かします:MinChain
コンセプト:
Etheriumのサンプルを動かすようなものではない
SourceCodeでブロックチェーンをつくる
P2Pは時間都合で実装せず
ブロクチェーンの基本
取引データをブロックに固める、それを連結したもの。
①ハッシュ関数
メッセージのダイジェストを生成する
1:短くできる(32バイトで収まる)
2:改ざん不可にする
3:辞書の鍵にする
②電子署名 ※Util/ExService.cs
公開鍵暗号方式
楕円曲線暗号(ErecticCurve/ECC)
VS2017
Extension:拡張用ライブラリ
Util:汎用(ハッシュ関数、SHA256を二回適用、
③コンセンサスアルゴリズム
NW内の複数エンティティ(PC)どうしがルールに従う限り、安定的に合意する仕組み。
BitcoinではProof of workを使用。
Block
前ブロックID
難易度
Nonce
日時
Tx Root Hash(ブロックヘッダーに入れる、ハッシュ木。データ量を定めるため)
通信時はトランザクションデータも含める
河合さん作ライブラリ:ZeroFormattableを使用。
トランザクション
日時
送金元(IN):電子署名つき(Pay-to-pubkey-hash形式)
送金先(OUT)
UTXO(Unspent Transaction Output)
未使用のお金の管理
Transaction outputはDictionaryでデータ型
マイニング
BlockIDが難易度で定められた数以下になるように。
コインベース
Create Coinbase
フォーク
ブロック難易度高くても起こりうる
フォークすると台帳が複数できてしまう、のを避けるよう優先度をもつ
例:
0001234
↓2^4倍難しい
0000001234
MinChainについて
Program
Config
KeyGenerator
Genesis
Runner
ConnectinManager
InventoryManager
Executor
Mining
Program
コマンドもらって関数呼び出し
Runner
データもらって、接続する、接続きたらHello、モジュール呼ぶ
ConnectinManager
TCPリスナー生成
メッセージをシリアライズ
InventoryManager
メッセージ呼ばれると、ブロックリクエストを対応する
もってるか調べる、もってないなら無視、もってたらあげる
渡すときは、Executorへ渡す
Executor
InventoryManagerがトリガー
難易度判定
Runブロックでトランザクションさわる、
いざ稼働させてみる
dotnet build (DLL生成)
dotnet MinChain.dll xxx
鍵の生成
Config生成
鍵とConfigのパス指定で genesis.binが生成(※最初は自分にブロックリクエストしてもらうように指定)
dotnet MinChain.dll run genesis
マイニングが進むと difficultyが上昇していく
2009年のBitcoin的な状態を再現している…。
現状、Blackは固定でシリアライザーが必要
バリデーションないのため、放題の状態
Walletがほしい(トランザクション機能がない)
Multi-Sigができたら素敵(鍵の複数による安全化)
Blockchain Engineer 募集
miyabiチームではBlockChainつくれる場所があります。
***
以上です。
公開されたMinChainはブロックチェーンの基礎のようなので、学習教材として最適と思われました。