Mastering Bitcoin 第7章 ブロックチェーンをまとめます。

データの変更不可能性

  • ブロックチェーンはブロックと呼ばれる単位のデータの固まりを繋げたもの。
  • ビットコインのブロックチェーンのブロックはgenesis blockと言う最初のブロックから始まる
  • ブロック内にはそのブロックのメタデータであるヘッダー部がある
    • ヘッダーにはそのブロックが何個目(ブロック高)かや前のブロックのハッシュ値(previous block hash)が含まれる
  • 前のブロックの内容が変更されるとブロックに含まれるprevious block hashも変更されるので、このブロック自体のhashも変更される。ブロックの内容を変更するにはその後の世代のすべてのhash値を再計算しなければならず、これは非常に困難なためこのことがブロックチェーンの変更不可能性の肝となっている

ブロックの構造

ブロックはメタデータを含むヘッダーとトランザクションリストによって構成されます。

ブロックヘッダ

以下の情報で成り立ちます

  • バージョン:ソフトウェア/プロトコルバージョン番号
  • Previous block Hash:親ブロックのハッシュ値
  • Merkle Root:ブロック内の前トランザクションに対するマークルツリーのルートハッシュ(※後述)
  • timestamp
  • Difficluty Target:ブロック生成時のPoWの困難さ
  • Nonce:Powで用いるカウンタ

ブロックの識別

ブロックハッシュ

もっとも重要な識別子はブロックハッシュです。これはブロックのヘッダー部分をsha256を2回使ってハッシュしたものです。
注意点として、そのブロックのブロックハッシュは自身に含まれません。マイナーによって次のブロックのprevious block hashとして算出されます。

ブロック高

もう一つの識別子はブロック高です。
最初のブロックのブロック高はゼロです。そかから順に+1ずつされていきます。
2018年2月18日現在のブロック高は509740です。
ブロックハッシュと違ってブロック高はユニークな識別子ではありません。ブロックが異なるマイナーによって2個以上同時に生成されることがありますが、この場合一定時間は同じブロック高をもつブロックが存在します。

genesisブロック

2009年に作られたビットコインのブロックチェーンの最初のブロックです。ブロック高は0。
2008年にサトシナカモトの論文が現れてから1年後にビットコインは始まりました。

マークルツリー

先程ブロックハッシュはブロックヘッダーをハッシュ化したものと説明しましたが、トランザクションの内容もきちんと含まれています。
ただし、ブロック内のトランザクションの要約という形で。ブロックヘッダーにあるMerkle Rootがそれです。
これはトランザクションを末端の葉とするマークルツリーのルートハッシュです。

マークルツリーは大規模なデータを効率的に要約し検証できるようにするデータ構造です。
ビットコインのマークルツリーではこの図のように各トランザクションを2回sha256でハッシュしたものを底の葉として、下から上へと隣同士を足してハッシュ化していきます。そうして出来た頂点のハッシュ値がルートハッシュです。


引用元 – https://bitcoinbook.info/wp-content/translations/ja/book.pdf

ブロックにいくつトランザクションが含まれていても最終的に一つの32バイトのハッシュ値に要約されます。
特定のトランザクションがブロックに含まれているか確かめるのにlog2(N)個のハッシュ値を作るだけでよく、これにより確かめたいトランザクションをルートにつなぐためのマークルパスを生成できます。
下図ではKのトランザクションが含まれていることを確認するために必要なハッシュを示しています。青塗りで白文字のハッシュがそれです。
たった4つのハッシュ値があれば確かに含まれていることが確認できます。


引用元 – https://bitcoinbook.info/wp-content/translations/ja/book.pdf

・余談
マークルツリーはP2Pシステムで断片的にダウンロードしたデータが改竄されていないものかを検出するのによく使われているようです。
何らかのデータやソフトウェアをP2Pで配布する場合、配布もとはそのデータのルートハッシュも予め公開しておくことでノードはデータの断片が正しいものか確認できます

SPV

SPVは全てのトランザクションを持っておらず、完全なブロックチェーンをダウンロードすることもしません。あるトランザクションがブロックに含まれているかどうかをフルノードに対してそのトランザクションのマークルパスを要求することで確かめます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です