本文へ移動
← 全コースを見る
Reth トピック

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

このトピックのレッスン