覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Ethereum - ブロック構造

Ethereumのブロックはヘッダとトランザクション、トランザクション実行結果の3要素で構成されています。

各要素の例と項目の説明をメモしておきます(初学者なので、以下の内容もどこまで正確なのかは不安あり・・・)


ブロックヘッダ

ブロックヘッダの例は以下の通りとなります

{
  difficulty: 174882,
  extraData: "0xd98301080a846765746888676f312e31302e328664617277696e",
  gasLimit: 67863675,
  gasUsed: 21000,
  hash: "0x369003471d86903a6527353318fcedb82ba400a551ceafabcf3c77e36a60c348",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e",
  mixHash: "0xbe2e1f8c000f003f0124798b144a6677787ea1476f552471f1f802bf87ce0120",
  nonce: "0x55cc0b5782b8812d",
  number: 698,
  parentHash: "0xbff2a4fdbbc229934bf13d486b4f8d9a167e466cd97749bc0249f7b339da03da",
  receiptsRoot: "0x05bccc39ceb3c0844b724a7606d8e7c40746f2517875cc974554fb03b3084d6c",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 655,
  stateRoot: "0x23367a17d56b419f3ec7584a7eeeade5538e63883cbf1ebd127cd18746c896aa",
  timestamp: 1534058867,
  totalDifficulty: 108836926,
  transactions: ["0x621ef85ea52fe43b547eea00809d20fced26df7873dc62c8e358fc6ed94a5c58"],
  transactionsRoot: "0xb109addf20eda9a6e5d6670b6e52038aa85282efd62ed1498fb927bea19497e1",
  uncles: []
}

ブロックヘッダの各項目は以下の通りです

  • difficulty
    • ブロックを生成する難易度。これ以前のブロックの難易度とタイムスタンプから算出されます。
  • extraData
    • ブロックに関連する任意の情報を記録する場所。サイズは32byte以下です。
  • gasLimit
    • このブロックで使用できるGasの最大サイズ。
  • gasUsed
    • このブロックで使われたGasの使用量。
  • hash
    • ブロックを表すハッシュ値。
  • logsBloom
    • ブロック内のトランザクションから出力されるログがブルームフィルタと呼ばれる形で記録されている。
      実行したアカウントの情報とそのトランザクションの内容、それに付随する情報が格納される。
      全トランザクションを確認しなくても、このブロックに特定のログがあるかどうかを判断されるために利用される。
  • miner
    • このブロックを生成し、採掘手数料を受け取るアカウントのアドレス(160bit)。
  • mixHash
    • このブロックで十分な量の計算が実行されたことを、nonceと組み合わせて証明する256bitのハッシュ値。
  • nonce
    • mixHash と組み合わせて、このブロックで十分な量の計算が実行されたことを表す。64bitのハッシュ値。
  • number
    • 現在のブロック番号。Genesisブロックの場合は値は0。
  • parentHash
    • 親ブロック(前のブロック)のヘッダのハッシュ値。KECCAK-256ハッシュ形式。
  • receiptsRoot
    • ブロックに入っているトランザクションの実行結果を保存している、データ構造のルートノードのハッシュ値。KECCAK-256ハッシュ形式。
  • sha3Uncles (ommersHash)
    • 現在のブロックのUncleブロック配列のハッシュ。KECCAK-256ハッシュ形式。
      Uncleブロックとはブロックが生成された時に同時期に生成されたブロックで、ブロック内のトランザクションは無視されるが生成の報酬をもらうべき対象のブロック。
  • size
    • このブロックのサイズ(単位:byte)
  • stateRoot
    • このブロックの全トランザクションが実行された状態のState Tree のルートノードのハッシュ値。KECCAK-256ハッシュ形式。
  • timestamp
    • ブロックがチェーンに取り込まれた時刻。Unixタイムスタンプ形式。
  • totalDifficulty
    • このブロック以前の難易度の総和。
  • transactions
    • ブロックに取り込まれているトランザクションのハッシュが配列として格納されている。
  • transactionsRoot
    • ブロックに入っているトランザクションを含んだ木構造のルートノードのハッシュ値。KECCAK-256ハッシュ形式。
  • uncles
    • Unclebブロックのハッシュ配列。


Ethereumはブロックヘッダに大まかに重要な情報が格納されています。
Ethereumのネットワークに接続する全クライアントが全ブロック情報を必要としているわけではありません。
送金やコントラクタの呼び出しを利用するクライアントは、ブロックのヘッダ情報のみをダウンロードし、
計算の際に必要に応じてヘッダ情報からブロックのトランザクション情報を取得する仕組みになっています。


トランザクション

トランザクションの例は以下の通りとなります

{
  blockHash: "0x369003471d86903a6527353318fcedb82ba400a551ceafabcf3c77e36a60c348",
  blockNumber: 698,
  from: "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x621ef85ea52fe43b547eea00809d20fced26df7873dc62c8e358fc6ed94a5c58",
  input: "0x",
  nonce: 0,
  r: "0x50de58e50150a7325321814e09ef129b2bfca265721a077492fdbe485754e356",
  s: "0xfc01614f5150abe37fdeac2f22928dfc4200404f91370e4a4c882b7cb042ee2",
  to: "0x0e41e2a7b939ffa1b3d495ab43cda793939e41e5",
  transactionIndex: 0,
  v: "0xbd",
  value: 3000000000000000000
}

トランザクションの各項目は以下の通りです

  • blockHash
    • トランザクションがどのブロックに取り込まれているかを表す値。この値がnullの場合、トランザクションはブロックに取り込まれていない。
  • blockNumber
    • トランザクションが何番目のブロックに入っているかを表す。この値がnullの場合、トランザクションはブロックに取り込まれていない。
  • from
    • トランザクションを発行した送信者のアドレス。(20byteの値)
  • gas
    • 送信者が供給したGasの量。
  • gasPrice
    • トランザクションで払っても良いと決めたGasの金額。(単位:wei)
  • hash
    • トランザクションを表す32byteのハッシュ値。
  • input
    • トランザクションに送信されたデータ。
  • nonce
    • トランザクション以前に送信者が送信したトランザクションの数。
  • r
    • 送信者のトランザクションを特定する署名を作るために使用される。
  • s
    • 送信者のトランザクションを特定する署名を作るために使用される。
  • to
    • トランザクションを受け取った受信者のアドレス。(20byteの値)
  • transactionIndex
    • トランザクションのブロックの何番目のトランザクションとして入っているかを表す。この値がnullの場合、トランザクションはブロックに取り込まれていない。
  • v
    • 送信者のトランザクションを特定する署名を作るために使用される。
  • value
    • 送信者から受信者へ送る量。(単位:wei)


トランザクションの実行結果(レシート)

トランザクションの実行結果(レシート)を木構造で保存してるものをReceipt Tree と呼ぶ。
トランザクションレシートの内部構造の例は以下の通りです。

{
  blockHash: "0x369003471d86903a6527353318fcedb82ba400a551ceafabcf3c77e36a60c348",
  blockNumber: 698,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  from: "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e",
  gasUsed: 21000,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  root: "0x0e999db3606fdfdcde919e7b05dde9947e9b7d54a22954d810519d687401f27b",
  to: "0x0e41e2a7b939ffa1b3d495ab43cda793939e41e5",
  transactionHash: "0x621ef85ea52fe43b547eea00809d20fced26df7873dc62c8e358fc6ed94a5c58",
  transactionIndex: 0
}

トランザクションレシートの各項目は以下の通りです

  • blockHash
    • トランザクションがどのブロックに入っているかを表す。
  • blockNumber
    • トランザクションが何番目のブロックに入っているかを表す。
  • contractAddress
    • コントラクトを作成するトランザクションの場合、コントラクトのアドレスが入る。
  • cumulativeGasUsed
    • トランザクション全体で使われたGasの使用量。例えば、他の処理もフックして実行された場合は、そのGas使用量も合算される。
  • from
    • トランザクションを発行した送信者のアドレス。(20byteの値)
  • gasUsed
    • トランザクションで使われたGasの使用量。
  • logs
    • トランザクションで生成されたログ。
  • logsBloom
    • ブロック内のトランザクションから出力されるログが、ブルームフィルタと呼ばれる形で記録される。
  • root
    • トランザクションがState Tree を変化させた後のState Root の値。
  • to
    • トランザクションを受け取った受信者のアドレス。(20byteの値)
  • transactionHash
    • 32byteのトランザクションハッシュ値。
  • transactionIndex
    • トランザクションがブロックの何番目のトランザクションとして入っているかを表している。



関連エントリ・書籍

ブロックチェーンアプリケーション開発の教科書

ブロックチェーンアプリケーション開発の教科書