Potential Risk: Missing Relay Blacklisting in mev‑boost Can Waste Slots

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

  • getHeader stores the single highest-value bid and the set of relays that supplied it.

  • getPayload fans 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

  1. Add penalties or blacklisting (e.g., disable/deprioritize relays after N timeouts or withheld payloads).

  2. Persist failure counters on top of existing health checks/metrics so operators can be warned automatically.

  3. Consider keeping a secondary bid (second-highest) from getHeader to 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?