Reth の payload builder
コンセンサス層がブロックを求めると(payload attributes 付きの engine_forkchoiceUpdated)、Reth は payload job を始めます。基本の job は、payload が解決されるか、期限を過ぎるか、試行が Freeze を返すまで builder を繰り返し呼び、一番よい結果を残します。つまりブロック生成は 1 回の呼び出しではなく、試行のループです。
独自チェーンがブロックの中身(並び順・システムトランザクション・別の手数料ルール)を変えるときは、reth_basic_payload_builder の PayloadBuilder トレイトを実装して、ノードのコンポーネントに差し込みます。
API の早見表
fn try_build(&self, args: BuildArguments<Attrs, Payload>) -> Result<BuildOutcome<Payload>, PayloadBuilderError>- よりよい payload を作る 1 回の試行です。job から繰り返し呼ばれます。
BuildOutcome::{Better, Aborted, Cancelled, Freeze}- Better は新しい最良の payload、Aborted は今の最良より手数料が少なかった試行、Cancelled は job の取り消し、Freeze は payload が確定し以後は作らないことを表します。
fn build_empty_payload(&self, config: PayloadConfig<…>) -> Result<Payload, PayloadBuilderError>- トランザクションのないブロックです。payload の解決時に組み上がったものがないときに使われ、既定では進行中の試行と競わせます。
fn on_missing_payload(&self, args) -> MissingPayloadBehaviour<Payload>- payload の解決時に用意ができていない場合の振る舞いです。既定では空の payload と競わせます(RaceEmptyPayload)。
BuildArguments { cached_reads, config, cancel, best_payload, … }- 各試行が受け取るものです。前の試行でキャッシュした状態の読み込み、payload の設定(親ヘッダと attributes)、取り消しトークン、それまでの最良の payload が入ります。
BasicPayloadJobGenerator / PayloadBuilderService- generator は payload の要求ごとに、builder を包んだ job を始めます。service はエンジンからの要求を受け取り、generator に渡します。
paradigmxyz/reth の eb4c15e(2026-04-07)で確認: crates/payload/basic/src/lib.rs, crates/payload/builder/src/service.rs
このトピックのレッスン
Ethereum mainnet では block を validator が consensus client 動かして execution client から pull。L2 や中央集権 sequencer cha…
今日 OP Stack chain を立ち上げると、ブロック生成バイナリはほぼ確実に flashbots/op-rbuilder — OP 派生 rollup 向けに Paradigm が書いた Rust block …
Stripe や Meta が運用するペイメントレールを作るとする。chainspec / executor / precompile / indexer のどこが、トレーダ向け L1 と具体的に違うか?