ブロックチェーン - 分散ネットワークのプロトコル

PoWアルゴリズム

Proof of Work(Pow)アルゴリズムは、誰が参加しているか分からない分散ネットワークにおいて、取引の合意形成を可能にするアルゴリズムです。

ビットコインではProof of Workプロトコルが使われています。

Proof of Workプロトコルには、ブロック生成時の難易度設定、ノンス値のフィールドがあります。

このプロトコルには、DoS攻撃やネットワーク上のスパムなどの他のサービスの濫用を抑える手段として次の2つがあります。

①チャレンジ・レスポンス・プロトコル

チャレンジ・レスポンス・プロトコルは、リクエスタ(クライアント)とプロバイダ(サーバ)の間で直接対話型のリンクを担っています。

②ソリューション検証プロトコル

ソリューション検証プロトコルは、リクエスタがソリューションを求める前に問題を自ら課さなければならず、プロバイダは問題の選択と見つかったソリューションの両方を確認しなければなりません。

ブロックチェーンで使われる暗号技術 - ハッシュ値

任意長の文字列から一意に決まる固定長の値

ビットコインにおいてブロックチェーンが事実上、改ざんできないことを保証するときに中心的な役割を果たしているのが1方向性ハッシュ関数です。

ハッシュ関数は任意長の入力メッセージに対して固定長のハッシュ値を出力する決定的関数であり、入力が異なればハッシュ値も異なります。

大きな2つのファイルが同一であるかどうかを判定する際に、全てのデータを比較することは非効率的であるため、それぞれのハッシュ値を比較して効率化を図るといった用途に用いられます。

満たすべき3つの性質

1方向性ハッシュ関数は、ブロック作成時に近道がないことを保証します。

つまり与えられたハッシュ値を持つような入力メッセージを求めることは計算量的に困難であるという性質を持つのです。

暗号で利用されるハッシュ関数は、1方向性を含め、次の3つの性質を満たしていなければなりません。

  • 衝突困難性
  • 原像困難性(1方向性)
  • 第2原像困難性

ハッシュ関数SHA-256

ビットコインで利用しているハッシュ関数はSHA-256と呼ばれるもので、その仕様は米国の連保情報処理標準FIPS180-4に定められています。

ハッシュ値計算の流れ

ハッシュ関数は、任意長の入力メッセージに対して、固定長のハッシュ値を出力します。

また、ハッシュ関数は入力が少しでも異なると出力が全く異なるように設計されています。

つまりメッセージの局所的な違いが全体に伝搬されていくような構成となっています。

ブロックチェーンで使われる暗号技術 - 電子署名

電子署名

電子署名の目的は、データの正しさを保証することです。

公開鍵型電子署名の場合、秘密鍵を文書に署名する鍵として、公開鍵を電子署名を検証する鍵として使います。

秘密鍵を使って署名

ビットコインの場合、所有するビットコインを次の所有者に対して送るというトランザクションが確かにそのビットコインの所有者、つまり署名鍵(秘密鍵)の所有者が意図するものであることを保証します。

電子署名は、署名鍵を知っている人にしか作ることのできないデータを、署名するデータに対して作ることによって、署名されたデータは署名鍵を知っている人が意図したものであり、かつ改変されていないことを保証できるようになります。

公開鍵を使って検証

電子署名の検証は署名鍵に対応する検証鍵(公開鍵)によって行うことができます。

検証鍵は公開してよいものであるため、誰でも電子署名の正しさを検証できます。

仮想通貨の新規台帳を作るための難易度

仮想通貨は採掘競争環境が激化してもコンピュータの性能向上があっても、一定の速度でマイニングされるよう、または早くマイニングされすぎないように調整する機能を備えています。

それは採掘難易度(Difficulty)と呼ばれます。

中央管理者がいなくても仮想通貨の供給量が調整できる仕組みでインフレ抑制としての効果もあります。

難易度調整のメカニズム

ビットコインでは、難易度が変わると新規ビットコインの発行と取引承認に影響します。

もしブロック生成が遅れるとマイナーにとってはマイニング報酬が少なくなり、仮想通貨を使って取引しようとする人にとっては送金に遅れが生じます。

反対にブロック生成が早すぎるとマイナーの報酬は高くなり、利用者にとっては悪意を持ったマイナーが生成したブロックが承認されてしまう可能性が高まります。

そうすると正常な送金が行えなくなったり、仮想通貨の信頼性が失われて価値を失うことさえあり得ます。

このような理由から、一般的にビットコイン以外の仮想通貨でもマイニングの難易度を調整しています。

ブロックチェーンのIoT的な使いどころ

IoT的な使いどころ

ブロックチェーンはビットコインとともに世の中に登場したため、仮想通貨を実現するための仕組みだと思われがちですが、そうではありません。

アプリケーションの部分を取り替えれば、さまざまなサービスを実現でき、世の中にはすでにブロックチェーンを基盤とした仮想通貨以外のサービスも存在しています。

ブロックチェーンを基盤とした仮想通貨以外のサービスとしては次のようのものが挙げられます。

  • データの売買(スマート・コントラクト)
  • センサー・データの保存
  • マイコンログの保存
  • 制御コマンドやその応答の保存
  • カメラ画像の保存
  • 農作物や制作物のトレース

ビットコインの基礎知識(7) - ノード同士の通知と検証

ビットコインのノードは目的別に3種類あります。

1. SPV(Simplified Payment Verification)ノード

SPVノードは、ビットコイン利用者のインターフェースとなるノードです。

スマホやPCにウォレット・アプリを入れることでこのノードになります。

利用者の入力した取引データの正当性検証を行い、これをビットコインネットワークに送信します。

2. マイニング・ノード

マイニング・ノードはその名の通りマイニング報酬を得ることを目的としたノードです。

新規ブロックを効率よく生成するため、GPUやASICといった超高速並列計算が可能なハードウェア上で実行します。

3. フル・ノード

フル・ノードはビットコイン・ネットワークの維持運営で中心的な役割を持つノードです。

原始以来の全てのブロックチェーンを保存しています。

このノードの目的は、全ての取引データの正当性検証と二重払いデータの検証を行うことです。

ノード同士の通知と検証

利用者がウォレット(SPVノード)を使ってビットコインを誰かに送金すると、ビットコイン・ネットワークに取引データがブロードキャストされ、フルノードやマイニング・ノードがこれを受信し、正当性検証を実施します。

PoWが始まりブロックを書き込む権利を得たマイニング・ノードは、自身が生成したブロックをブロードキャストでネットワークに通知し、全ノードがこれを受信します。

ブロックを受信した各ノードは、正当性検証を実施後に自身の台帳にブロックを追記し、chainstate(取引データから生成されたデータベース)内のUTXOを更新します。

ビットコインの基礎知識(6) - 新規ブロックの生成と承認

新規ブロックの生成と承認

マイナーがビットコインからマイニング報酬を得る仕組みがマイニングです。

マイニングは10分ごとに行われ、これに参加したマイナーの中からPoW(Proof of Work)と呼ばれる一種のくじ引きで当たりを引いたノードにマイニング報酬が発行されます。

それと同時に世界中で行われた複数の取引データブロックとして台帳に書き込まれます。

生成と承認の流れ

処理の流れは下記のようになります。

  1. 利用者が送金処理を行う。
  2. 10分経過後、複数の送金履歴からいくつかの取引データをマイナーが選びます。
  3. 取引データのハッシュ値を作成します。
  4. 前のブロック・ヘッダのハッシュ値と3で作成した取引データのハッシュ値にノンスと呼ばれるビットを組み合わせ、ハッシュ関数にかけることでハッシュ値を作成します。
  5. ハッシュの先頭部に決められた数のゼロ並びが現れるまで4を繰り返します。
  6. 2で選択した取引データに自分あてのマイニング報酬と取引データに含まれる手数料を加え、自身の台帳にブロック・ヘッダと取引データからなるブロック情報を書き込みます。
  7. 他ノードに対し、選択した取引データと発見したノンスをブロードキャストします。
  8. 受信したノードは7の情報よりハッシュ値をとることでゼロ並びが出現することを確認し、正しいノンスであると判定すると、ブロックを生成し自身の台帳に追加します。

以上です。

ビットコインの基礎知識(5) - 台帳に登録されるデータの中身

マイニングによって台帳に書きこまれる主なデータは、マイナーによって選択された複数の取引データからなるブロックと、取引データから算出された利用者ごとの残高を示すUTXO(Unspent Transaction Output)です。

ブロックは複数存在し、ビットコインの創生時に作成されたジェネシスブロックから最新のブロックまでを作成順に追記する形で保存されます。

ブロックの中身

個々のブロックは次の要素で構成されています。

フィールド名サイズ(byte)内容
ブロック・ヘッダ80このブロックの内容を示す様々なメタ・データ
ブロック・サイズ4ブロック・サイズ
取引カウンタ1~9(可変)格納されている取引データの数
取引データ可変ビットコインの送受信データ

ブロック・ヘッダの中身

ブロック・ヘッダは次の要素で構成されています。

フィールド名サイズ(byte)内容
バージョン4利用しているビットコインのバージョン数
前のブロックのハッシュ値32前のブロック中のブロック・ヘッダのハッシュ値
マークル・ルート32格納している取引データのハッシュ値
タイムスタンプ4ブロックが生成された大まかな時刻
ディフィカルティ4ブロック生成の難易度
ノンス4PoWの当たりくじ

ブロック・ヘッダには3つの主要なメタデータが格納されています。

  • 前のブロック・ヘッダのハッシュ値
    先頭の文字に連続したゼロが現れます。
    このハッシュ値を通じてブロックチェーンは原始のブロックから最新のブロックまでが数珠つなぎで関係付けが行われます。
  • マークル・ルート(Merkle Root)
    ブロックに格納する取引データを多段階でハッシュしたものとなります。
    このマークル・ルートを通じて取引データとブロック・ヘッダの関係付けが行われます。

-ノンス(Nonce)
ノンスはマイニング報酬を得るために行われるPoW(Proof of Works)の当たりくじです。
これを含めたブロック・ヘッダから、次のブロックのハッシュ値を計算します。

ビットコインの基礎知識(4) - ビットコインの流れ

ブロックチェーン上でビットコインをやり取りする時には次のようなフローになります。

1. トランザクションの生成

ウォレット・アプリを操作することで、受信者のアドレスと送信者の秘密鍵で作成した署名を付与したトランザクションを生成します。

2. ノードに送信

生成したトランザクションを、ブロックチェーン・ネットワークへの参加端末(ノード)に送信します。

3. マイニング開始

トランザクションを受信した参加端末(ノード)は、トランザクションの正常性を検証後、前のブロックを生成後10分経過するとマイニングを開始します。

4. ブロック生成とブロックのブロードキャスト

マイニングで正しいノンスを見つけたノードは、受信したトランザクションと自身へのマイニング報酬を示すトランザクションからブロックを生成し、自身の台帳に追加するとともに全ノードにブロックをブロードキャストで転送します。

5. 分散台帳の登録

各ノードは受信したブロックの正常性を検証後、それぞれが持つ分散元帳の最後に書き込みます。

以上です。

ビットコインの基礎知識(3) - 参加者

参加者

ビットコイン・ネットワークには特定の管理運営者や所有者はいません

世界中の開発者がビットコイン・プログラムを開発し、さまざまな目的を持つ参加者がこのプログラムをコンピュータ上で稼働させてノードとなり、これらをつなげあうことでネットワークが構築されています。

参加者は次のように4分類できます。

  • 利用者
  • 交換所、取引所
  • マイナー(採掘者)
  • コア・プログラムの開発者

マイナーはビットコインをマイニング(採掘)して報酬を得ることを目的としています。(ビットコイン・ネットワークはシステムの維持運営への協力に対する報酬をマイナーに発行します。)

マイナーは報酬として得たビットコインを通貨取引所や交換所を通じて、個人の利用者との間で法定通貨と売買することで流通が行われます。