CBlockHeaderとは?

メンバに、以下の要素を積んだ構造体です。

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

ブロックヘッダのハッシュ(80バイト)は、このうちnVersionからnNonceまでの範囲です。
アライメントを揃えパディングが入らないようにしてから、#pragma pack(0)で敷き詰める必要があります。
また、よくbitcointalkで「ハッシュ!!!!!!」と叫ばれているのは、ここのハッシュ値です。(^^;

ブロック高とは?

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

難易度とは?

ジェネシスブロックは難易度が低いので、すぐに見つかります。
新規ブロックがみつかると、一定のルールに従って難易度が上下いたします。
例えば、ブロック生成時間で決まる場合です。(決め方は多数あります)
早くみつかる場合は難易度が上がり、みつかりにくいと下がります。
nBitsを上手く変動させて難易度を自動調整し、ブロック生成時間を一定に保つ仕組みがあります。

LastHeightとは?

最後のLastHeightは、ヘッダからブロック高を取得するのに使います。
ただし、この名の示すとおり、ここに入るのは「ブロック高 - 1」となりますので、ご注意ください。
-1になるのは、ブロック生成時またはブロック受け入れ時にこのヘッダが生成する際、
そこで掌握できるブロックが「前のブロック」にとどまるためです。
でも「前のブロック」とわかっているのなら、そこで+1してしまえばいいではないか、となります。
しかし、それは「バグ」になります。
なぜなら、未決定のブロックのブロック高を受理してしまうことになるためです。
例えばそれが「孤児ブロック」と呼ばれる、受理されずに消えるものだった場合、そこで矛盾が出ます。
だから、ブロックチェーンのヘッダは双方向リストではなく、前のみを指す単方向リストになっております。

nTimeがuint32_t?

エポック秒が保管されています。unsignedなので2038年ではなく2106年まで大丈夫です。

□ 本ページをご覧いただきました方は、以下のページもよくご覧いただいております。
■ 集計中.....