読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

コインベースのフォーマット仕様

Bitcoin

Bitcoinではブロックをマイニングするとその報酬が得られるが、この報酬を受け取るトランザクションをコインベーストランザクションと呼ぶ。
通常のBitcoinの取引では入力となるトランザクションは別のトランザクションの出力を参照する形式になるが、コインベーストランザクションには参照するトランザクション出力は存在しない。

コインベーストランザクションはブロックのトランザクションの先頭にセットされていて、入力は1つのみで以下のような形式になる。

"vin": [
   {
    "coinbase": "03fc7903062f503253482f04ac204f510858029a11000003550d3363646164312f736c7573682f",
    "sequence": 0
  }
]

コインベーストランザクションの入力のフォーマット仕様

コインベーストランザクションの入力のフォーマットは↓に定義されている。

https://bitcoin.org/en/developer-reference#term-coinbase-block-height

バイト数      名称 データタイプ 定義
32 hash (null) char[32] コインベースで前の出力が無いので32バイトのnull値
4 index
(UINT32_MAX)
uint32_t コインベースで前の出力が無いので0xffffffff
可変 script bytes compactSize uint coinbase scriptのバイト数(最大100バイト)
可変 height script BIP-34で必須になったコインベーストランザクションが含まれているブロックのheight。スクリプト言語を使用して、ブロックheightをスタックにプッシュするデータプッシュ命令コードで始まりその後にheightが続く。この際、heightの値をリトルエンディアンで記録される。このスクリプトはできるだけ短くする必要がある。
データプッシュの命令コードは0x03で、ブロック16,777,216(300年後)までの合計サイズは4バイトとなる。
※ 227,836までのブロックのバージョンは1で、heightパラメータは必要ないため含まれていない。
可変 coinbase script None ↑の例の"coinbase"の部分のスクリプトで、任意の100バイトまでのデータ(heightの4バイトを含むので実際にセットできるスクリプトサイズは96バイトまで)マイナーは一般的に、ハッシュの計算中にブロックヘッダのマークルルートを更新するために、このフィールドにnonceを配置する。
4 sequence uint32_t シーケンス番号

coinbase scriptには任意のデータをセットできるが、OP_CHECKSIGのような署名の検証を行う値が含まれている場合、これらは署名操作(sigops)としてカウントされブロックの署名操作のリミットに影響を与える*1。このカウントを回避するには、全てのデータのプレフィックスにプッシュ操作を付加すればいい。

coinbase scriptのパース

この仕様をベースに考えると

"coinbase": "03fc7903062f503253482f04ac204f510858029a11000003550d3363646164312f736c7573682f"

のcoinbase scriptの値は、先頭4バイト03fc7903がheightの値となり、残りの
062f503253482f04ac204f510858029a11000003550d3363646164312f736c7573682f
がcoinbase scriptの任意のデータとなる。

heightの03fc7903の内、先頭の03がデータプッシュの命令コードで、残りのfc7903がブロック高となる。このブロック高はリトルエンディアンで記録されているを考慮して10進数に戻すと227836というブロック高であることが分かる。

*1:現在、1ブロックあたりの署名操作の最大件数は20,000件までという制限がある