実際、ブロックには何が含まれているのか?
ブロックチェーンのブロックの中身、全部説明できますか?って恋人に聞かれちゃったそこのあなたのために、Ethereumのブロックの内訳を細かく列挙する。
パート1:上位レイヤー
ブロックにはいろんなものが入ってるし、入れ子状になっているので、一気には書けない。とりあえずブロックの最上ランクのレイヤーはこんな感じになっている。最も基本的な「ブロックの中身」と思ってくれて良い。
slot、スロット このブロックが入っているスロットの番号。=ブロックの高さ。
proposer_index、プロポーザーインデックス このブロックを作ったバリデーターの識別番号。全てのバリデーターはナンバリングされているっぽい?
parent_root、親ルートハッシュ このブロックの一つ前のブロックのハッシュ値
state_root、ステートルートハッシュ このブロックのステートオブジェクトのルートハッシュ
body、ボディ いくつかのフィールドを含むオブジェクト
ここからどんどん複雑になってゆく。最後の bodyが、これまたいくつかのものに分けられる。
randao_reveal 次のプロポーザーを決めるための数値
eth1_data Depositコントラクトに関する情報
graffiti ブロックにタグを付けるための任意のデータ
proposer_slashings Slashされるバリデーターのリスト
attester_slashings Slashされるアテスターのリスト
attestations そのブロックを支持するアテステーションのリスト
deposits デポジットコントラクトへの新しいデポジットのリスト
voluntary_exits ネットワークから退出するバリデータのリスト
sync_aggregate ライトクライアントへのサービスに使用されるバリデータのサブセット
execution_payload 実行クライアントから渡されるトランザクション
attestationsの部分には、ブロック内のすべてのアテステーションのリストが含まれる。 その認証には独自のデータ型があり、各証明には以下のものが含まれている。
aggregation_bits アテステーションに参加しているバリデーターのリスト
data (後述)
signature 全ての参加者の署名
でこのdataには、以下のようなものが含まれている。
slot 認証が関連するスロット
index バリデーターのインデックス
beacon_block_root のオブジェクトを含むビーコンチェーンのブロックのルートハッシュ
source 最後のチェックポイント
target 最後のエポック境界ブロック
ブロックを他のノードから受け取った時、クライアントはそのブロック内のexecution_payload内のトランザクションを全て自前で計算し、計算結果であるブロックハッシュが受け取ったものと一致するか確認する。
execution_payload_headerというフィールドがあり(どのレイヤーにあるのかは不明、最上位っぽい?)、その中身は以下のようになっている。
parent_hash 親ブロックのハッシュ
fee_recipient 取引手数料の支払い先口座
state_root このブロックの変更を適用した後のグローバル状態のルートハッシュ
receipts_root トランザクションレシートのハッシュ
logs_bloom イベントログを含むデータ構造
prev_randao ランダムバリデータで使用される値
block_number 現在のブロックの番号
gas_limit このブロックで許容される最大ガス量
gas_used このブロックで実際に使われたガスの量
timestamp ブロックが生成された時間
extra_data 任意の追加データ
base_fee_per_gas BASE _FEEの値
block_hash 実行ブロックのハッシュ
transactions_root ペイロード内のトランザクションのルートハッシュ
withdrawal_root ペイロード内の引き出し(Unstake)のルートハッシュ
execution_payload自身は、トランザクションのルートハッシュの代わりに実際のトランザクションのリストと引き出し情報が含まれる以外はヘッダーと同じ
ブロックタイム
ブロックタイムとは、1ブロックが生成される時間のこと。イーサリアム上における時間は「スロット」と呼ばれる12秒単位に分割されており、1スロットで1バリデータが選ばれ、そのバリデータがブロックを提案する。すべてのバリデータがオンラインかつ完全に機能していると仮定すると、すべてのスロットにブロックが存在することになる。
しかし、バリデータがブロックを提案するために呼び出されたときに、オフラインになっていることはありうるらしい。
その場合はブロックの生成がスキップされる?
ブロックサイズ
イーサリアムのブロック自体のサイズには制限がある。ブロックのサイズはガスの量で測られており、各ブロックの目標サイズは1,500万gasだが、ブロックのサイズはネットワークの需要に応じて増減し、最大でブロックの上限である3,000万ガス(目標ブロックサイズの2倍)になる。ブロック内の全トランザクションが消費するガスの総量は、ブロックガス上限より小さくなければならない。このルールはブロックが大きくなりすぎないために実装されている。もしブロックが大きくなる可能性があれば、性能の低いフルノードは、スペースとスピードの要求度がより厳しくなり、次第にネットワークについていけなくなる。ブロックが大きければ大きいほど、次のスロットに間に合うように処理するために必要な計算能力は大きくなる。これは中央集権的な力であり、ブロックサイズに上限を設けることで抵抗している。