Skip to content

Commit b787777

Browse files
committed
fix: use all relays for some calls (#227)
1 parent e3694a1 commit b787777

File tree

7 files changed

+87
-16
lines changed

7 files changed

+87
-16
lines changed

crates/common/src/config/pbs.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,12 @@ pub struct PbsModuleConfig {
171171
pub endpoint: SocketAddr,
172172
/// Pbs default config
173173
pub pbs_config: Arc<PbsConfig>,
174-
/// List of relays
174+
/// List of default relays
175175
pub relays: Vec<RelayClient>,
176+
/// List of all default relays plus additional relays from muxes (based on
177+
/// URL) DO NOT use this for get_header calls, use `relays` or `muxes`
178+
/// instead
179+
pub all_relays: Vec<RelayClient>,
176180
/// Signer client to call Signer API
177181
pub signer_client: Option<SignerClient>,
178182
/// Event publisher
@@ -208,12 +212,32 @@ pub async fn load_pbs_config() -> Result<PbsModuleConfig> {
208212
let relay_clients =
209213
config.relays.into_iter().map(RelayClient::new).collect::<Result<Vec<_>>>()?;
210214
let maybe_publiher = BuilderEventPublisher::new_from_env()?;
215+
let mut all_relays = HashMap::with_capacity(relay_clients.len());
216+
217+
if let Some(muxes) = &muxes {
218+
for (_, mux) in muxes.iter() {
219+
for relay in mux.relays.iter() {
220+
all_relays.insert(&relay.config.entry.url, relay.clone());
221+
}
222+
}
223+
}
224+
225+
// insert default relays after to make sure we keep these as defaults,
226+
// this means we override timing games which is ok since this won't be used for
227+
// get_header we also override headers if the same relays has two
228+
// definitions (in muxes and default)
229+
for relay in relay_clients.iter() {
230+
all_relays.insert(&relay.config.entry.url, relay.clone());
231+
}
232+
233+
let all_relays = all_relays.into_values().collect();
211234

212235
Ok(PbsModuleConfig {
213236
chain: config.chain,
214237
endpoint,
215238
pbs_config: Arc::new(config.pbs.pbs_config),
216239
relays: relay_clients,
240+
all_relays,
217241
signer_client: None,
218242
event_publisher: maybe_publiher,
219243
muxes,
@@ -264,6 +288,25 @@ pub async fn load_pbs_custom_config<T: DeserializeOwned>() -> Result<(PbsModuleC
264288
let relay_clients =
265289
cb_config.relays.into_iter().map(RelayClient::new).collect::<Result<Vec<_>>>()?;
266290
let maybe_publiher = BuilderEventPublisher::new_from_env()?;
291+
let mut all_relays = HashMap::with_capacity(relay_clients.len());
292+
293+
if let Some(muxes) = &muxes {
294+
for (_, mux) in muxes.iter() {
295+
for relay in mux.relays.iter() {
296+
all_relays.insert(&relay.config.entry.url, relay.clone());
297+
}
298+
}
299+
}
300+
301+
// insert default relays after to make sure we keep these as defaults,
302+
// this also means we override timing games which is ok since this won't be used
303+
// for get header we also override headers if the same relays has two
304+
// definitions (in muxes and default)
305+
for relay in relay_clients.iter() {
306+
all_relays.insert(&relay.config.entry.url, relay.clone());
307+
}
308+
309+
let all_relays = all_relays.into_values().collect();
267310

268311
let signer_client = if cb_config.pbs.static_config.with_signer {
269312
// if custom pbs requires a signer client, load jwt
@@ -280,6 +323,7 @@ pub async fn load_pbs_custom_config<T: DeserializeOwned>() -> Result<(PbsModuleC
280323
endpoint,
281324
pbs_config: Arc::new(cb_config.pbs.static_config.pbs_config),
282325
relays: relay_clients,
326+
all_relays,
283327
signer_client,
284328
event_publisher: maybe_publiher,
285329
muxes,

crates/common/src/pbs/relay.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ impl<'de> Deserialize<'de> for RelayEntry {
5050
}
5151
}
5252

53-
/// A client to interact with a relay, safe to share across threads
53+
/// A client to interact with a relay, safe to share across threads and cheaply
54+
/// cloneable
5455
#[derive(Debug, Clone)]
5556
pub struct RelayClient {
5657
/// ID of the relay

crates/pbs/src/mev_boost/register_validator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub async fn register_validator<S: BuilderApiState>(
3232
.insert(HEADER_START_TIME_UNIX_MS, HeaderValue::from_str(&utcnow_ms().to_string())?);
3333
send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?);
3434

35-
let relays = state.relays().to_vec();
35+
let relays = state.all_relays().to_vec();
3636
let mut handles = Vec::with_capacity(relays.len());
3737
for relay in relays {
3838
handles.push(tokio::spawn(

crates/pbs/src/mev_boost/status.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub async fn get_status<S: BuilderApiState>(
3131
let mut send_headers = HeaderMap::new();
3232
send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?);
3333

34-
let relays = state.relays();
34+
let relays = state.all_relays();
3535
let mut handles = Vec::with_capacity(relays.len());
3636
for relay in relays {
3737
handles.push(Box::pin(send_relay_check(relay, send_headers.clone())));

crates/pbs/src/mev_boost/submit_block.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub async fn submit_block<S: BuilderApiState>(
3232
send_headers.insert(HEADER_START_TIME_UNIX_MS, HeaderValue::from(utcnow_ms()));
3333
send_headers.insert(USER_AGENT, get_user_agent_with_version(&req_headers)?);
3434

35-
let relays = state.relays();
35+
let relays = state.all_relays();
3636
let mut handles = Vec::with_capacity(relays.len());
3737
for relay in relays.iter() {
3838
handles.push(Box::pin(submit_block_with_timeout(

crates/pbs/src/state.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,13 @@ where
4343
&self.config.pbs_config
4444
}
4545

46-
pub fn relays(&self) -> &[RelayClient] {
47-
&self.config.relays
46+
/// Returns all the relays (including those in muxes)
47+
/// DO NOT use this through the PBS module, use
48+
/// [`PbsState::mux_config_and_relays`] instead
49+
pub fn all_relays(&self) -> &[RelayClient] {
50+
&self.config.all_relays
4851
}
52+
4953
/// Returns the PBS config and relay clients for the given validator pubkey.
5054
/// If the pubkey is not found in any mux, the default configs are
5155
/// returned
@@ -55,7 +59,8 @@ where
5559
) -> (&PbsConfig, &[RelayClient], Option<&str>) {
5660
match self.config.muxes.as_ref().and_then(|muxes| muxes.get(pubkey)) {
5761
Some(mux) => (&mux.config, mux.relays.as_slice(), Some(&mux.id)),
58-
None => (self.pbs_config(), self.relays(), None),
62+
// return only the default relays if there's no match
63+
None => (self.pbs_config(), &self.config.relays, None),
5964
}
6065
}
6166

tests/tests/pbs_integration.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ fn to_pbs_config(chain: Chain, pbs_config: PbsConfig, relays: Vec<RelayClient>)
4848
pbs_config: Arc::new(pbs_config),
4949
signer_client: None,
5050
event_publisher: None,
51+
all_relays: relays.clone(),
5152
relays,
5253
muxes: None,
5354
}
@@ -204,24 +205,28 @@ async fn test_submit_block_too_large() -> Result<()> {
204205
async fn test_mux() -> Result<()> {
205206
setup_test_env();
206207
let signer = random_secret();
207-
let pubkey_1: BlsPublicKey = blst_pubkey_to_alloy(&signer.sk_to_pk()).into();
208-
let signer_2 = random_secret();
209-
let pubkey_2: BlsPublicKey = blst_pubkey_to_alloy(&signer_2.sk_to_pk()).into();
208+
let pubkey: BlsPublicKey = blst_pubkey_to_alloy(&signer.sk_to_pk()).into();
210209

211210
let chain = Chain::Holesky;
212211
let port = 3600;
213212

214-
let mux_relay = generate_mock_relay(port + 1, *pubkey_1)?;
215-
let relays = vec![mux_relay.clone(), generate_mock_relay(port + 2, *pubkey_2)?];
213+
let mux_relay_1 = generate_mock_relay(port + 1, *pubkey)?;
214+
let mux_relay_2 = generate_mock_relay(port + 2, *pubkey)?;
215+
let default_relay = generate_mock_relay(port + 3, *pubkey)?;
216+
216217
let mock_state = Arc::new(MockRelayState::new(chain, signer));
217218
tokio::spawn(start_mock_relay_service(mock_state.clone(), port + 1));
218219
tokio::spawn(start_mock_relay_service(mock_state.clone(), port + 2));
220+
tokio::spawn(start_mock_relay_service(mock_state.clone(), port + 3));
219221

222+
let relays = vec![default_relay.clone()];
220223
let mut config = to_pbs_config(chain, get_pbs_static_config(port), relays);
224+
config.all_relays = vec![mux_relay_1.clone(), mux_relay_2.clone(), default_relay.clone()];
225+
221226
let mux = RuntimeMuxConfig {
222227
id: String::from("test"),
223228
config: config.pbs_config.clone(),
224-
relays: vec![mux_relay],
229+
relays: vec![mux_relay_1, mux_relay_2],
225230
};
226231

227232
let validator_pubkey = blst_pubkey_to_alloy(&random_secret().sk_to_pk());
@@ -239,12 +244,28 @@ async fn test_mux() -> Result<()> {
239244
let res = mock_validator.do_get_header(None).await;
240245

241246
assert!(res.is_ok());
242-
assert_eq!(mock_state.received_get_header(), 2); // both relays were used
247+
assert_eq!(mock_state.received_get_header(), 1); // only default relay was used
243248

244249
info!("Sending get header with mux");
245250
let res = mock_validator.do_get_header(Some(validator_pubkey)).await;
246251

247252
assert!(res.is_ok());
248-
assert_eq!(mock_state.received_get_header(), 3); // only one relay was used
253+
assert_eq!(mock_state.received_get_header(), 3); // two mux relays were used
254+
255+
let res = mock_validator.do_get_status().await;
256+
257+
assert!(res.is_ok());
258+
assert_eq!(mock_state.received_get_status(), 3); // default + 2 mux relays were used
259+
260+
let res = mock_validator.do_register_validator().await;
261+
262+
assert!(res.is_ok());
263+
assert_eq!(mock_state.received_register_validator(), 3); // default + 2 mux relays were used
264+
265+
let res = mock_validator.do_submit_block().await;
266+
267+
assert!(res.is_err());
268+
assert_eq!(mock_state.received_submit_block(), 3); // default + 2 mux relays were used
269+
249270
Ok(())
250271
}

0 commit comments

Comments
 (0)