FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

「ブロックチェーン・プログラミング」を読む (ビットコインとブロックチェーンの基本)

ブロックチェーン・プログラミング」第2章はビットコインの基本を復習しておく。 Mastering Bitcoinを読んでいるので、ある程度理解できるのでサクサク読み進めていく。

ブロックチェーン・プログラミング 仮想通貨入門 (KS情報科学専門書)

ブロックチェーン・プログラミング 仮想通貨入門 (KS情報科学専門書)

2. ビットコインブロックチェーンの基本

2.1 ビットコイン・ネットワーク

2.2 ブロックチェーンの同期

2.3 電子マネーの理想像を実現したビットコイン

  • 電子マネーの最大の問題: 二重使用
  • ビットコインは、この問題を参加者全員による台帳記録の検査という方法で解決した。

2.4 分散台帳としてのブロックチェーン

2.5 トランザクションのブロードキャストによる送金

2.6 非可逆的記録としてのブロックチェーン

  • 台帳の改ざんを防ぐために用意されている2つの技術: ハッシュチェーンマイニング

  • 暗号学的ハッシュチェーン: データのハッシュ値を次のデータに埋め込み、一連のデータのチェーンを作る。

  • ブロック高: ブロックチェーンの順序を表す。ブロック高が0のブロックを、世界の始まりを意味するジェネシス・ブロックと呼ばれる。

  • プルーフ・オブ・ワークマイニングの計算によって得られる計算結果

    • もしブロックチェーンの内容を書き換えようとすると、ブロックに含まれるプルーフ・オブ・ワークも再計算する必要があり、そのためには計算競争に参加しているすべてのマイナーを上回る計算能力が必要となる。
    • マイニングの能力に応じて、2016ブロックごとに平均時間が産出され、新しくブロックが作成されるのに要する時間の平均が10分になるように調整される。
    • マイニングプール: 複数のマイナーたちが協力してマイニングを行い、提供した計算能力の比率に応じて報酬を分け合う。
  • マイナーが作成した新しいブロックは、ビットコイン・ネットワーク全体にブロードキャストされる。

    • このブロックは他のノードによって正当性を検証され、正しければノードのブロックチェーンに接続される。
    • 正しくなければブロックは破棄されるので、マイナーは慎重にブロックを作成する必要がある。

2.7 公開鍵の電子署名を利用した電子通貨の使用

2.8 ブロックチェーンの記録の正当性とコンセンサス

  • ビットコインの送金情報は世界中のいたるところで発生し、世界中に向けてブロードキャストされるが、ネットワークのレイテンシにより時間がかかる。
    • マイナーがマイニングしたブロックを受け取るノードは、地球上の場所により異なる。ノードにより受け取る順番が異なる可能性がある。
    • 複数の分岐が発生した場合、ビットコインのコンセンサスでは、最も長い枝が正当なブロックチェーンであるというルールになっている。
  • マイナーが意図的に作成したチェーンを最長となるまで伸ばして、正統なチェーンとできるならば、そのマイナーによって歴史が支配できてしまう状態になる。
    1. 送金者による商店への支払いを意味するトランザクションをブロードキャストし、そのトランザクションがブロックに取り込まれたことを確認した商店が商品を発送したとする。
    2. マイナーでもある送金者は、商品を受け取った後に、その支払いに使ったUTXOを自分自身に送信するという、競合する別のトランザクションを作り、商店への支払いトランザクションが含まれるブロックの直前のブロックに後続するブロックに組み込んでブロードキャストする。
  • ただし、上記の状態は、競争相手のマイナーたち全員を上回る計算能力を得た時に限る。
  • コンセンサス・アルゴリズム(合意形成アルゴリズム): ブロックチェーンの中で、分散システム全体で正当な情報を唯一に定める方法。
    • ビザンティン合意問題 / FLP不可能性: 故障や裏切り者が存在するような分散システムにおいて、合意形成アルゴリズムを求める問題。難問。
    • シビル問題多数の架空の人格の集団を作って攻撃を行う。
  • プルーフ・オブ・ワーク法 は、マイナーたちの欲望に基づく計算競争を利用したコンセンサス。
  • トランザクションの確認数: トランザクションがブロックに取り込まれてから現在の最新のブロックが接続されるまで何個のブロックが存在しているか、という数のこと。