ブロックヘッダの構築

仕事が忙しくなりだして、いつのまにか3月に。。

ブロックヘッダのフォーマットは、前にも書いたように下のようになっているけど、ブロックヘッダについてもう一度まとめてみる。

 ブロックヘッダ(Block Header)フォーマット

サイズ フィールド名 説明
4バイト Version ソフトウェア・プロトコルバージョン情報
32バイト Previous Block Hash 親ブロックのハッシュ値
32バイト Merkle Root ブロックの全トランザクションに対するマークルツリーのルートハッシュ
4バイト TimeStamp ブロックの生成時刻
4バイト Difficulty Target ブロック生成時のproof of workのdifficulty
4バイト Nonce proof of workで用いるカウンタ
$ bitcoin-cli getblock 0000000000000c2e8d3c2a3f74e3006011cc1f4f43b122b587564ad99f3906f6
{
  "hash": "0000000000000c2e8d3c2a3f74e3006011cc1f4f43b122b587564ad99f3906f6",
  "confirmations": 80105,
  "strippedsize": 57982,
  "size": 58018,
  "weight": 231964,
  "height": 1377316,
  "version": 536870912,
  "merkleroot": "ab16d417f9dd28c7ad727bc42c363fa37c543fa9a428090fb4c97f0445f886b8",
  "tx": [
    "c84ec94f40f618a6fc168d0d17e869a6b81d342304212999ca81c1ebf0a17de9",

    "3aca442b1fdf9210ae2d66a530759c407d465203005d5ea7250b3dd2169511d4"
  ],
  "time": 1533339910,
  "mediantime": 1533339846,
  "nonce": 1902934454,
  "bits": "1a0f78e0",
  "difficulty": 1084331.558052198,
  "chainwork": "000000000000000000000000000000000000000000000085c1e541b4628b5cdf",
  "nTx": 205,
  "previousblockhash": "0000000000000cf58ba5dc4f8f2eba6beeb6d7fa79f8272325a4f5aae3ae58c5",
  "nextblockhash": "0000000000000d7969601e46be6a1407de6cccf72af4d4dd7b48e364801b8d0d"

上のbitcoin-cliでとってきたブロックを例にすると

  • Version

"versionHex": "20000000",

リトルインディアンなので、version2ということかな。

  • previousblockhash 前のブロックのハッシュは、

"previousblockhash": "0000000000000cf58ba5dc4f8f2eba6beeb6d7fa79f8272325a4f5aae3ae58c5",

  • マークルルート "merkleroot": "ab16d417f9dd28c7ad727bc42c363fa37c543fa9a428090fb4c97f0445f886b8",

トランザクションのマークルツリーを作ってそのハッシュを算出すると。

  • タイムスタンプ "time": 1533339910,

UNIX秒なと日2016本時間で 2018/08/04 08:45:10

  • nonce

"nonce": 1902934454,

  • difficulty "difficulty": 1084331.558052198,

difficultyは、約10分でマイニングされるようになってるのは、何回も書いてきたと思うけど、 この値をどのように調整するか分かってなかったので、調べてみた。

2016ブロックごとに更新が行われて、下の式で産出されるとのこと 新しいDifficulty = 旧Dfficulty * 2016ブロック目にかかった時間 / 20160(分) とのこと。