diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index 99b463e0bc..aba9be3262 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -1070,7 +1070,7 @@ impl BeaconChain { let expected_kzg_commitments = match block.message().body().blob_kzg_commitments() { Ok(kzg_commitments) => kzg_commitments, - Err(_) => return Err(Error::BlobsUnavailable), + Err(_) => return Err(Error::NoKzgCommitmentsFieldOnBlock), }; if expected_kzg_commitments.is_empty() { Ok(Some(BlobsSidecar::empty_from_parts( @@ -1079,12 +1079,12 @@ impl BeaconChain { ))) } else { if let Some(boundary) = self.data_availability_boundary() { - // We should have blobs for all blocks after the boundary. + // We should have blobs for all blocks younger than the boundary. if boundary <= block.epoch() { return Err(Error::BlobsUnavailable); } } - Ok(None) + Err(Error::BlobsOlderThanDataAvailabilityBoundary) } }) .transpose() diff --git a/beacon_node/beacon_chain/src/errors.rs b/beacon_node/beacon_chain/src/errors.rs index e744e2af5b..9a9b09fe1f 100644 --- a/beacon_node/beacon_chain/src/errors.rs +++ b/beacon_node/beacon_chain/src/errors.rs @@ -210,6 +210,8 @@ pub enum BeaconChainError { InconsistentFork(InconsistentFork), ProposerHeadForkChoiceError(fork_choice::Error), BlobsUnavailable, + NoKzgCommitmentsFieldOnBlock, + BlobsOlderThanDataAvailabilityBoundary, } easy_from_to!(SlotProcessingError, BeaconChainError); diff --git a/beacon_node/network/src/beacon_processor/worker/rpc_methods.rs b/beacon_node/network/src/beacon_processor/worker/rpc_methods.rs index aff0c76511..441a82c12b 100644 --- a/beacon_node/network/src/beacon_processor/worker/rpc_methods.rs +++ b/beacon_node/network/src/beacon_processor/worker/rpc_methods.rs @@ -251,7 +251,7 @@ impl Worker { let block_epoch = block.epoch(); if Some(block_epoch) >= finalized_data_availability_boundary { - debug!( + error!( self.log, "Peer requested block and blob that should be available, but no blob found"; "peer" => %peer_id, @@ -270,7 +270,7 @@ impl Worker { } } Ok((None, Some(_))) => { - debug!( + error!( self.log, "Peer requested block and blob, but no block found"; "peer" => %peer_id, @@ -754,17 +754,47 @@ impl Worker { send_response = false; break; } + Err(BeaconChainError::NoKzgCommitmentsFieldOnBlock) => { + error!( + self.log, + "No kzg_commitments field in block"; + "block_root" => ?root, + ); + self.send_error_response( + peer_id, + RPCResponseErrorCode::ResourceUnavailable, + "Failed reading field kzg_commitments from block".into(), + request_id, + ); + send_response = false; + break; + } + Err(BeaconChainError::BlobsOlderThanDataAvailabilityBoundary) => { + error!( + self.log, + "Failed loading blobs older than data availability boundary"; + "block_root" => ?root, + ); + self.send_error_response( + peer_id, + RPCResponseErrorCode::ResourceUnavailable, + "Blobs older than data availability boundary".into(), + request_id, + ); + send_response = false; + break; + } Err(e) => { error!( self.log, - "Error fetching blob for peer"; + "Error fetching blinded block for block root"; "block_root" => ?root, "error" => ?e ); self.send_error_response( peer_id, RPCResponseErrorCode::ServerError, - "Failed fetching blobs".into(), + "No blobs and failed fetching corresponding block".into(), request_id, ); send_response = false;