diff --git a/crates/api/src/builder/api.rs b/crates/api/src/builder/api.rs index b35a6fa0..6341ae48 100644 --- a/crates/api/src/builder/api.rs +++ b/crates/api/src/builder/api.rs @@ -94,7 +94,7 @@ where db: Arc, chain_info: Arc, simulator: S, - gossiper: Arc, + gossiper: Option>, signing_context: Arc, relay_config: Arc, db_sender: Sender, @@ -119,7 +119,7 @@ where db: Arc, chain_info: Arc, simulator: S, - gossiper: Arc, + gossiper: Option>, signing_context: Arc, relay_config: RelayConfig, slot_update_subscription: Sender>, @@ -1301,8 +1301,12 @@ where is_cancellations_enabled, on_receive, }; - if let Err(err) = self.gossiper.broadcast_header(params).await { - error!(%err, "failed to broadcast header"); + if let Some(gossiper) = &self.gossiper { + if let Err(err) = gossiper.broadcast_header(params).await { + error!(%err, "failed to broadcast header"); + } + }else { + warn!("Gossiper is not available, skipping header broadcast"); } } @@ -1316,8 +1320,13 @@ where slot: payload.slot(), proposer_pub_key: payload.proposer_public_key().clone(), }; - if let Err(err) = self.gossiper.broadcast_payload(params).await { - error!(%err, "failed to broadcast payload"); + + if let Some(gossiper) = &self.gossiper { + if let Err(err) = gossiper.broadcast_payload(params).await { + error!(%err, "failed to broadcast payload"); + } + }else { + warn!("Gossiper is not available, skipping payload broadcast"); } } @@ -1327,8 +1336,12 @@ where request_id: &Uuid, ) { let params = BroadcastCancellationParams { signed_cancellation, request_id: *request_id }; - if let Err(err) = self.gossiper.broadcast_cancellation(params).await { - error!(request_id = %request_id, error = %err, "failed to broadcast header"); + if let Some(gossiper) = &self.gossiper { + if let Err(err) = gossiper.broadcast_cancellation(params).await { + error!(%err, "failed to broadcast header"); + } + }else { + warn!("Gossiper is not available, skipping header broadcast"); } } } diff --git a/crates/api/src/proposer/api.rs b/crates/api/src/proposer/api.rs index 90850099..98d812dd 100644 --- a/crates/api/src/proposer/api.rs +++ b/crates/api/src/proposer/api.rs @@ -76,7 +76,7 @@ where { auctioneer: Arc, db: Arc, - gossiper: Arc, + gossiper: Option>, broadcasters: Vec>, multi_beacon_client: Arc, @@ -99,7 +99,7 @@ where pub fn new( auctioneer: Arc, db: Arc, - gossiper: Arc, + gossiper: Option>, broadcasters: Vec>, multi_beacon_client: Arc, chain_info: Arc, @@ -671,16 +671,20 @@ where let slot = signed_blinded_block.message().slot(); // Broadcast get payload request - if let Err(e) = proposer_api - .gossiper - .broadcast_get_payload(BroadcastGetPayloadParams { - signed_blinded_beacon_block: signed_blinded_block.clone(), - request_id, - }) - .await - { - error!(request_id = %request_id, error = %e, "failed to broadcast get payload"); - }; + if let Some(gossiper) = &proposer_api.gossiper { + if let Err(e) = gossiper + .broadcast_get_payload(BroadcastGetPayloadParams { + signed_blinded_beacon_block: signed_blinded_block.clone(), + request_id, + }) + .await + { + error!(request_id = %request_id, error = %e, "failed to broadcast get payload"); + } + } else { + warn!(request_id = %request_id, "Gossiper is not available, skipping broadcast"); + } + match proposer_api ._get_payload(signed_blinded_block, &mut trace, &request_id, user_agent) diff --git a/crates/api/src/proposer/tests.rs b/crates/api/src/proposer/tests.rs index e401628e..1729a317 100644 --- a/crates/api/src/proposer/tests.rs +++ b/crates/api/src/proposer/tests.rs @@ -988,7 +988,7 @@ mod proposer_api_tests { >::new( auctioneer.clone(), Arc::new(MockDatabaseService::default()), - Arc::new(MockGossiper::new().unwrap()), + Some(Arc::new(MockGossiper::new().unwrap())), vec![], Arc::new(MockMultiBeaconClient::default()), Arc::new(ChainInfo::for_holesky()), diff --git a/crates/api/src/service.rs b/crates/api/src/service.rs index 684893ef..54797dc4 100644 --- a/crates/api/src/service.rs +++ b/crates/api/src/service.rs @@ -150,14 +150,18 @@ impl ApiService { .start(chain_updater_head_events, chain_updater_payload_events) .await; }); - - let gossiper = Arc::new( - GrpcGossiperClientManager::new( - config.relays.iter().map(|cfg| cfg.url.clone()).collect(), - ) - .await - .expect("failed to initialise gRPC gossiper"), - ); + let gossiper; + if config.relays.len() == 0 { + gossiper = None; + }else{ + gossiper = Some(Arc::new( + GrpcGossiperClientManager::new( + config.relays.iter().map(|cfg| cfg.url.clone()).collect(), + ) + .await + .expect("failed to initialise gRPC gossiper"), + )); + } let validator_preferences = Arc::new(config.validator_preferences.clone()); @@ -177,7 +181,9 @@ impl ApiService { ); let builder_api = Arc::new(builder_api); - gossiper.start_server(builder_gossip_sender, proposer_gossip_sender).await; + if gossiper.is_some(){ + gossiper.clone().unwrap().start_server(builder_gossip_sender, proposer_gossip_sender).await; + } let proposer_api = Arc::new(ProposerApiProd::new( auctioneer.clone(), diff --git a/crates/api/src/test_utils.rs b/crates/api/src/test_utils.rs index 923e3b0d..aebdb0de 100644 --- a/crates/api/src/test_utils.rs +++ b/crates/api/src/test_utils.rs @@ -50,7 +50,7 @@ pub fn app() -> Router { >::new( Arc::new(MockAuctioneer::default()), Arc::new(MockDatabaseService::default()), - Arc::new(MockGossiper::new().unwrap()), + Some(Arc::new(MockGossiper::new().unwrap())), vec![Arc::new(BlockBroadcaster::Mock(MockBlockBroadcaster::default()))], Arc::new(MockMultiBeaconClient::default()), Arc::new(ChainInfo::for_mainnet()), @@ -147,7 +147,7 @@ pub fn builder_api_app() -> ( Arc::new(MockDatabaseService::default()), Arc::new(ChainInfo::for_mainnet()), MockSimulator::default(), - Arc::new(MockGossiper::new().unwrap()), + Some(Arc::new(MockGossiper::new().unwrap())), Arc::new(RelaySigningContext::default()), RelayConfig::default(), slot_update_sender.clone(), @@ -212,7 +212,7 @@ pub fn proposer_api_app() -> ( >::new( auctioneer.clone(), Arc::new(MockDatabaseService::default()), - Arc::new(MockGossiper::new().unwrap()), + Some(Arc::new(MockGossiper::new().unwrap())), vec![Arc::new(BlockBroadcaster::Mock(MockBlockBroadcaster::default()))], Arc::new(MockMultiBeaconClient::default()), Arc::new(ChainInfo::for_mainnet()), @@ -314,7 +314,7 @@ pub fn constraints_api_app() -> ( database.clone(), Arc::new(ChainInfo::for_mainnet()), MockSimulator::default(), - Arc::new(MockGossiper::new().unwrap()), + Some(Arc::new(MockGossiper::new().unwrap())), Arc::new(RelaySigningContext::default()), RelayConfig::default(), slot_update_sender.clone(),