Skip to content

Commit ba96a25

Browse files
committed
fix default relays
1 parent 76e0134 commit ba96a25

7 files changed

Lines changed: 75 additions & 19 deletions

File tree

crates/common/src/config/pbs.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,11 @@ 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 URL)
177+
/// DO NOT use this for get_header calls, use `relays` or `muxes` instead
178+
pub all_relays: Vec<RelayClient>,
176179
/// Signer client to call Signer API
177180
pub signer_client: Option<SignerClient>,
178181
/// Event publisher
@@ -208,12 +211,31 @@ pub async fn load_pbs_config() -> Result<PbsModuleConfig> {
208211
let relay_clients =
209212
config.relays.into_iter().map(RelayClient::new).collect::<Result<Vec<_>>>()?;
210213
let maybe_publiher = BuilderEventPublisher::new_from_env()?;
214+
let mut all_relays = HashMap::with_capacity(relay_clients.len());
215+
216+
if let Some(muxes) = &muxes {
217+
for (_, mux) in muxes.iter() {
218+
for relay in mux.relays.iter() {
219+
all_relays.insert(&relay.config.entry.url, relay.clone());
220+
}
221+
}
222+
}
223+
224+
// insert default relays after to make sure we keep these as defaults,
225+
// this means we override timing games which is ok since this won't be used for get_header
226+
// we also override headers if the same relays has two definitions (in muxes and default)
227+
for relay in relay_clients.iter() {
228+
all_relays.insert(&relay.config.entry.url, relay.clone());
229+
}
230+
231+
let all_relays = all_relays.into_values().collect();
211232

212233
Ok(PbsModuleConfig {
213234
chain: config.chain,
214235
endpoint,
215236
pbs_config: Arc::new(config.pbs.pbs_config),
216237
relays: relay_clients,
238+
all_relays,
217239
signer_client: None,
218240
event_publisher: maybe_publiher,
219241
muxes,
@@ -264,6 +286,24 @@ pub async fn load_pbs_custom_config<T: DeserializeOwned>() -> Result<(PbsModuleC
264286
let relay_clients =
265287
cb_config.relays.into_iter().map(RelayClient::new).collect::<Result<Vec<_>>>()?;
266288
let maybe_publiher = BuilderEventPublisher::new_from_env()?;
289+
let mut all_relays = HashMap::with_capacity(relay_clients.len());
290+
291+
if let Some(muxes) = &muxes {
292+
for (_, mux) in muxes.iter() {
293+
for relay in mux.relays.iter() {
294+
all_relays.insert(&relay.config.entry.url, relay.clone());
295+
}
296+
}
297+
}
298+
299+
// insert default relays after to make sure we keep these as defaults,
300+
// this also means we override timing games which is ok since this won't be used for get header
301+
// we also override headers if the same relays has two definitions (in muxes and default)
302+
for relay in relay_clients.iter() {
303+
all_relays.insert(&relay.config.entry.url, relay.clone());
304+
}
305+
306+
let all_relays = all_relays.into_values().collect();
267307

268308
let signer_client = if cb_config.pbs.static_config.with_signer {
269309
// if custom pbs requires a signer client, load jwt
@@ -280,6 +320,7 @@ pub async fn load_pbs_custom_config<T: DeserializeOwned>() -> Result<(PbsModuleC
280320
endpoint,
281321
pbs_config: Arc::new(cb_config.pbs.static_config.pbs_config),
282322
relays: relay_clients,
323+
all_relays,
283324
signer_client,
284325
event_publisher: maybe_publiher,
285326
muxes,

crates/common/src/pbs/relay.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ 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 cloneable
5454
#[derive(Debug, Clone)]
5555
pub struct RelayClient {
5656
/// 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: 4 additions & 4 deletions
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(
@@ -177,9 +177,9 @@ async fn send_submit_block(
177177

178178
if let Some(blobs) = &block_response.data.blobs_bundle {
179179
let expected_committments = &signed_blinded_block.message.body.blob_kzg_commitments;
180-
if expected_committments.len() != blobs.blobs.len() ||
181-
expected_committments.len() != blobs.commitments.len() ||
182-
expected_committments.len() != blobs.proofs.len()
180+
if expected_committments.len() != blobs.blobs.len()
181+
|| expected_committments.len() != blobs.commitments.len()
182+
|| expected_committments.len() != blobs.proofs.len()
183183
{
184184
return Err(PbsError::Validation(ValidationError::KzgCommitments {
185185
expected_blobs: expected_committments.len(),

crates/pbs/src/state.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,12 @@ 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 [`PbsState::mux_config_and_relays`] instead
48+
pub fn all_relays(&self) -> &[RelayClient] {
49+
&self.config.all_relays
4850
}
51+
4952
/// Returns the PBS config and relay clients for the given validator pubkey.
5053
/// If the pubkey is not found in any mux, the default configs are
5154
/// returned
@@ -55,7 +58,8 @@ where
5558
) -> (&PbsConfig, &[RelayClient], Option<&str>) {
5659
match self.config.muxes.as_ref().and_then(|muxes| muxes.get(pubkey)) {
5760
Some(mux) => (&mux.config, mux.relays.as_slice(), Some(&mux.id)),
58-
None => (self.pbs_config(), self.relays(), None),
61+
// return only the default relays if there's no match
62+
None => (self.pbs_config(), &self.config.relays, None),
5963
}
6064
}
6165

tests/tests/pbs_integration.rs

Lines changed: 19 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,18 @@ 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+
249260
Ok(())
250261
}

0 commit comments

Comments
 (0)