22
0 から作る Blockchain 竹井 悠人 ソフトウェア エンジニア 株式会社 bitFlyer

0 から作る Blockchain

Embed Size (px)

Citation preview

Page 1: 0 から作る Blockchain

0 から作る Blockchain竹井 悠人ソフトウェア エンジニア株式会社 bitFlyer

Page 2: 0 から作る Blockchain

免責

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

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

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

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

い。

Page 3: 0 から作る Blockchain

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

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

https://www.microsoft.com/net/download/core#/current(.NET Core でググると出てくると思います)SDK バージョンが異なる場合でも、project.json を書き換えれば動きます

● MinChain レポジトリ

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

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

Page 4: 0 から作る Blockchain

自己紹介

Yuto TakeiSoftware Engineer

「Blockchain を作っています」

そう人にいうと

「マイニングしてるんですか」

って言われる毎日です

Page 5: 0 から作る Blockchain

本日の話の構成

● ブロックチェーンの基本

● Bitcoin 特有の知識

● MinChain の構成について

● うごかしてみる

Page 6: 0 から作る Blockchain

ブロックチェーンの基本

● ブロックチェーンとは

● ハッシュ関数

● 公開鍵暗号方式

● コンセンサス アルゴリズム

Page 7: 0 から作る Blockchain

ブロックチェーンとは

Block102

Block101

取引 123:A さんがこのブロックを検証した報酬 50 円は A さんがもらう

取引 124:C さんが取引 101 で受け取ったお金から A さんに 100 円あげて、B さんに 50 円あげた

取引 125:…

取引 151:Y さんがこのブロックを検証した報酬 50 円は Y さんがもらう

取引 152:A さんが取引 123 で受け取ったお金とA さんが取引 124 で受け取ったお金からC さんに 120 円あげて、X さんに 30 円あげた (お釣り)

中身

Block103

取引データをブロックに固めてそれを連続してつないだもの

Page 8: 0 から作る Blockchain

ハッシュ関数

メッセージのダイジェスト (要約) を生成する処理

1. 要約のため例) 支払先として、受取人の公開鍵を書く代わりに支払先のアドレスを記載

2. 改竄不可能にするため例) 過去のブロックのダイジェストを生成。次のブロックから参照する

3. 辞書の鍵として例) Tx ID を使ってトランザクションを識別

“hoge” ecb666d7787...SHA256

Util/Hash.csLine 9 – 19

Page 9: 0 から作る Blockchain

電子署名 (公開鍵暗号方式)

秘密鍵と公開鍵という異なる 2 つの鍵を使って暗号化や電子署名する方法

1. 受取人の公開鍵のハッシュ値がアドレスとして使われる

2. 送金者の秘密鍵でトランザクションに電子署名する

“hoge” 電子署名

秘密鍵 公開鍵

OK !

公開鍵ハッシュが 0xCAFEBABE... の人にTx: 0xC0FFEE でもらった100 BTC 送るよー

by 0xDEADBEEF

セミナー発表する前にコーヒーのみたいよー

by 0xDEADC0DE

Util/EccService.csLine 10 – 46

楕円曲線暗号 (ECC)

Page 10: 0 から作る Blockchain

ネットワーク内で複数のエンティティ (コンピュータ) 同士が、

ルールに従う限り安定的に合意できるようにする仕組み

Bitcoin では Proof of Work (PoW)という方法が使われている

コンセンサス アルゴリズム

ブロックを作るのを著しく難しくしておけば、ネットワーク内で十分安定的に浸透する

それでも万が一、同時にブロックができたら、どちらを主とするか比較ルールを決めておく

Util/Hash.csLine 21

Page 11: 0 から作る Blockchain

Bitcoin に関する知識

● ブロックとトランザクション

● UTXO

● マイニングとコインベース

● フォーク

Page 12: 0 から作る Blockchain

ブロック

トランザクションをまとめる単位。ダイジェスト対象領域には

● 前ブロック ID : すべての基本

● 難易度 : 生成スピードの調整、ブロック同士の重み付け

● Nonce : ブロックの ID を調整するための領域

● 日時 : 難易度の調整のため

● Tx Root Hash : トランザクションの差替等の改竄防止、

トランザクション多寡によらずブロックのサイズを一定にするため

通信時にはトランザクション本体も加える

Block101

Models.csLine 10 – 65

トランザクション

トランザクション

トランザクション

Page 13: 0 から作る Blockchain

トランザクション

● 日時 : 現実的な理由 (Bitcoin ないかも)● 送金元エントリ (In)

○ TxID / out Index : どのトランザクションでお金をもらったか

○ 電子署名 / 公開鍵 : 送金の承認根拠 (Bitcoin では Pay-to-pubkey-hash 方式の scriptSig に相当)

● 送金先エントリ (Out)○ 送金先アドレス : 誰宛に送るのか (Bitcoin では scriptPubKey)○ 送金量 : いくら送るのか

公開鍵ハッシュが 0xCAFEBABE... の人にTx: 0xC0FFEE でもらった100 BTC 送るよー

by 0xDEADBEEF

取引を記述する単位

すべてがダイジェスト領域

電子署名の対象は、署名領域を除く

Models.csLine 68 – 140

Page 14: 0 から作る Blockchain

UTXO (Unspent Transaction Output)

支払いの元資として消費がまだなされていない

トランザクションの Out のことを UTXO という

新しいブロックは UTXO からしか使ってはいけない

Block

Transaction

Transaction

Transaction

Transaction

Block

Transaction

Transaction

Transaction

Transaction

Block

Transaction

Transaction

Transaction

Transaction

Transaction

Transaction

Transaction

Transaction

Transaction

Transaction

Transaction

Runner/Executor.csLine 31 – 42,

53 – 187

Page 15: 0 から作る Blockchain

マイニングとコインベース

ブロック生成処理にはコストがかかる

マイニングBlock ID がブロック難易度で定められた数以下になるように、

Nonce の値をインクリメントしながらハッシュする

コインベースブロックに含められる最初のトランザクションは、

マイニングにかかる報酬として

一定額を任意アドレスに送金できる

Block101

コインベース

トランザクション

トランザクション

トランザクション

Runner/Mining.cs

Page 16: 0 から作る Blockchain

ブロック難易度ブロック ID を 16 進の数値としてみれば、

先頭に 0 が並ぶ数ほど小さい数。確率的に、

ハッシュがどこまで小さい数になるべきか定める

ブロック生成速度 (ネットワーク全体のマイニング パワー)に応じて難易度を調整する。

フォークRunner/Executor.cs

Line 86

0.51 0.49

0.48 0.49

0.45 0.41

1.97

1.86

注: Bitcoin では、難易度の調整は毎ブロック行われるわけではありません

<

000001234abcdef...

0000001234abcde...

24 倍難しい

Hash

Page 17: 0 から作る Blockchain

MinChain について

Page 18: 0 から作る Blockchain

全体の機能相関図

Executor

Mining

KeyGenerator

Config

Genesis

ツール群

InventoryManagerConnectionManager

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

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

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

未実行ブロック一覧保持

ブロック適用 / 取消

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

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

Page 19: 0 から作る Blockchain

動かしてみましょう

Page 20: 0 から作る Blockchain

動かしてみる

1. 鍵の生成

dotnet MinChain.dll genkey > key.json

2. Genesis の作成

dotnet MinChain.dll config > config.json

3. Config の作成、編集

dotnet MinChain.dll genesis config.json genesis.binvim / emacs / notepad config.json

4. 起動

dotnet MinChain.dll run config.json

Page 21: 0 から作る Blockchain

Future work

● Block の構造は固定されているので、

バイナリ シリアライザを使ったほうが当然高速!

● ネットワークから受信するときのバリデーションが弱い

(攻撃しやすい)

● 誰か Wallet 作りたくありませんか

自身の公開鍵がもっている UTXO の一覧を管理すればよい

● Multi-Sig なんてできたら素敵

Transaction の構造を変更する必要がある

● ...

Page 22: 0 から作る Blockchain

ありがとうございました!