0 から作る blockchain
TRANSCRIPT
0 から作る Blockchain竹井 悠人ソフトウェア エンジニア株式会社 bitFlyer
免責
このトークは、情報提供のみを目的として行われており、正確性・最新性についての保
障は一切ありません。内容は、会社の見解ではありません。この情報を元にして生じた
不利益について、当社およびスピーカは一切の責任を負いません。
bitFlyer 上での取引についての詳細は、当社カスタマ サポートへお問い合わせくださ
い。
開発に参加する人むけに必要な具材
● .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プルリク歓迎します
自己紹介
Yuto TakeiSoftware Engineer
「Blockchain を作っています」
そう人にいうと
「マイニングしてるんですか」
って言われる毎日です
本日の話の構成
● ブロックチェーンの基本
● Bitcoin 特有の知識
● MinChain の構成について
● うごかしてみる
ブロックチェーンの基本
● ブロックチェーンとは
● ハッシュ関数
● 公開鍵暗号方式
● コンセンサス アルゴリズム
ブロックチェーンとは
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
取引データをブロックに固めてそれを連続してつないだもの
ハッシュ関数
メッセージのダイジェスト (要約) を生成する処理
1. 要約のため例) 支払先として、受取人の公開鍵を書く代わりに支払先のアドレスを記載
2. 改竄不可能にするため例) 過去のブロックのダイジェストを生成。次のブロックから参照する
3. 辞書の鍵として例) Tx ID を使ってトランザクションを識別
“hoge” ecb666d7787...SHA256
Util/Hash.csLine 9 – 19
電子署名 (公開鍵暗号方式)
秘密鍵と公開鍵という異なる 2 つの鍵を使って暗号化や電子署名する方法
1. 受取人の公開鍵のハッシュ値がアドレスとして使われる
2. 送金者の秘密鍵でトランザクションに電子署名する
“hoge” 電子署名
秘密鍵 公開鍵
OK !
公開鍵ハッシュが 0xCAFEBABE... の人にTx: 0xC0FFEE でもらった100 BTC 送るよー
by 0xDEADBEEF
セミナー発表する前にコーヒーのみたいよー
by 0xDEADC0DE
Util/EccService.csLine 10 – 46
楕円曲線暗号 (ECC)
ネットワーク内で複数のエンティティ (コンピュータ) 同士が、
ルールに従う限り安定的に合意できるようにする仕組み
Bitcoin では Proof of Work (PoW)という方法が使われている
コンセンサス アルゴリズム
ブロックを作るのを著しく難しくしておけば、ネットワーク内で十分安定的に浸透する
それでも万が一、同時にブロックができたら、どちらを主とするか比較ルールを決めておく
Util/Hash.csLine 21
Bitcoin に関する知識
● ブロックとトランザクション
● UTXO
● マイニングとコインベース
● フォーク
ブロック
トランザクションをまとめる単位。ダイジェスト対象領域には
● 前ブロック ID : すべての基本
● 難易度 : 生成スピードの調整、ブロック同士の重み付け
● Nonce : ブロックの ID を調整するための領域
● 日時 : 難易度の調整のため
● Tx Root Hash : トランザクションの差替等の改竄防止、
トランザクション多寡によらずブロックのサイズを一定にするため
通信時にはトランザクション本体も加える
Block101
Models.csLine 10 – 65
トランザクション
トランザクション
トランザクション
トランザクション
● 日時 : 現実的な理由 (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
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
マイニングとコインベース
ブロック生成処理にはコストがかかる
マイニングBlock ID がブロック難易度で定められた数以下になるように、
Nonce の値をインクリメントしながらハッシュする
コインベースブロックに含められる最初のトランザクションは、
マイニングにかかる報酬として
一定額を任意アドレスに送金できる
Block101
コインベース
トランザクション
トランザクション
トランザクション
Runner/Mining.cs
ブロック難易度ブロック 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
MinChain について
全体の機能相関図
Executor
Mining
KeyGenerator
Config
Genesis
ツール群
InventoryManagerConnectionManager
解釈前のブロック保持Memory Pool 保持InventoryMessage 処理Executor ブロック通知
Listener 新規接続待ち受けPeer 一覧を保持特定ピアへの送信ブロードキャストMessage 受信コールバック
実行済みブロック保持UTXO の追跡
未実行ブロック一覧保持
ブロック適用 / 取消
Runner 各モジュールの初期化 / 終了
Program エントリ ポイントコマンド振り分け
動かしてみましょう
動かしてみる
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
Future work
● Block の構造は固定されているので、
バイナリ シリアライザを使ったほうが当然高速!
● ネットワークから受信するときのバリデーションが弱い
(攻撃しやすい)
● 誰か Wallet 作りたくありませんか
自身の公開鍵がもっている UTXO の一覧を管理すればよい
● Multi-Sig なんてできたら素敵
Transaction の構造を変更する必要がある
● ...
ありがとうございました!