mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-31 05:07:12 +00:00
Fix
This commit is contained in:
@@ -22,14 +22,17 @@ use beacon_chain::block_verification_types::{AsBlock, RangeSyncBlock};
|
||||
use beacon_chain::{BeaconChain, BeaconChainTypes, BlockProcessStatus, EngineState};
|
||||
use custody::CustodyRequestResult;
|
||||
use fnv::FnvHashMap;
|
||||
use lighthouse_network::rpc::methods::{BlobsByRangeRequest, DataColumnsByRangeRequest};
|
||||
use lighthouse_network::rpc::methods::{
|
||||
BlobsByRangeRequest, DataColumnsByRangeRequest, PayloadEnvelopesByRangeRequest,
|
||||
};
|
||||
use lighthouse_network::rpc::{BlocksByRangeRequest, GoodbyeReason, RPCError, RequestType};
|
||||
pub use lighthouse_network::service::api_types::RangeRequestId;
|
||||
use lighthouse_network::service::api_types::{
|
||||
AppRequestId, BlobsByRangeRequestId, BlocksByRangeRequestId, ComponentsByRangeRequestId,
|
||||
CustodyBackFillBatchRequestId, CustodyBackfillBatchId, CustodyId, CustodyRequester,
|
||||
DataColumnsByRangeRequestId, DataColumnsByRangeRequester, DataColumnsByRootRequestId,
|
||||
DataColumnsByRootRequester, Id, SingleLookupReqId, SyncRequestId,
|
||||
DataColumnsByRootRequester, Id, PayloadEnvelopesByRangeRequestId, SingleLookupReqId,
|
||||
SyncRequestId,
|
||||
};
|
||||
use lighthouse_network::{Client, NetworkGlobals, PeerAction, PeerId, ReportSource};
|
||||
use parking_lot::RwLock;
|
||||
@@ -37,6 +40,7 @@ pub use requests::LookupVerifyError;
|
||||
use requests::{
|
||||
ActiveRequests, BlobsByRangeRequestItems, BlobsByRootRequestItems, BlocksByRangeRequestItems,
|
||||
BlocksByRootRequestItems, DataColumnsByRangeRequestItems, DataColumnsByRootRequestItems,
|
||||
PayloadEnvelopesByRangeRequestItems,
|
||||
};
|
||||
#[cfg(test)]
|
||||
use slot_clock::SlotClock;
|
||||
@@ -52,7 +56,7 @@ use tracing::{Span, debug, debug_span, error, warn};
|
||||
use types::data::FixedBlobSidecarList;
|
||||
use types::{
|
||||
BlobSidecar, BlockImportSource, ColumnIndex, DataColumnSidecar, DataColumnSidecarList, EthSpec,
|
||||
ForkContext, Hash256, SignedBeaconBlock, Slot,
|
||||
ForkContext, Hash256, SignedBeaconBlock, SignedExecutionPayloadEnvelope, Slot,
|
||||
};
|
||||
|
||||
pub mod custody;
|
||||
@@ -213,6 +217,11 @@ pub struct SyncNetworkContext<T: BeaconChainTypes> {
|
||||
/// A mapping of active DataColumnsByRange requests
|
||||
data_columns_by_range_requests:
|
||||
ActiveRequests<DataColumnsByRangeRequestId, DataColumnsByRangeRequestItems<T::EthSpec>>,
|
||||
/// A mapping of active PayloadEnvelopesByRange requests
|
||||
payload_envelopes_by_range_requests: ActiveRequests<
|
||||
PayloadEnvelopesByRangeRequestId,
|
||||
PayloadEnvelopesByRangeRequestItems<T::EthSpec>,
|
||||
>,
|
||||
/// Mapping of active custody column requests for a block root
|
||||
custody_by_root_requests: FnvHashMap<CustodyRequester, ActiveCustodyRequest<T>>,
|
||||
|
||||
@@ -250,6 +259,10 @@ pub enum RangeBlockComponent<E: EthSpec> {
|
||||
DataColumnsByRangeRequestId,
|
||||
RpcResponseResult<Vec<Arc<DataColumnSidecar<E>>>>,
|
||||
),
|
||||
PayloadEnvelope(
|
||||
PayloadEnvelopesByRangeRequestId,
|
||||
RpcResponseResult<Vec<Arc<SignedExecutionPayloadEnvelope<E>>>>,
|
||||
),
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -298,6 +311,7 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
blocks_by_range_requests: ActiveRequests::new("blocks_by_range"),
|
||||
blobs_by_range_requests: ActiveRequests::new("blobs_by_range"),
|
||||
data_columns_by_range_requests: ActiveRequests::new("data_columns_by_range"),
|
||||
payload_envelopes_by_range_requests: ActiveRequests::new("payload_envelopes_by_range"),
|
||||
custody_by_root_requests: <_>::default(),
|
||||
components_by_range_requests: FnvHashMap::default(),
|
||||
custody_backfill_data_column_batch_requests: FnvHashMap::default(),
|
||||
@@ -326,6 +340,7 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
blocks_by_range_requests,
|
||||
blobs_by_range_requests,
|
||||
data_columns_by_range_requests,
|
||||
payload_envelopes_by_range_requests,
|
||||
// custody_by_root_requests is a meta request of data_columns_by_root_requests
|
||||
custody_by_root_requests: _,
|
||||
// components_by_range_requests is a meta request of various _by_range requests
|
||||
@@ -361,12 +376,17 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
.active_requests_of_peer(peer_id)
|
||||
.into_iter()
|
||||
.map(|req_id| SyncRequestId::DataColumnsByRange(*req_id));
|
||||
let payload_envelope_by_range_ids = payload_envelopes_by_range_requests
|
||||
.active_requests_of_peer(peer_id)
|
||||
.into_iter()
|
||||
.map(|req_id| SyncRequestId::PayloadEnvelopesByRange(*req_id));
|
||||
blocks_by_root_ids
|
||||
.chain(blobs_by_root_ids)
|
||||
.chain(data_column_by_root_ids)
|
||||
.chain(blocks_by_range_ids)
|
||||
.chain(blobs_by_range_ids)
|
||||
.chain(data_column_by_range_ids)
|
||||
.chain(payload_envelope_by_range_ids)
|
||||
.collect()
|
||||
}
|
||||
|
||||
@@ -423,6 +443,7 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
blocks_by_range_requests,
|
||||
blobs_by_range_requests,
|
||||
data_columns_by_range_requests,
|
||||
payload_envelopes_by_range_requests,
|
||||
// custody_by_root_requests is a meta request of data_columns_by_root_requests
|
||||
custody_by_root_requests: _,
|
||||
// components_by_range_requests is a meta request of various _by_range requests
|
||||
@@ -445,6 +466,7 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
.chain(blocks_by_range_requests.iter_request_peers())
|
||||
.chain(blobs_by_range_requests.iter_request_peers())
|
||||
.chain(data_columns_by_range_requests.iter_request_peers())
|
||||
.chain(payload_envelopes_by_range_requests.iter_request_peers())
|
||||
{
|
||||
*active_request_count_by_peer.entry(peer_id).or_default() += 1;
|
||||
}
|
||||
@@ -577,24 +599,26 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
};
|
||||
|
||||
// Attempt to find all required custody peers before sending any request or creating an ID
|
||||
let columns_by_range_peers_to_request =
|
||||
if matches!(batch_type, ByRangeRequestType::BlocksAndColumns) {
|
||||
let epoch = Slot::new(*request.start_slot()).epoch(T::EthSpec::slots_per_epoch());
|
||||
let column_indexes = self
|
||||
.chain
|
||||
.sampling_columns_for_epoch(epoch)
|
||||
.iter()
|
||||
.cloned()
|
||||
.collect();
|
||||
Some(self.select_columns_by_range_peers_to_request(
|
||||
&column_indexes,
|
||||
column_peers,
|
||||
active_request_count_by_peer,
|
||||
peers_to_deprioritize,
|
||||
)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let columns_by_range_peers_to_request = if matches!(
|
||||
batch_type,
|
||||
ByRangeRequestType::BlocksAndColumns | ByRangeRequestType::BlocksAndEnvelopesAndColumns
|
||||
) {
|
||||
let epoch = Slot::new(*request.start_slot()).epoch(T::EthSpec::slots_per_epoch());
|
||||
let column_indexes = self
|
||||
.chain
|
||||
.sampling_columns_for_epoch(epoch)
|
||||
.iter()
|
||||
.cloned()
|
||||
.collect();
|
||||
Some(self.select_columns_by_range_peers_to_request(
|
||||
&column_indexes,
|
||||
column_peers,
|
||||
active_request_count_by_peer,
|
||||
peers_to_deprioritize,
|
||||
)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
// Create the overall components_by_range request ID before its individual components
|
||||
let id = ComponentsByRangeRequestId {
|
||||
@@ -659,6 +683,28 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
.transpose()?;
|
||||
|
||||
let epoch = Slot::new(*request.start_slot()).epoch(T::EthSpec::slots_per_epoch());
|
||||
|
||||
// Send envelope request for Gloas epochs
|
||||
let payloads_req_id =
|
||||
if matches!(batch_type, ByRangeRequestType::BlocksAndEnvelopesAndColumns) {
|
||||
Some(self.send_payload_envelopes_by_range_request(
|
||||
block_peer,
|
||||
PayloadEnvelopesByRangeRequest {
|
||||
start_slot: *request.start_slot(),
|
||||
count: *request.count(),
|
||||
},
|
||||
id,
|
||||
new_range_request_span!(
|
||||
self,
|
||||
"outgoing_envelopes_by_range",
|
||||
range_request_span.clone(),
|
||||
block_peer
|
||||
),
|
||||
)?)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let info = RangeBlockComponentsRequest::new(
|
||||
blocks_req_id,
|
||||
blobs_req_id,
|
||||
@@ -668,6 +714,7 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
self.chain.sampling_columns_for_epoch(epoch).to_vec(),
|
||||
)
|
||||
}),
|
||||
payloads_req_id,
|
||||
range_request_span,
|
||||
);
|
||||
self.components_by_range_requests.insert(id, info);
|
||||
@@ -770,6 +817,17 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
})
|
||||
})
|
||||
}
|
||||
RangeBlockComponent::PayloadEnvelope(req_id, resp) => {
|
||||
resp.and_then(|(envelopes, _)| {
|
||||
request
|
||||
.add_payload_envelopes(req_id, envelopes)
|
||||
.map_err(|e| {
|
||||
RpcResponseError::BlockComponentCouplingError(
|
||||
CouplingError::InternalError(e),
|
||||
)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
} {
|
||||
entry.remove();
|
||||
@@ -1295,6 +1353,57 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
Ok((id, requested_columns))
|
||||
}
|
||||
|
||||
fn send_payload_envelopes_by_range_request(
|
||||
&mut self,
|
||||
peer_id: PeerId,
|
||||
request: PayloadEnvelopesByRangeRequest,
|
||||
parent_request_id: ComponentsByRangeRequestId,
|
||||
request_span: Span,
|
||||
) -> Result<PayloadEnvelopesByRangeRequestId, RpcRequestSendError> {
|
||||
let id = PayloadEnvelopesByRangeRequestId {
|
||||
id: self.next_id(),
|
||||
parent_request_id,
|
||||
};
|
||||
|
||||
self.send_network_msg(NetworkMessage::SendRequest {
|
||||
peer_id,
|
||||
request: RequestType::PayloadEnvelopesByRange(request.clone()),
|
||||
app_request_id: AppRequestId::Sync(SyncRequestId::PayloadEnvelopesByRange(id)),
|
||||
})
|
||||
.map_err(|_| RpcRequestSendError::InternalError("network send error".to_owned()))?;
|
||||
|
||||
debug!(
|
||||
method = "PayloadEnvelopesByRange",
|
||||
slots = request.count,
|
||||
epoch = %Slot::new(request.start_slot).epoch(T::EthSpec::slots_per_epoch()),
|
||||
peer = %peer_id,
|
||||
%id,
|
||||
"Sync RPC request sent"
|
||||
);
|
||||
|
||||
self.payload_envelopes_by_range_requests.insert(
|
||||
id,
|
||||
peer_id,
|
||||
false,
|
||||
PayloadEnvelopesByRangeRequestItems::new(request),
|
||||
request_span,
|
||||
);
|
||||
Ok(id)
|
||||
}
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub(crate) fn on_payload_envelopes_by_range_response(
|
||||
&mut self,
|
||||
id: PayloadEnvelopesByRangeRequestId,
|
||||
peer_id: PeerId,
|
||||
rpc_event: RpcEvent<Arc<SignedExecutionPayloadEnvelope<T::EthSpec>>>,
|
||||
) -> Option<RpcResponseResult<Vec<Arc<SignedExecutionPayloadEnvelope<T::EthSpec>>>>> {
|
||||
let resp = self
|
||||
.payload_envelopes_by_range_requests
|
||||
.on_response(id, rpc_event);
|
||||
self.on_rpc_response_result(resp, peer_id)
|
||||
}
|
||||
|
||||
pub fn is_execution_engine_online(&self) -> bool {
|
||||
self.execution_engine_state == EngineState::Online
|
||||
}
|
||||
@@ -1376,6 +1485,12 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
);
|
||||
|
||||
if self
|
||||
.chain
|
||||
.data_availability_checker
|
||||
.envelopes_required_for_epoch(epoch)
|
||||
{
|
||||
ByRangeRequestType::BlocksAndEnvelopesAndColumns
|
||||
} else if self
|
||||
.chain
|
||||
.data_availability_checker
|
||||
.data_columns_required_for_epoch(epoch)
|
||||
@@ -1795,6 +1910,10 @@ impl<T: BeaconChainTypes> SyncNetworkContext<T> {
|
||||
"data_columns_by_range",
|
||||
self.data_columns_by_range_requests.len(),
|
||||
),
|
||||
(
|
||||
"payload_envelopes_by_range",
|
||||
self.payload_envelopes_by_range_requests.len(),
|
||||
),
|
||||
("custody_by_root", self.custody_by_root_requests.len()),
|
||||
(
|
||||
"components_by_range",
|
||||
|
||||
Reference in New Issue
Block a user