mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 18:32:42 +00:00
Light client updates by range RPC (#6383)
* enable lc update over rpc * resolve TODOs * resolve merge conflicts * move max light client updates to eth spec * Merge branch 'unstable' of https://github.com/sigp/lighthouse into light-client-updates-by-range-rpc * remove ethspec dependency * Update beacon_node/network/src/network_beacon_processor/rpc_methods.rs Co-authored-by: Michael Sproul <micsproul@gmail.com> * Update beacon_node/lighthouse_network/src/rpc/methods.rs Co-authored-by: Michael Sproul <micsproul@gmail.com>
This commit is contained in:
@@ -18,9 +18,9 @@ use tokio_util::codec::{Decoder, Encoder};
|
||||
use types::{
|
||||
BlobSidecar, ChainSpec, DataColumnSidecar, EthSpec, ForkContext, ForkName, Hash256,
|
||||
LightClientBootstrap, LightClientFinalityUpdate, LightClientOptimisticUpdate,
|
||||
RuntimeVariableList, SignedBeaconBlock, SignedBeaconBlockAltair, SignedBeaconBlockBase,
|
||||
SignedBeaconBlockBellatrix, SignedBeaconBlockCapella, SignedBeaconBlockDeneb,
|
||||
SignedBeaconBlockElectra,
|
||||
LightClientUpdate, RuntimeVariableList, SignedBeaconBlock, SignedBeaconBlockAltair,
|
||||
SignedBeaconBlockBase, SignedBeaconBlockBellatrix, SignedBeaconBlockCapella,
|
||||
SignedBeaconBlockDeneb, SignedBeaconBlockElectra,
|
||||
};
|
||||
use unsigned_varint::codec::Uvi;
|
||||
|
||||
@@ -76,6 +76,7 @@ impl<E: EthSpec> SSZSnappyInboundCodec<E> {
|
||||
RpcSuccessResponse::LightClientBootstrap(res) => res.as_ssz_bytes(),
|
||||
RpcSuccessResponse::LightClientOptimisticUpdate(res) => res.as_ssz_bytes(),
|
||||
RpcSuccessResponse::LightClientFinalityUpdate(res) => res.as_ssz_bytes(),
|
||||
RpcSuccessResponse::LightClientUpdatesByRange(res) => res.as_ssz_bytes(),
|
||||
RpcSuccessResponse::Pong(res) => res.data.as_ssz_bytes(),
|
||||
RpcSuccessResponse::MetaData(res) =>
|
||||
// Encode the correct version of the MetaData response based on the negotiated version.
|
||||
@@ -342,6 +343,7 @@ impl<E: EthSpec> Encoder<RequestType> for SSZSnappyOutboundCodec<E> {
|
||||
RequestType::DataColumnsByRoot(req) => req.data_column_ids.as_ssz_bytes(),
|
||||
RequestType::Ping(req) => req.as_ssz_bytes(),
|
||||
RequestType::LightClientBootstrap(req) => req.as_ssz_bytes(),
|
||||
RequestType::LightClientUpdatesByRange(req) => req.as_ssz_bytes(),
|
||||
// no metadata to encode
|
||||
RequestType::MetaData(_)
|
||||
| RequestType::LightClientOptimisticUpdate
|
||||
@@ -503,6 +505,10 @@ fn context_bytes<E: EthSpec>(
|
||||
return lc_finality_update
|
||||
.map_with_fork_name(|fork_name| fork_context.to_context_bytes(fork_name));
|
||||
}
|
||||
RpcSuccessResponse::LightClientUpdatesByRange(lc_update) => {
|
||||
return lc_update
|
||||
.map_with_fork_name(|fork_name| fork_context.to_context_bytes(fork_name));
|
||||
}
|
||||
// These will not pass the has_context_bytes() check
|
||||
RpcSuccessResponse::Status(_)
|
||||
| RpcSuccessResponse::Pong(_)
|
||||
@@ -613,6 +619,11 @@ fn handle_rpc_request(
|
||||
SupportedProtocol::LightClientFinalityUpdateV1 => {
|
||||
Ok(Some(RequestType::LightClientFinalityUpdate))
|
||||
}
|
||||
SupportedProtocol::LightClientUpdatesByRangeV1 => {
|
||||
Ok(Some(RequestType::LightClientUpdatesByRange(
|
||||
LightClientUpdatesByRangeRequest::from_ssz_bytes(decoded_buffer)?,
|
||||
)))
|
||||
}
|
||||
// MetaData requests return early from InboundUpgrade and do not reach the decoder.
|
||||
// Handle this case just for completeness.
|
||||
SupportedProtocol::MetaDataV3 => {
|
||||
@@ -795,6 +806,21 @@ fn handle_rpc_response<E: EthSpec>(
|
||||
),
|
||||
)),
|
||||
},
|
||||
SupportedProtocol::LightClientUpdatesByRangeV1 => match fork_name {
|
||||
Some(fork_name) => Ok(Some(RpcSuccessResponse::LightClientUpdatesByRange(
|
||||
Arc::new(LightClientUpdate::from_ssz_bytes(
|
||||
decoded_buffer,
|
||||
&fork_name,
|
||||
)?),
|
||||
))),
|
||||
None => Err(RPCError::ErrorResponse(
|
||||
RpcErrorResponse::InvalidRequest,
|
||||
format!(
|
||||
"No context bytes provided for {:?} response",
|
||||
versioned_protocol
|
||||
),
|
||||
)),
|
||||
},
|
||||
// MetaData V2/V3 responses have no context bytes, so behave similarly to V1 responses
|
||||
SupportedProtocol::MetaDataV3 => Ok(Some(RpcSuccessResponse::MetaData(MetaData::V3(
|
||||
MetaDataV3::from_ssz_bytes(decoded_buffer)?,
|
||||
@@ -1215,6 +1241,12 @@ mod tests {
|
||||
)
|
||||
}
|
||||
RequestType::LightClientOptimisticUpdate | RequestType::LightClientFinalityUpdate => {}
|
||||
RequestType::LightClientUpdatesByRange(light_client_updates_by_range) => {
|
||||
assert_eq!(
|
||||
decoded,
|
||||
RequestType::LightClientUpdatesByRange(light_client_updates_by_range)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user