Potential Risk: Missing Relay Blacklisting in mev-boost Can Waste Slots
TL;DR
mev-boost currently keeps only the top bid from getHeader and requests the payload from its relays with a fixed timeout. If those relays never deliver, validators wait ~4s and then fall back to the local execution client. There is no automatic penalty/blacklist for relays that repeatedly withhold payloads.
Context
-
getHeaderstores the single highest-value bid and the set of relays that supplied it. -
getPayloadfans out to those relays with--request-timeout-getpayload=4000ms. -
If no relay returns a payload, mev-boost returns HTTP 502 and the validator falls back to the local execution client.
Code references:
-
fan-out logic:
server/get_payload.go:152-334 -
502 response:
server/service.go:419-429
Risk
-
No blacklisting: relays that repeatedly advertise high bids but never deliver are not deprioritized or disabled.
-
Slot time waste: validators wait ~4 seconds for the timeout and then revert, making the builder flow for that slot effectively useless and reducing rewards.
-
DoS/griefing vector: an attacker can run a relay that always posts top bids but never delivers payloads, wasting time across many validators, especially when relay lists overlap.
Possible Directions
-
Add penalties or blacklisting (e.g., disable/deprioritize relays after N timeouts or withheld payloads).
-
Persist failure counters on top of existing health checks/metrics so operators can be warned automatically.
-
Consider keeping a secondary bid (second-highest) from
getHeaderto fall back to if all winning relays fail.
Questions for Discussion
-
Is there appetite for relay-level penalty/blacklist logic inside mev-boost itself, or should this stay in external tooling?
-
Would retaining a fallback bid introduce new security or incentive concerns?
-
Are there existing proposals or implementations that address this in a standardized way?