今回はブロックチェーンのブロックの構造について紹介します。
できる限り「Short & Simple」を心がけます。
なお、私もブロックチェーン初学者なので、内容に誤り等ありましたらご指摘いただけると幸いです。
ブロックの構造
ブロックは、大きく分けて2種類のデータで構成されている。
- そのブロックに関する情報(メタデータ)を含むブロックヘッダ
- そのブロックに含まれるトランザクションのリスト
Bitcoinにおけるブロック構造は以下のとおり。
サイズ | フィールド名 | 説明 |
---|---|---|
4バイト | Block Size | この次のフィールドからブロックの最後までのデータサイズ(単位はバイト) |
80バイト | Block Header | nonceなどブロック自身に関するいくつかの情報 |
1-9バイト | Transaction Counter | ブロックに含まれるトランザクションの数 |
可変 | Transactions | ブロックに記録されるトランザクションのリスト |
ブロックヘッダ
3種類のメタデータが含まれる。
- 1つ前のブロックのハッシュ値
- マイニング競争に関係するメタデータ(difficulty、タイムスタンプ、nonce)
- ブロック内の全トランザクションを要約した情報(マークルツリーのルートハッシュ)
(「マイニング」や「マークルツリー」については別途記事を書こうと思います。)
Bitcoinにおけるブロックヘッダ構造は以下のとおり。
サイズ | フィールド名 | 説明 |
---|---|---|
4バイト | Version | ソフトウェア/プロトコルのバージョン番号 |
32バイト | Previous Block Hash | 親ブロック(1つ前のブロック)のハッシュ値 |
32バイト | Merkle Root | ブロック内の全トランザクションに対するマークルツリーのルートハッシュ |
4バイト | Timestamp | ブロックの生成時刻 |
4バイト | Difficulty Target | ブロック生成時のproof of workのdifficulty |
4バイト | Nonce | proof of workで用いるカウンタ |
ブロックのハッシュ値
ブロックに関する情報の中で最も重要なものの一つとしてブロックハッシュがある。
これは、ブロックヘッダに対してSHA-256(ハッシュ関数)アルゴリズムを用いて2回ハッシュ化して得られる32バイトの値であり、各ブロックにユニークに与えられる識別子である。
※ハッシュ値の計算のインプットには「ブロックヘッダのみ」が利用される
なお、Bitcoinにおける最初のブロック「genesisブロック」のハッシュ値は以下である。
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f