c# でブロックチェーン実装
TRANSCRIPT
C# でブロックチェーン実装竹井 悠人ソフトウェア エンジニア株式会社 bitFlyer
免責
このトークは、情報提供のみを目的として行われており、正確性・最新性についての保
障は一切ありません。内容は、会社の見解ではありません。この情報を元にして生じた
不利益について、当社およびスピーカは一切の責任を負いません。
bitFlyer 上での取引についての詳細は、当社カスタマ サポートへお問い合わせくださ
い。
開発に参加する人むけに必要な具材
● .NET Core SDK 今日使うコードベースは .NET Core 向けに書かれていますゆえ
https://www.microsoft.com/net/download/core(.NET Core でググると出てくると思います)
● MinChain リポジトリ
以下のリポジトリのソースコードをネタに解説を進めます
https://github.com/yutopio/MinChainプルリク歓迎します
● スライド http://bit.ly/2nfyb7z
自己紹介
Yuto TakeiSoftware Engineer ここに何か面白いこと書く
BTC 送金お待ちしております
本日の話の構成
● bitFlyer での C#
● MinChain の構成について
● うごかしてみる
bitFlyer について
● ビットコインの取引所を運営
● ブロックチェーン関連の研究調査プロダクトの提供
● 事例紹介
https://blogs.technet.microsoft.com/mpn_japan/2016/02/16/partner-showcase-bitflyer/
システム構成
Redis Cache
● 口座画面 / 販売所● Lightning● chainFlyer
● マーケット処理● 取引約定● バッチ処理
Web Apps
Worker Roles
SQL Server
Web Roles
● fundFlyer● BTC News
● セッション管理Storage Queue
バックアップへ
クラウドならではのこと
3/8 (水) 夜 (JST) に Azure で障害が起きた際も、
東日本 → 西日本のマイグレーションで2 時間弱ほどで復旧
クラウドならではのこと
3/8 (水) 夜 (JST) に Azure で障害が起きた際も、
東日本 → 西日本のマイグレーションで2 時間弱ほどで復旧
bitFlyer からのトランザクションの流れ
bitFlyer で作られた
トランザクション
Bitcoin Core (bitcoind)クライアント
おそとの世界
すぐに .NET Core に行けるの?
YES!!
暗号面での強い味方
● Bouncy Castle PCLhttps://www.nuget.org/packages/Portable.BouncyCastle/System.Security.Cryptography 名前空間下の実装を行う強い味方
● たとえば Bitcoin でアドレス生成に使うハッシュ関数
.NET Fx : System.Security.Cryptography.RIPEMD160
.NET Core : なし
BC PCL : Org.BouncyCastle.Crypto.Digests.RipeMD160Digest
I Can Has .NET Core
.NET Core へ移行可能か
調べることができる
https://icanhasdot.net/
MinChain について
全体の機能相関図
Executor
Mining
KeyGenerator
Config
Genesis
ツール群
InventoryManagerConnectionManager
解釈前のブロック保持Memory Pool 保持InventoryMessage 処理Executor ブロック通知
Listener 新規接続待ち受けPeer 一覧を保持特定ピアへの送信ブロードキャストMessage 受信コールバック
実行済みブロック保持UTXO の追跡
未実行ブロック一覧保持
ブロック適用 / 取消
Runner 各モジュールの初期化 / 終了
Program エントリ ポイントコマンド振り分け
GitHub においてあります
https://github.com/yutopio/MinChainMIT ライセンスなので、煮るなり焼くなり、プルリク送るなりしてください
動かしてみましょう
ビルドする
.NET Core SDK が必要です
https://www.microsoft.com/net/download/core
VS2017 ユーザは .NET Core tools を入れれば
VS からビルドできるようになります
ビルドする
$ dotnet restore (依存する Nuget パッケージの取得) Restoring packages for D:\MinChain\MinChain\MinChain.csproj... Generating MSBuild file D:\MinChain\MinChain\obj\MinChain.csproj.nuget.g.props. Generating MSBuild file D:\MinChain\MinChain\obj\MinChain.csproj.nuget.g.targets. Writing lock file to disk. Path: D:\MinChain\MinChain\obj\project.assets.json Restore completed in 946.64 ms for D:\MinChain\MinChain\MinChain.csproj.
NuGet Config files used: C:\Users\yuto\AppData\Roaming\NuGet\NuGet.Config C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config
Feeds used: https://api.nuget.org/v3/index.json C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
ビルドする
$ dotnet build (ビルドする)Microsoft (R) Build Engine version 15.1.548.43366Copyright (C) Microsoft Corporation. All rights reserved.
MinChain -> D:\MinChain\MinChain\bin\Debug\netcoreapp1.0\MinChain.dll
Build succeeded. 0 Warning(s) 0 Error(s)
Time Elapsed 00:00:03.00
鍵を生成する
ビルドしたバイナリがいるディレクトリに移動して実行
$ dotnet MinChain.dll genkey > key.json (自分のアドレス用の口座を作成する)$ cat key.json{ "pub": "WAAAAAEAAAAQAAAANAAAACAAAAAEj0MOwNeLA9b4gXYbURcyF5c8YPtZekJcliWafKduNyAAAAACMFgRiBxSiu3wB3/g3biz9UN8zvNGI2n/HIg88EVn8A==", "prv": "D4TuwVREhf5T3GTs4Y1psaUoHHKy3hb4gllunB2x5l8=", "addr": "MDyDMxi1ynxe1206ANBRXWOjP7o/IeQHakRDilyYrtI="}
Genesis ブロックを作る
(自分のチェーンを作る場合。今回は行いません!)
$ dotnet MinChain.dll genesis key.json genesis.binCreating new genesis block.{ "id": "00011702146098209132fa4990686f41f3e6b9859c607c1e5c93c0204ff9d8ec", "prev": "0000000000000000000000000000000000000000000000000000000000000000", "difficulty": 2E-05, "nonce": 2538555750346862341, "timestamp": "2017-03-10T09:20:20.2375851Z", "root": "DS5gHGHSJh0f5qmxgk2PDuI6a7J4LZ7pfy3K6JorH8U=", "height": 0, "txs": [ { "id": "e44e859fe93bf48652b2dfc2386d987e544940f768379779da631fcd7206ac66", "timestamp": "2017-03-10T09:20:19.5205851Z", "in": [], "out": [ { "to": "303c833318b5ca7c5ed76d3a00d0515d63a33fba3f21e4076a44438a5c98aed2", "val": 1000000 }... (略)
key.json 記載のアドレスに
マイニング報酬を送るような
原始ブロックを作成し
genesis.bin に保存する
マイニングするので少し時間かかる
config を作成する
(デフォルト config を生成できる。今回は行いません!)
$ dotnet MinChain.dll config > config.json$ cat config.json{ "listen": "0.0.0.0:9333", "peers": [ "127.0.0.1:9333" ], "keypair": "<YOUR OWN KEYPAIR>.json", "genesis": "<GENESIS BLOCK>.bin"}
前のステップで生成した
鍵ペアファイル (key.json) と原始ブロック (genesis.bin) とに
それぞれ、ファイル名を変える
起動する
$ dotnet MinChain.dll run config.json
うまくいけば、本日のデモ用のサーバにつながり、
マイニングが始まります!
… どきどき
まとめ
Blockchain by C#
● やっと安定したマルチ プラットフォーム対応!○ 暗号系ライブラリなども揃っている
○ ソースが見える安心感
○ Bitcoin Core などとの高い運用性
● ブロックチェーンの実装が C# + .NET Core でできた!○ 基本的なところはほぼ外部依存なし
○ Azure にデプロイして、Mac および Linux でも動きました!
● エンジニア募集中
一緒にブロックチェーンを紡ぎましょう
Miyabi チームでは C# で Blockchain が作れます!