FUJILOG

見た、聴いた、触れたこと。 動かしたもの、書いたもの。 ウェブとリアルの備忘録です。

参加録「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

github.com


コンセプト:

 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はブロックチェーンの基礎のようなので、学習教材として最適と思われました。