Skip to content

Conversation

@jtraglia
Copy link
Member

@jtraglia jtraglia commented Dec 5, 2025

There is currently no in-protocol method for proposers to provide their preferences (fee recipient and gas limit) to builders. I would like to suggest a new proposer_preferences gossip topic for this.

Proposers in the next epoch (as defined by proposer_lookahead) will broadcast their preferences to everyone (including builders). This means that there will only be SLOTS_PER_EPOCH (32) valid messages on this topic each epoch which is very minimal. There's plenty of time (a whole epoch) for the network propagate these messages too.

`is_builder_withdrawal_credential(state.validators[bid.builder_index].withdrawal_credentials)`
returns `True`.
- _[REJECT]_ `bid.execution_payment` is zero.
- _[REJECT]_ `bid.fee_recipient` matches the `fee_recipient` from the proposer's
Copy link
Contributor

@ensi321 ensi321 Dec 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just want to point out that these rules are not enforceable at all.

eg. Proposer can still accept bid that has different fee recipient from ProposerPreferences and there is no consequence to it because process_execution_payload_bid will not check if the bid matches the preference. Ultimately proposer can choose whatever bid he is happy with, whether his preference has been met or not

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the purpose of this is just to protect the proposer itself so the beacon node doesn't select a bid that violates the preference

@bharath-123
Copy link
Contributor

would it make sense to have a req/resp for proposer preferences too? I would assume a builder would want to fetch the preferences from a peer if it doesn't already have them and wants to build blocks for that proposer.

@jtraglia
Copy link
Member Author

would it make sense to have a req/resp for proposer preferences too? I would assume a builder would want to fetch the preferences from a peer if it doesn't already have them and wants to build blocks for that proposer.

I would say no, it's not worth the complexity. This would only affect builders who were offline the previous epoch. In such situations, it would be okay/reasonable for them to wait one epoch (~6 minutes) before making a bid.

@jtraglia
Copy link
Member Author

I've reverted the trusted_payments_accepted change.

We can/should debate this in a separate PR, if/when this PR is merged.

07. Set `bid.gas_limit` to be the gas limit of the constructed payload, that is
`payload.gas_limit`.
The proposer's preferred fee recipient can be obtained from their
`SignedProposerPreferences` for `compute_epoch_at_slot(bid.slot)`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since we switched to proposal_slot now, this should probably no longer use compute_epoch_at_slot, there are several other places like this, it's very unlikely but if a proposer has 2 slots in the epoch there could be 2 different preferences for the same epoch

`preferences = signed_proposer_preferences.message`:

- _[IGNORE]_ `preferences.proposal_slot` is in the next epoch -- i.e.
`compute_epoch_at_slot(preferences.proposal_slot) == get_current_epoch(state) + 1`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wouldn't it be better if we also allow to broadcast preferences for the current epoch, eg. if a node was offline for whatever reason it still gets a chance to submit the preference, in practice it really just needs to reach the builder 1-2 slots before the proposal

change this to something like

- _[IGNORE]_ `preferences.proposal_slot` is in the current or next epoch -- i.e.
  `compute_epoch_at_slot(preferences.proposal_slot)` is in
  `[get_current_epoch(state), get_current_epoch(state) + 1]`.

(there are few other functions we would have to update to support this)


#### Broadcasting `SignedProposerPreferences`

At the beginning of each epoch, a validator MAY broadcast a
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might be worth to clarify that if a validator does not broadcast a preference it means it does not accept trustless bids via p2p since we will anyways reject all bids on the execution_payload_bid topic, so there is no reason for builders to submit a bids if they haven't seen a proposer preference for the slot

or we could consider allowing fallback values but I don't think it's a good idea to for example use withdrawal credentials as fee recipient, rather a builder could receive the preference via out-of-protocol and still send the bid on p2p as fallback if http api fails for some reason (eg. cloudflare outage)

@jtraglia
Copy link
Member Author

Thanks for the review @nflaig! These suggestions are great. The only one I'm hesitant about is allowing preferences be sent in the same epoch. I think it will complicate the proposer lookahead checks; regardless I'll think about it. The proposer could just self build in this situation.

@jtraglia jtraglia merged commit 707fbee into ethereum:master Jan 5, 2026
16 checks passed
@jtraglia jtraglia deleted the proposer-preferences branch January 5, 2026 18:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants