【これからイーサリアムを学ぶ人のための教科書#3】イーサリアムの構成要素 トランザクション・ブロック

【これからイーサリアムを学ぶ人のための教科書#3】イーサリアムの構成要素 トランザクション・ブロック

Tsuyoshi Kaji / 編集長
Tsuyoshi Kaji / 編集長
2018/11/30

連載「これからイーサリアムを学ぶ人のための教科書」ではこれからイーサリアムに関する情報を追っていくための基礎としてイーサリアムのプロトコルへの本質的な解説をしていきます。この連載を読み、技術レベルでの理解をしていただければ今後のイーサリアムに関する情報にキャッチアップしていくことができます。

前回のおさらい

前回はイーサリアムブロックチェーンの構成要素のうちアカウント・ステート、そしてガス (手数料) について解説しました。前回をまだ読んでいない方はこちらから。

今回は前回と同様に具体的にイーサリアムブロックチェーンの構成要素にフォーカスして解説していきます。

今回解説する要素は以下の通りです。

以下の

に関しては第3回で解説していきます。

今回も前回と同様、技術的に難しいと感じる部分に関しては漠然とした理解で読み進めて問題ありません。 

トランザクション

前回の記事でイーサリアムトランザクションに基づいた状態機会だと述べましたが、これはあるアカウント間に発生するトランザクションによって全体の状態 (ワールドステート) が移行していくということです。

前提として、トランザクションとはEOAによって作成される暗号的に署名された何かしらの指示 (プログラム) です。

トランザクションには以下の2種類が存在します。

  • メッセージコール (message call):送金やコントラクトのコードの実行などを呼び出すときに使われるトランザクション
  • コントラクト生成 (contract creations):新たにコントラクトを作り出すためのトランザクション

 

それぞれのトランザクションは両方とも以下の構成要素を含んでいます。

  • nonce:送信者から送信されたトランザクションの数
  • gasPrice:送信者が設定した手数料の最大値、ガス1単位あたりのgweiの量
  • gasLimit:送信者が設定したガスの数
  • to:トランザクション受信者のアドレス、コントラクト生成トランザクションの場合、コントラクトアドレスは存在していないため、この数値は空になります。
  • value:送信者から受信者に送られるETHの量、コントラクト生成トランザクションの場合、この数値が新しく作られるコントラクトアカウントが持つ初期残高になります。
  • v、r、s:トランザクションの送信者を証明する署名を生成するのに使われるもの
  • init:コントラクト生成トランザクションのみに存在し、新しいコントラクトを始めるのに必要なEVMのコードの一部です。initは一度だけ動き、戻り値としてアカウントコードのボディ部分を返したのち、破棄されます。このアカウントコードのボディ部分はコントラクトアカウントの一部として今後使われることになります。
  • data:メッセージコールだけに存在するオプションで、パラメーターなどの入力データが当てはまります。例えばスマートコントラクトがドメイン登録サービスとして機能している場合は、ドメインやIPアドレスなどが入力されます。

 

 

前回の記事のアカウントの項目でも解説しましたが、トランザクションは必ずEOA (外部所有アカウント) によって開始されます。したがって、メッセージコールとコントラクト生成の両方のトランザクションともEOAによって開始され、ブロックチェーンに送信されます。これは言い換えるとトランザクションイーサリアム内部のステートと外部を接続しているということになります。

 

 

しかし、コントラクトアカウントから別のコントラクトアカウントへトランザクションを送信できないわけではありません。ある範囲内のコントラクトアカウント同士はメッセージまたはインターナルトランザクションによって他のコントラクトアカウントへトランザクションを送信することができます。これはEOAによってではなくコントラクトアカウントによって生成されるという点で普通のトランザクションとは異なります。

あるコントラクトアカウントから他のコントラクトアカウントにインターナルトランザクションが送られたとき、受信者のコントラクトアカウントが持つプログラムが実行されます。

 

 

もう一つ内部トランザクションが通常のトランザクションと異なる点は、トランザクションの内容にガスリミットを含まないという点です。ガスリミットはEOAからトランザクションが送信される時のみ設定されます。ここで一つ注意しなければならないことがあります。それは、EOAから送信するトランザクションは、そのトランザクションの結果発生する内部トランザクションで消費されるガスまで考慮してガスを設定しなければならないということです。

ブロック

全てのトランザクションはグループとしてブロックに追加されます。そのブロックがチェーン上に連なってブロックチェーンを作り上げます。

イーサリアムではブロックは以下の要素で構成されています。

  • ブロックヘッダー
  • トランザクション情報
  • 他のブロックのヘッダー (現在のブロックのommerのため)

 

Ommerとは

ommerは、親ブロックが、現在のブロックの親の親と同一のブロックのことを指します。uncleブロックとも呼ばれますが、本記事ではイーサリアムのイエローペーパーの表記に基づき、ommerという言葉で説明します。ちなみにommerというのは叔父・叔母の性的区別の無い単語です。

この、ommerと呼ばれるブロックの情報が現在のブロックに含まれるのには理由があります。

イーサリアムは設計上、ビットコインなどのブロックチェーンに比べてブロックの生成時間は平均15秒と、短くなっています。(EOSの0.5秒と比べると長いので、あくまでビットコインなどと比べた場合) これによってトランザクションの速度は上がる一方、チェーンがフォーク (分岐) しやすくなってしまいます。

これは、ブロック生成時間が短いとマイナーが同時に別のブロックを生成する可能性が上がるからです。

同時に生成されたブロックはその後各ノードに伝播されますが、その間に時間差が発生した場合には遅く伝播された方のブロックは破棄されてしまい、メインチェーンには含まれないことになります。この破棄されてしまうブロックのことをorphanedブロック (孤児ブロック) と言います。

このように破棄されてしまってはブロックを生成し、ネットワークのセキュリティを維持することに費やされたリソースが無駄になってしまいます。そこで、イーサリアムブロックチェーンでは、orphanedブロックになってしまい、メインチェーンに含まれることができなかったommerブロックを発見し、現在のブロックに取り込んだマイナー、そしてommerブロックを生成したマイナーにも報酬を与えています。(現在のブロックの7個前のブロックまでの場合)

Ommerブロックを生成したマイナーは通常のブロック報酬の93.75%、ommerブロックのヘッダーを現在のブロックに取り込んだマイナーに通常のブロック報酬+通常のブロック報酬の3.125%を報酬として受け取ります。

ブロックヘッダー

各ブロックが持つブロックヘッダーは以下の要素によって構成されています。

  • parentHash:親ブロックのヘッダーのハッシュ (これによってチェーン上に繋がる)
  • ommersHash:現在のブロックのommerのリスト
  • beneficiary:手数料を受け取るアカウントのアドレス
  • stateRoot:ステートのハッシュを集約したツリー (ステートツリー) のルートノードハッシュ、(ワールドステートのハッシュ)
  • transactionsRoot:ブロック内のトランザクションハッシュを集約したツリー (トランザクションツリー) のルートノードハッシュ
  • receiptsRoot:ブロック内の全てのトランザクションのレシートを集約したツリー (レシートツリー) のルートノードハッシュ
  • logsBloom:ログ情報を持つブルームフィルタというデータ構造
  • difficulty:ブロックのマイニング難易度
  • number:現在のブロック番号 (ジェネシスブロックの番号は0であり、以降1ずつ増えていく)
  • gasLimit:1ブロックあたりのガスリミット
  • gasUsed:ブロック内のトランザクションでで使われたガスの総量
  • timestamp:ブロックが生成された時間
  • extraData:ブロックに関連する任意の情報
  • mixHash:nonceと組み合わせることで、ブロックのために十分な計算がされたことを証明するハッシュ
  • nonce:mixHashと組み合わせることで、ブロックのために十分な計算がされたことを証明するハッシュ

 

 

上記の要素のうち、state 、transactions、receiptsは前回の記事で解説したマークルパトリシアツリー構造によってデータを集約しています。

その他の要素についても解説して行きます。

 

Difficulty

ブロックのマイニング難易度 (ディフィカルティ) はブロックの生成・承認時間が一定となるようにするために存在しています。イーサリアムブロックチェーンの一つ目のブロックであるジェネシスブロックは131,072という難易度であり、以降のブロックの難易度はブロックごとに特殊な計算が行われ決定します。もしブロックが、直前のブロックよりも早く生成・承認された場合には難易度が引き上げられ、遅く生成・承認された場合には難易度が引き下げられ、平均してブロック生成時間が15秒になるように設計されています。

 

ここまでがトランザクションとブロックの解説になります。

トランザクションの実行と実行モデル (EVM)、そしてマイニングについてはかなり難しい内容になるため次回に分けて解説していきます。


参考

LINE@

LINE@で最新情報をチェック!!

Economies 2.0のLINE@を友達に追加して 最新情報を受け取りましょう

LINE@で最新情報を受け取る