Upgrade to Pro — share decks privately, control downloads, hide ads and more …

福岡ブロックチェーンエコノミー勉強会「ノードとビットコインネットワーク」

 福岡ブロックチェーンエコノミー勉強会「ノードとビットコインネットワーク」

書籍「ブロックチェーン・プログラミング 仮想通貨入門 (KS情報科学専門書)」の第7章ノードとビットコイン・ネットワークについての勉強会資料です。

https://www.amazon.co.jp/dp/4061538314/

shigeyuki azuchi

March 09, 2018
Tweet

More Decks by shigeyuki azuchi

Other Decks in Technology

Transcript

  1. Copyright ©2018 HAW International Inc. all rights reserved. ノードの種類 •

    フルノード ジェネシスブロックから最新のブロックまで全てのブロックデータを保持するノー ドで(2018年3月時点で180GBほど)、スタンドアロンでチェーンの妥当性を検 証可能。 ◦ Pruningモード UTXOデータは除き、古いブロックデータから順に削除することでデータ量 が数GBに。ブロックチェーンのデータ自体の真正性は担保できるが、旧ブ ロックの要求には応えられない。 • 軽量ノード(SPVノード) ブロックチェーンの全ブロックヘッダと自身に関連するトランザクションのみを保 持するノードで主にスマートフォンなどの軽量デバイスで採用。 ブロックヘッダのサイズは80バイト固定、現状全てのブロックヘッダのサイズは 約41MBで、年間4.2MBずつ増加。 ※ ブロックデータは受信しないため、UTXOの管理はできず、信頼できるフル ノードとの接続が必要。
  2. Copyright ©2018 HAW International Inc. all rights reserved. 接続先ノードの検索 DNS

    Seed 83.243.59.57 108.90.22.38 217.42.43.178 ... 各ノードはハードコードされているDNS Seedに接続可能なフ ルノードのIPを問い合わせ、返って来たIPに接続を試みる。 接続ができたらそれらのIPをストレージに保存し、次回以降は そのIPに接続を試みる。
  3. Copyright ©2018 HAW International Inc. all rights reserved. ネットワークのメッセージ仕様 以下のメッセージフォーマットを使用して、接続先のノードとメッ

    セージを交換を行う。 名称 バイト数 型 内容 magic 4 char[4] ネットワーク(mainnet, testnet)を示すマジックバイト command 12 char[12] メッセージの種類を示す文字列( 12バイト未満の場 合は後ろを0パディング) payload size 4 uint_32 送信するペイロードのバイト数。 checksum 4 char[4] ペイロードのチェックサム。ペイロードを double SHA-256した先頭4バイト。 payload 可変 char[] 送信するデータ
  4. Copyright ©2018 HAW International Inc. all rights reserved. ハンドシェイク version

    version ネットワーク・プロトコルのバージョン services サポートする機能を示す bitフィールド (none, network, bloom,witness, ...) timestamp UNIXタイムスタンプ local_addr このメッセージを受信するノードのアドレス remote_addr このメッセージを送信するノードのアドレス nonce ランダムなnonce user_agent クライアントソフトを識別する UserAgent start_height このメッセージを送信するノードが最後に受信した ブロック高 relay リモートノードに対しトランザクションをリレーしても らうかどうかの通知
  5. Copyright ©2018 HAW International Inc. all rights reserved. ノードの検出 addr

    count アドレスエントリーの数 addr_list アドレスのリスト。各アドレスは以下の情報を持 つ。 • time • services • ip • port
  6. Copyright ©2018 HAW International Inc. all rights reserved. Initial Block

    Download(Header-First) getheaders version ネットワーク・プロトコルのバージョン hashes 自身が持つ最新のヘッダのハッシュ stop_hash 希望する最後のブロックハッシュ (通常はオール0) headers count headersの数 headers ブロックヘッダのリスト getdata count inventoryの数 inventory inventoryのリスト block header inventoryの数 txn_count トランザクションの数 txn ブロックに格納されているトランザクション
  7. Copyright ©2018 HAW International Inc. all rights reserved. データメッセージ Inventory

    type identifier hashの種類を表す識別子 • MSG_TX • MSG_BLOCK • MSG_FILTERED_BLOCK • MSG_CMPCT_BLOCK hash ハッシュ
  8. Copyright ©2018 HAW International Inc. all rights reserved. 標準的なブロックのリレー 新しいブロックを受信したノードはinvメッセージを使って接続先のノードに新しいブ

    ロックがあることを通知する。接続先のノードによって(フルノードかSPVノード)、 新しいブロックの受け取り方が異なる。
  9. Copyright ©2018 HAW International Inc. all rights reserved. トランザクションのリレー 1.

    新しいトランザクションを受信したノードは、接続先のリモートノードにinvメッ セージで新しいトランザクションがあることを通知する。 2. invメッセージにあるトランザクションを持っていないリモートノードは、getdataで そのトランザクションを要求する。 3. getdataを受信したノードは、指定されたトランザクションデータをtxメッセージで 送信する。
  10. Copyright ©2018 HAW International Inc. all rights reserved. Bloom Filter

    データの有無を効率的に判断できるアルゴリズム • 偽陽性については誤検出の可能性あり = データが必ず存在するかどうかは確定できない。 • 偽陰性については誤検出の可能性なし = データが必ず存在しないことは確定できる。 n個のビット列を(出力結果が1〜nの)k個のランダムなハッシュ関数を使用する。 ハッシュ関数1 ハッシュ関数2 0 0 1 0 0 0 0 0 0 0 1 データA ハッシュ関数1 ハッシュ関数2 0 0 1 0 0 1 0 0 0 0 1 データB ハッシュ関数1 ハッシュ関数2 データC 10 3 ハッシュ関数1 ハッシュ関数2 データD 1 6 データCは存在する判定 データDは存在しない判定
  11. Copyright ©2018 HAW International Inc. all rights reserved. Bloom Filterを使ったデータのマッチング

    SPVウォレットは以下の情報からフィルタを生成し、リモートノードに送信する。 • 秘密鍵を持つ公開鍵ハッシュ • UTXOのOutPoint • etc.. フルノードは、新しいトランザクションについて 以下の要素がフィルタに合致するか確認す る。 • トランザクションハッシュ • トランザクションの各アウトプットの データ要素 • トランザクションインプットのOutPoint • トランザクションの各インプットのデータ 要素 合致した場合がSPVノードに関連するトラン ザクション ※ SPVノードにとってはプライバシーの問題と悪意あるノードによってデータが秘匿されるリスク、 フルノードにとっては悪意ある SPVノードによるI/O、CPUリソースを消費するDoSリスクがある。
  12. Copyright ©2018 HAW International Inc. all rights reserved. 部分マークルツリーの復元 merkleblock

    block header ブロックヘッダ tx count ブロックに含まれるトランザクションの数 hash count hashesに含まれるハッシュの数 hashes 1つ以上のマークルノードとトランザクションのハッシュ flag byte count フラグリストに含まれるフラグの数 flags マークルツリーを復元する際に上記ハッシュの割当に使う フラグリスト(1バイトあたり8フラグ) 新しいブロックを受信したノードは以下の merkleblockメッセージを使ってSPVノードにブロックおよび、 そのブロックにSPVノードに関連したトランザクションがあるか 通知する。
  13. Copyright ©2018 HAW International Inc. all rights reserved. ブロックヘッダのマークルルート Block

    ブロックヘッダ 前のブロックのハッシュ マークルルート ... トランザクションリスト coinbase tx tx1 ... TX1のハッシュ TX2のハッシュ TX3のハッシュ TX4のハッシュ TX5のハッシュ TX6のハッシュ ハッシュ 12 ハッシュ 34 ハッシュ 56 ハッシュ 56 ハッシュ 1234 ハッシュ 5656 ハッシュ 12345656 各トランザクションをペアにし、それらのハッシュを結合し SHA-256ダブル ハッシュし親ノードとする。それをルートノード(マークルルート)まで繰り返す マークルツリーを構成する。 ブロックヘッダにはこのマークルルートのハッシュ値が記載される。 ハッシュ1 ハッシュ2 ハッシュ3 ハッシュ4 ハッシュ5 ハッシュ6
  14. Copyright ©2018 HAW International Inc. all rights reserved. 部分マークルツリー復元時の計算 8個のトランザクションを持つブロックで、フラグリストの値が、

    [1101111010100000]の場合 Tx1 Tx2 Tx3 Tx4 Tx5 Tx6 Tx7 Tx8 root 1 1 0 HASH1 1 1 HASH2 1 1 HASH3 0 HASH4 1 1 0 HASH5 HASH6 SPVウォレットに関係のあるトランザクション
  15. Copyright ©2018 HAW International Inc. all rights reserved. Compact Blockを使ったリレー

    blockメッセージで新しいブロックとその中に含まれる全トランザクションが伝播され るが、基本的にコインベース以外のトランザクションはほとんどのノードが既にメモリ プール内に持っており、再度伝播するののはムダ。
  16. Copyright ©2018 HAW International Inc. all rights reserved. Compact Blockを使ったリレー

    sendcmpct mode 0: 低帯域, 1:高帯域 version Compact Blockのバージョン 1: レガシー、2:Segwit cmpctblock HeaderAndShortIDs • ブロックヘッダ • short txid算出に使用した nonce • short txidの数 • short txidのリスト • prefilledtxnの数 • prefilledtxnのリスト(コイン ベースなど) getblocktxn BlockTransactionsRequest • ブロックハッシュ • インデックスの数 • 要求するトランザクショ ンのブロック内のイン デックス blocktxn BlockTransactions • ブロックハッシュ • トランザクションの数 • トランザクションのリスト Compact Blockを使ってブロックをリレーするよう通知 Compact Blockの通知内容 メモリプールに無いトランザクションを要求 トランザクションを提供
  17. Copyright ©2018 HAW International Inc. all rights reserved. リアルなブロードキャスト •

    Blockstream Satellite • 短波ラジオ 大気圏の電離層で屈折するため より広域の伝播が可能