用語集 / マイニングとコンセンサス
シリアライズされたブロック
- シリアライズされたブロックとは?
- シリアライズされたブロックとは、ブロックがネットワーク上またはディスク上で変換される正確なバイト列のことです。80バイトのヘッダー、トランザクション数、そして順番に並んだ各トランザクションで構成されます。
BIP-144で規定されています。
シリアライズとは、抽象的なブロックをハッシュ計算でき、送信でき、保存できるものに変換する仕組みです。ジェネシスブロックは285バイトにシリアライズされます。80バイトがヘッダー、1バイトがトランザクション数、204バイトが唯一のコインベーストランザクションです。ブロックエクスプローラーに生の16進数を貼り付けたことがある方、またはgetblockをverbosity 0で実行したことがある方なら、これがそのときに見ていたものです。
仕組み
シリアライズされたブロックでは3つの部分が端から端まで並び、固定長なのは最初の部分だけです。
ヘッダーは常に80バイトで、順序は次のとおりです。4バイトのバージョン、前のヘッダーの32バイトのハッシュ、32バイトのマークルルート、4バイトのタイムスタンプ、4バイトのnBitsターゲットエンコーディング、そして4バイトのナンスです。次にトランザクション数が来ます。これはcompactSizeで書かれ、可変長整数で、253未満の数では1バイトを占め、膨大な数では最大9バイトになります。続いてトランザクション自体が、それぞれ完全にシリアライズされて並び、コインベースが先頭です。
BIP144以降、同じブロックには2つの正規のシリアライズ形式があります。ストリップ形式はウィットネスを完全に除外し、2017年より前のソフトウェアが期待する形式です。フル形式はウィットネスを含み、ウィットネスを持つ各トランザクションを、入力数が本来入る位置に0x00バイトとそれに続く0x01フラグで印を付けます。どちらも同一のブロックを符号化し、どちらも同一のブロックハッシュを生成します。ハッシュはヘッダーのその80バイトのみを対象とし、その中のマークルルートがトランザクションIDにコミットし、トランザクションIDはストリップ形式の符号化から計算されるからです。この分離が分離ウィットネス(SegWit)の文字どおりの意味です。
誰もが一度は引っかかる習慣があります。複数バイトの整数はリトルエンディアンで書かれるため、タイムスタンプ0x495FAB29はネットワーク上では29 ab 5f 49として現れ、ハッシュはシリアライズされたバイト順の逆で表示されます。エクスプローラーからコピーしたブロックハッシュは、ファイル内にあるバイト列ではありません。
どこで見られるか
シリアライズされたブロックは、ピア・ツー・ピアネットワーク上をblockメッセージの中に入って移動します。各メッセージはまず24バイトのエンベロープを伴います。4バイトの開始文字列(メインネットではf9beb4d9)、12バイトのコマンド名、4バイトのペイロード長、そしてペイロードに対する二重SHA-256の最初の4バイトから取った4バイトのチェックサムです。Bitcoin Coreは単一メッセージのペイロードを4,000,000バイトに制限していますが、これはコンセンサス上の制限ではなくネットワーク上の制限です。
同じバイト列はディスク上にも現れます。Bitcoin Coreはブロックをblk00000.dat以降と名付けられたファイルに追記し、各ファイルは128MiBに制限され、同一の開始文字列と各ブロックの前の長さプレフィックスを持つため、ファイルは線形に走査できます。ジェネシスは例外で、ダウンロードされるのではなく定数としてソフトウェアにコンパイルされており、そのために同期中のノードが他のすべてを比較する基準点となります。
日常的な利用では、シリアライズはgetblock RPCを通じ、verbosity 0で、ほとんどのエクスプローラーのrawまたはhexタブで、そしてブロックを手作業でデコードできるツールの中で現れます。エクスプローラーが真実を伝えたかを検証する人は最終的にここにたどり着きます。16進数が、誰にも再整形されていない唯一の表現だからです。
シリアライズされたブロックvsブロック
ブロックはオブジェクトであり、シリアライズされたブロックはその1つの符号化です。この区別は2017年にSegWitが各ブロックに長さの異なる2つの正規の符号化を与えるまでは外見上のものでした。そのためブロックのサイズは条件を付けて答えるべき問いになりました。Bitcoin Coreは1回のRPC応答で3通りに答えます。sizeはフル形式のシリアライズ、strippedsizeはウィットネスを含まない形式、weightはルールが実際に適用する数値です。