diff --git a/validator_client/validator_services/src/block_service.rs b/validator_client/validator_services/src/block_service.rs index 01f786e160b..4ff8b15bed2 100644 --- a/validator_client/validator_services/src/block_service.rs +++ b/validator_client/validator_services/src/block_service.rs @@ -524,22 +524,44 @@ impl BlockService { proposer_index: Option, builder_boost_factor: Option, ) -> Result, BlockError> { - let (block_response, _) = beacon_node - .get_validator_blocks_v3::( + let block_response = match beacon_node + .get_validator_blocks_v3_ssz::( slot, randao_reveal_ref, graffiti.as_ref(), builder_boost_factor, ) .await - .map_err(|e| { - BlockError::Recoverable(format!( - "Error from beacon node when producing block: {:?}", - e - )) - })?; + { + Ok((ssz_block_response, _)) => ssz_block_response, + Err(e) => { + warn!( + slot = slot.as_u64(), + error = %e, + "Beacon node does not support SSZ in block production, falling back to JSON" + ); + + let (json_block_response, _) = beacon_node + .get_validator_blocks_v3::( + slot, + randao_reveal_ref, + graffiti.as_ref(), + builder_boost_factor, + ) + .await + .map_err(|e| { + BlockError::Recoverable(format!( + "Error from beacon node when producing block: {:?}", + e + )) + })?; + + // Extract ProduceBlockV3Response (data field of the struct ForkVersionedResponse) + json_block_response.data + } + }; - let (block_proposer, unsigned_block) = match block_response.data { + let (block_proposer, unsigned_block) = match block_response { eth2::types::ProduceBlockV3Response::Full(block) => { (block.block().proposer_index(), UnsignedBlock::Full(block)) }