c# でブロックチェーン実装

28
C# でブロックチェーン実装 竹井 悠人 ソフトウェア エンジニア 株式会社 bitFlyer

Upload: yuto-takei

Post on 19-Mar-2017

560 views

Category:

Software


1 download

TRANSCRIPT

Page 1: C# でブロックチェーン実装

C# でブロックチェーン実装竹井 悠人ソフトウェア エンジニア株式会社 bitFlyer

Page 2: C# でブロックチェーン実装

免責

このトークは、情報提供のみを目的として行われており、正確性・最新性についての保

障は一切ありません。内容は、会社の見解ではありません。この情報を元にして生じた

不利益について、当社およびスピーカは一切の責任を負いません。

bitFlyer 上での取引についての詳細は、当社カスタマ サポートへお問い合わせくださ

い。

Page 3: C# でブロックチェーン実装

開発に参加する人むけに必要な具材

● .NET Core SDK 今日使うコードベースは .NET Core 向けに書かれていますゆえ

https://www.microsoft.com/net/download/core(.NET Core でググると出てくると思います)

● MinChain リポジトリ

以下のリポジトリのソースコードをネタに解説を進めます

https://github.com/yutopio/MinChainプルリク歓迎します

● スライド http://bit.ly/2nfyb7z

Page 4: C# でブロックチェーン実装

自己紹介

Yuto TakeiSoftware Engineer ここに何か面白いこと書く

BTC 送金お待ちしております

Page 5: C# でブロックチェーン実装

本日の話の構成

● bitFlyer での C#

● MinChain の構成について

● うごかしてみる

Page 6: C# でブロックチェーン実装

bitFlyer について

● ビットコインの取引所を運営

● ブロックチェーン関連の研究調査プロダクトの提供

● 事例紹介

https://blogs.technet.microsoft.com/mpn_japan/2016/02/16/partner-showcase-bitflyer/

Page 7: C# でブロックチェーン実装
Page 8: C# でブロックチェーン実装

システム構成

Redis Cache

● 口座画面 / 販売所● Lightning● chainFlyer

● マーケット処理● 取引約定● バッチ処理

Web Apps

Worker Roles

SQL Server

Web Roles

● fundFlyer● BTC News

● セッション管理Storage Queue

バックアップへ

Page 9: C# でブロックチェーン実装

クラウドならではのこと

3/8 (水) 夜 (JST) に Azure で障害が起きた際も、

東日本 → 西日本のマイグレーションで2 時間弱ほどで復旧

Page 10: C# でブロックチェーン実装

クラウドならではのこと

3/8 (水) 夜 (JST) に Azure で障害が起きた際も、

東日本 → 西日本のマイグレーションで2 時間弱ほどで復旧

Page 11: C# でブロックチェーン実装

bitFlyer からのトランザクションの流れ

bitFlyer で作られた

トランザクション

Bitcoin Core (bitcoind)クライアント

おそとの世界

Page 12: C# でブロックチェーン実装

すぐに .NET Core に行けるの?

YES!!

Page 13: C# でブロックチェーン実装

暗号面での強い味方

● 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

Page 14: C# でブロックチェーン実装

I Can Has .NET Core

.NET Core へ移行可能か

調べることができる

https://icanhasdot.net/

Page 15: C# でブロックチェーン実装

MinChain について

Page 16: C# でブロックチェーン実装

全体の機能相関図

Executor

Mining

KeyGenerator

Config

Genesis

ツール群

InventoryManagerConnectionManager

解釈前のブロック保持Memory Pool 保持InventoryMessage 処理Executor ブロック通知

Listener 新規接続待ち受けPeer 一覧を保持特定ピアへの送信ブロードキャストMessage 受信コールバック

実行済みブロック保持UTXO の追跡

未実行ブロック一覧保持

ブロック適用 / 取消

Runner 各モジュールの初期化 / 終了

Program エントリ ポイントコマンド振り分け

Page 17: C# でブロックチェーン実装

GitHub においてあります

https://github.com/yutopio/MinChainMIT ライセンスなので、煮るなり焼くなり、プルリク送るなりしてください

Page 18: C# でブロックチェーン実装

動かしてみましょう

Page 19: C# でブロックチェーン実装

ビルドする

.NET Core SDK が必要です

https://www.microsoft.com/net/download/core

VS2017 ユーザは .NET Core tools を入れれば

VS からビルドできるようになります

Page 20: C# でブロックチェーン実装

ビルドする

$ 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\

Page 21: C# でブロックチェーン実装

ビルドする

$ 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

Page 22: C# でブロックチェーン実装

鍵を生成する

ビルドしたバイナリがいるディレクトリに移動して実行

$ dotnet MinChain.dll genkey > key.json (自分のアドレス用の口座を作成する)$ cat key.json{ "pub": "WAAAAAEAAAAQAAAANAAAACAAAAAEj0MOwNeLA9b4gXYbURcyF5c8YPtZekJcliWafKduNyAAAAACMFgRiBxSiu3wB3/g3biz9UN8zvNGI2n/HIg88EVn8A==", "prv": "D4TuwVREhf5T3GTs4Y1psaUoHHKy3hb4gllunB2x5l8=", "addr": "MDyDMxi1ynxe1206ANBRXWOjP7o/IeQHakRDilyYrtI="}

Page 23: C# でブロックチェーン実装

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 に保存する

マイニングするので少し時間かかる

Page 24: C# でブロックチェーン実装

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) とに

それぞれ、ファイル名を変える

Page 25: C# でブロックチェーン実装

起動する

$ dotnet MinChain.dll run config.json

うまくいけば、本日のデモ用のサーバにつながり、

マイニングが始まります!

… どきどき

Page 26: C# でブロックチェーン実装

まとめ

Page 27: C# でブロックチェーン実装

Blockchain by C#

● やっと安定したマルチ プラットフォーム対応!○ 暗号系ライブラリなども揃っている

○ ソースが見える安心感

○ Bitcoin Core などとの高い運用性

● ブロックチェーンの実装が C# + .NET Core でできた!○ 基本的なところはほぼ外部依存なし

○ Azure にデプロイして、Mac および Linux でも動きました!

● エンジニア募集中

Page 28: C# でブロックチェーン実装

一緒にブロックチェーンを紡ぎましょう

Miyabi チームでは C# で Blockchain が作れます!