◇ CBlockHeaderとは?

各メンバに以下の要素を積んだ構造体となっております。

int32_t nVersion;ブロックヘッダのバージョン番号です。
uint256 hashPrevBlock;前のブロックのハッシュ値です。
uint256 hashMerkleRoot;トランザクションを積むハッシュ木の先頭ハッシュ値です。
uint32_t nTime;ハッシュ値を取得した時刻(エポック秒)です。
uint32_t nBits;マイニング用問題でbnTargetを生成するための値です。
uint32_t nNonce;マイニング用問題で証明者に出す解答の値です。
int32_t LastHeight;ブロック高 – 1が入ります。
(例:ヘッダのブロック高が12345なら12344が入ります)

ブロックヘッダのハッシュ(80バイト)は、このうちnVersionからnNonceまでの範囲です。

◇ ブロック高とは?

0から始まるブロック番号という解釈になります。ここから一定間隔でブロックが生成され順番に積まれます。ところで0番のブロックはジェネシスブロックと呼ばれる特別なものです。
※ hashMerkleRootに積むジェネシスブロックのトランザクションのスクリプトに 開発者が哲学的な文字列を埋め込むのが習慣になっており、ビットコインだと例の新聞の見出しが有名ですね。
※ ブロック生成を処理する部分は + 1 で生成するため ブロック高の管理変数はsignedで – 1 から始まります。
※ ジェネシスブロックを見つけると – 1 + 1で0になりますから0番になりますね。

◇ 難易度とは?

ジェネシスブロックは難易度が低いのですぐに見つかります。
※ ブロックチェーンを開発後最初に開発者がジェネシスブロックを掘ります。それから新規ブロックがみつかると一定のルールに従いながら採掘の難易度が変動いたします。例えばブロック生成時間で決まる場合です。(決め方は多数あり)
早くみつかる場合は難易度が上がりみつかりにくいと下がります。nBitsを上手く変動させ難易度を自動調整しながらブロック生成時間を一定に保つ仕組みがそこにあります。

◇ LastHeightとは? [境界に注意]

最後のLastHeightはヘッダからブロック高を取得するのに使います。ただしこの名の示すとおり「ブロック高 – 1」となりますのでご注意ください。-1になる理由はブロック生成時またはブロック受け入れ時にこのヘッダが生成し そこで掌握できるブロックが「前のブロック」にとどまるためです。

でも「前のブロック」とわかっているのならそこで+1してしまえばいいのではないかとなります。しかしそれは「バグ」になります。なぜなら未決定のブロックのブロック高を受理してしまうことになるためです。もしそれが孤児ブロックと呼ばれる受理されずに消えるものだった場合そこでブロックの論理に矛盾が出ます。だからブロックチェーンのヘッダは双方向リストではなく前のみを指す単方向リストになっていますね。

◇ nTimeがuint32_t? オーバーフローしないの?

このフィールドにはエポック秒が保管されています。unsignedなので2038年ではなく2106年まで大丈夫です。でも2106年以降はどうなるのかな。そこは……次世代に託しましょう。