Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
c2ce0cd
fix(types): quote Builder integers and accept it, and proposer prefer…
MegaRedHand Oct 6, 2026
86db22d
feat(beacon): stub the gloas builder market so its three halves can l…
MegaRedHand Oct 6, 2026
47b1156
feat(state-transition): implement the gloas builder market state
MegaRedHand Oct 6, 2026
2cf871d
feat(p2p): gossip and publish gloas builder bids and proposer prefere…
MegaRedHand Oct 6, 2026
b0d142d
feat(engine): keep shouldOverrideBuilder from getPayloadV6
MegaRedHand Oct 6, 2026
1a0c347
feat(rpc): serve the builder market endpoints and build on bids
MegaRedHand Oct 6, 2026
4d307bc
test(rpc): drive the builder market endpoints and bid selection end t…
MegaRedHand Oct 6, 2026
5c905db
style(rpc): satisfy clippy in the builder market code and tests
MegaRedHand Oct 6, 2026
7b6fa4c
feat(state-transition): validate gloas bids and preferences, assemble…
MegaRedHand Oct 6, 2026
7263f40
Merge feat/beacon-gloas-builder-market-a into feat/beacon-gloas-build…
MegaRedHand Oct 6, 2026
4bd8cba
Merge feat/beacon-gloas-builder-market-p2p into feat/beacon-gloas-bui…
MegaRedHand Oct 6, 2026
b037bed
Merge feat/beacon-gloas-builder-market-rpc into feat/beacon-gloas-bui…
MegaRedHand Oct 6, 2026
17dea23
docs(claude): describe the gloas builder market and its two extra topics
MegaRedHand Oct 6, 2026
3cf6f11
test(p2p): make the second bid in the settle test outbid the first
MegaRedHand Oct 6, 2026
6d77c4d
test(state-transition): start the builder scene at a reachable finali…
MegaRedHand Oct 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,11 @@ actual_slot = finalized_slot + 1 + relative_index
- Beacon wire: `validate_messages()` is on, so every beacon message waits for a verdict (~4.2s before gossipsub's cache evicts it). Rules in `state_transition::beacon::gossip` (cheap half inline, stateful half on a bounded `spawn_blocking` task); plumbing in `p2p/src/beacon/verdict.rs`. Lean gossip still auto-forwards
- Data columns: every check runs in p2p. A column gossip did not accept (`Queue`/`Overloaded`), every fetched column, and parked columns replayed after their parent imports go through `column::chain_checks` in `p2p/src/beacon/column_checks.rs`. The chain actor stores what it gets unchecked; only debug builds re-run `chain_checks` there
- Beacon subscribes seven global topics plus two node-id-derived subnet families: custody
columns and backbone attestation subnets. Gloas digests add two more topics,
`execution_payload` and `payload_attestation_message` (`BeaconTopics::for_fork`; earlier
digests never carry them). Gloas has its own rules for `beacon_block`,
columns and backbone attestation subnets. Gloas digests add four more topics,
`execution_payload`, `payload_attestation_message`, `execution_payload_bid` and
`proposer_preferences` (`BeaconTopics::for_fork`; earlier digests never carry them).
Bids and preferences are validated in p2p against one shared `BuilderMarket`
(`state_transition::beacon::builder_market`) and never reach the chain actor. Gloas has its own rules for `beacon_block`,
`data_column_sidecar` (fork enum `DataColumnSidecar`, fork from the topic's digest),
aggregates (`SignedAggregateAndProof::Gloas`, aggregation-bits length bounded before
expansion) and attestations (`verify_attestation_payload_status`). Deliberate
Expand Down Expand Up @@ -767,8 +769,13 @@ transitions are in `ethlambda-types`, per the section above. Nothing above
the parking of gloas column sidecars (they carry no signature). Fork-choice
events are timed at arrival, not at the slot tick, and the head's payload
status is kept with its root (`Store::head_payload_status`, recomputed after
a restart). The node also serves gloas validator duties, self-build only (no
bids, no proposer preferences; see `docs/spec_deviations.md`).
a restart). The node also serves gloas validator duties and the builder market:
it validates, pools and relays gossip bids and proposer preferences, serves
`POST /eth/v1/beacon/execution_payload_bids` and `/proposer_preferences` plus the
builder endpoints, and `produceBlockV4` weighs the best pooled p2p bid against
the local build per `BuilderConfig` (`min_bid`, `builder_boost_factor`; the local
build wins a tie). A winning bid returns the block only. The builder API (relay
or `builder_pubkeys` bids) is phase 2; see `docs/spec_deviations.md`.
`state_transition/src/beacon/gloas_block_production.rs` assembles the block and
its envelope (`gloas_payload_inputs`, `parse_gloas_execution_requests`,
`pack_gloas_attestations`, `pack_payload_attestations`, `assemble_gloas_block`,
Expand Down
6 changes: 6 additions & 0 deletions bin/ethlambda/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -721,13 +721,18 @@ async fn run_node(options: Options) -> eyre::Result<()> {
// by block production and `GET .../pool/payload_attestations`.
let payload_attestation_pool =
ethlambda_state_transition::beacon::payload_attestation_pool::SharedPayloadAttestationPool::default();
// Bids, proposer preferences and known payloads: filled by gossip and the
// Beacon API's bid and preferences endpoints, read by block production.
let builder_market =
ethlambda_state_transition::beacon::builder_market::SharedBuilderMarket::default();
let p2p = P2P::spawn(
built,
setup.store.clone(),
setup.node_names,
discovery,
attestation_pool.clone(),
payload_attestation_pool.clone(),
builder_market.clone(),
)
.await
.wrap_err("failed to start discv5 discovery")?;
Expand Down Expand Up @@ -769,6 +774,7 @@ async fn run_node(options: Options) -> eyre::Result<()> {
p2p: rpc_p2p,
attestation_pool: attestation_pool.clone(),
payload_attestation_pool: payload_attestation_pool.clone(),
builder_market: builder_market.clone(),
custody_columns: rpc_custody_columns,
engine: rpc_engine,
},
Expand Down
Loading
Loading