Gloas engine api updates (#9150)

Co-Authored-By: Eitan Seri-Levi <eserilev@ucsc.edu>
This commit is contained in:
Eitan Seri-Levi
2026-04-21 16:36:22 +09:00
committed by GitHub
parent 02c2841db0
commit 7731b5f250
5 changed files with 47 additions and 16 deletions

View File

@@ -7,8 +7,8 @@ use execution_layer::{
EngineCapabilities, EngineCapabilities,
http::{ http::{
ENGINE_FORKCHOICE_UPDATED_V2, ENGINE_FORKCHOICE_UPDATED_V3, ENGINE_GET_PAYLOAD_V2, ENGINE_FORKCHOICE_UPDATED_V2, ENGINE_FORKCHOICE_UPDATED_V3, ENGINE_GET_PAYLOAD_V2,
ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V4, ENGINE_GET_PAYLOAD_V5, ENGINE_NEW_PAYLOAD_V2, ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V4, ENGINE_GET_PAYLOAD_V5, ENGINE_GET_PAYLOAD_V6,
ENGINE_NEW_PAYLOAD_V3, ENGINE_NEW_PAYLOAD_V4, ENGINE_NEW_PAYLOAD_V2, ENGINE_NEW_PAYLOAD_V3, ENGINE_NEW_PAYLOAD_V4, ENGINE_NEW_PAYLOAD_V5,
}, },
}; };
use lighthouse_network::{NetworkGlobals, types::SyncState}; use lighthouse_network::{NetworkGlobals, types::SyncState};
@@ -555,11 +555,11 @@ fn methods_required_for_fork(
} }
} }
ForkName::Gloas => { ForkName::Gloas => {
if !capabilities.get_payload_v5 { if !capabilities.get_payload_v6 {
missing_methods.push(ENGINE_GET_PAYLOAD_V5); missing_methods.push(ENGINE_GET_PAYLOAD_V6);
} }
if !capabilities.new_payload_v4 { if !capabilities.new_payload_v5 {
missing_methods.push(ENGINE_NEW_PAYLOAD_V4); missing_methods.push(ENGINE_NEW_PAYLOAD_V5);
} }
} }
} }

View File

@@ -4,8 +4,9 @@ use crate::http::{
ENGINE_FORKCHOICE_UPDATED_V4, ENGINE_GET_BLOBS_V1, ENGINE_GET_BLOBS_V2, ENGINE_FORKCHOICE_UPDATED_V4, ENGINE_GET_BLOBS_V1, ENGINE_GET_BLOBS_V2,
ENGINE_GET_CLIENT_VERSION_V1, ENGINE_GET_PAYLOAD_BODIES_BY_HASH_V1, ENGINE_GET_CLIENT_VERSION_V1, ENGINE_GET_PAYLOAD_BODIES_BY_HASH_V1,
ENGINE_GET_PAYLOAD_BODIES_BY_RANGE_V1, ENGINE_GET_PAYLOAD_V1, ENGINE_GET_PAYLOAD_V2, ENGINE_GET_PAYLOAD_BODIES_BY_RANGE_V1, ENGINE_GET_PAYLOAD_V1, ENGINE_GET_PAYLOAD_V2,
ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V4, ENGINE_GET_PAYLOAD_V5, ENGINE_NEW_PAYLOAD_V1, ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V4, ENGINE_GET_PAYLOAD_V5, ENGINE_GET_PAYLOAD_V6,
ENGINE_NEW_PAYLOAD_V2, ENGINE_NEW_PAYLOAD_V3, ENGINE_NEW_PAYLOAD_V4, ENGINE_NEW_PAYLOAD_V5, ENGINE_NEW_PAYLOAD_V1, ENGINE_NEW_PAYLOAD_V2, ENGINE_NEW_PAYLOAD_V3, ENGINE_NEW_PAYLOAD_V4,
ENGINE_NEW_PAYLOAD_V5,
}; };
use eth2::types::{ use eth2::types::{
BlobsBundle, SsePayloadAttributes, SsePayloadAttributesV1, SsePayloadAttributesV2, BlobsBundle, SsePayloadAttributes, SsePayloadAttributesV1, SsePayloadAttributesV2,
@@ -591,6 +592,7 @@ pub struct EngineCapabilities {
pub get_payload_v3: bool, pub get_payload_v3: bool,
pub get_payload_v4: bool, pub get_payload_v4: bool,
pub get_payload_v5: bool, pub get_payload_v5: bool,
pub get_payload_v6: bool,
pub get_client_version_v1: bool, pub get_client_version_v1: bool,
pub get_blobs_v1: bool, pub get_blobs_v1: bool,
pub get_blobs_v2: bool, pub get_blobs_v2: bool,
@@ -647,6 +649,9 @@ impl EngineCapabilities {
if self.get_payload_v5 { if self.get_payload_v5 {
response.push(ENGINE_GET_PAYLOAD_V5); response.push(ENGINE_GET_PAYLOAD_V5);
} }
if self.get_payload_v6 {
response.push(ENGINE_GET_PAYLOAD_V6);
}
if self.get_client_version_v1 { if self.get_client_version_v1 {
response.push(ENGINE_GET_CLIENT_VERSION_V1); response.push(ENGINE_GET_CLIENT_VERSION_V1);
} }

View File

@@ -43,6 +43,7 @@ pub const ENGINE_GET_PAYLOAD_V2: &str = "engine_getPayloadV2";
pub const ENGINE_GET_PAYLOAD_V3: &str = "engine_getPayloadV3"; pub const ENGINE_GET_PAYLOAD_V3: &str = "engine_getPayloadV3";
pub const ENGINE_GET_PAYLOAD_V4: &str = "engine_getPayloadV4"; pub const ENGINE_GET_PAYLOAD_V4: &str = "engine_getPayloadV4";
pub const ENGINE_GET_PAYLOAD_V5: &str = "engine_getPayloadV5"; pub const ENGINE_GET_PAYLOAD_V5: &str = "engine_getPayloadV5";
pub const ENGINE_GET_PAYLOAD_V6: &str = "engine_getPayloadV6";
pub const ENGINE_GET_PAYLOAD_TIMEOUT: Duration = Duration::from_secs(2); pub const ENGINE_GET_PAYLOAD_TIMEOUT: Duration = Duration::from_secs(2);
pub const ENGINE_FORKCHOICE_UPDATED_V1: &str = "engine_forkchoiceUpdatedV1"; pub const ENGINE_FORKCHOICE_UPDATED_V1: &str = "engine_forkchoiceUpdatedV1";
@@ -82,6 +83,7 @@ pub static LIGHTHOUSE_CAPABILITIES: &[&str] = &[
ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V3,
ENGINE_GET_PAYLOAD_V4, ENGINE_GET_PAYLOAD_V4,
ENGINE_GET_PAYLOAD_V5, ENGINE_GET_PAYLOAD_V5,
ENGINE_GET_PAYLOAD_V6,
ENGINE_FORKCHOICE_UPDATED_V1, ENGINE_FORKCHOICE_UPDATED_V1,
ENGINE_FORKCHOICE_UPDATED_V2, ENGINE_FORKCHOICE_UPDATED_V2,
ENGINE_FORKCHOICE_UPDATED_V3, ENGINE_FORKCHOICE_UPDATED_V3,
@@ -1052,10 +1054,25 @@ impl HttpJsonRpc {
.try_into() .try_into()
.map_err(Error::BadResponse) .map_err(Error::BadResponse)
} }
_ => Err(Error::UnsupportedForkVariant(format!(
"called get_payload_v5 with {}",
fork_name
))),
}
}
pub async fn get_payload_v6<E: EthSpec>(
&self,
fork_name: ForkName,
payload_id: PayloadId,
) -> Result<GetPayloadResponse<E>, Error> {
let params = json!([JsonPayloadIdRequest::from(payload_id)]);
match fork_name {
ForkName::Gloas => { ForkName::Gloas => {
let response: JsonGetPayloadResponseGloas<E> = self let response: JsonGetPayloadResponseGloas<E> = self
.rpc_request( .rpc_request(
ENGINE_GET_PAYLOAD_V5, ENGINE_GET_PAYLOAD_V6,
params, params,
ENGINE_GET_PAYLOAD_TIMEOUT * self.execution_timeout_multiplier, ENGINE_GET_PAYLOAD_TIMEOUT * self.execution_timeout_multiplier,
) )
@@ -1065,7 +1082,7 @@ impl HttpJsonRpc {
.map_err(Error::BadResponse) .map_err(Error::BadResponse)
} }
_ => Err(Error::UnsupportedForkVariant(format!( _ => Err(Error::UnsupportedForkVariant(format!(
"called get_payload_v5 with {}", "called get_payload_v6 with {}",
fork_name fork_name
))), ))),
} }
@@ -1237,6 +1254,7 @@ impl HttpJsonRpc {
get_payload_v3: capabilities.contains(ENGINE_GET_PAYLOAD_V3), get_payload_v3: capabilities.contains(ENGINE_GET_PAYLOAD_V3),
get_payload_v4: capabilities.contains(ENGINE_GET_PAYLOAD_V4), get_payload_v4: capabilities.contains(ENGINE_GET_PAYLOAD_V4),
get_payload_v5: capabilities.contains(ENGINE_GET_PAYLOAD_V5), get_payload_v5: capabilities.contains(ENGINE_GET_PAYLOAD_V5),
get_payload_v6: capabilities.contains(ENGINE_GET_PAYLOAD_V6),
get_client_version_v1: capabilities.contains(ENGINE_GET_CLIENT_VERSION_V1), get_client_version_v1: capabilities.contains(ENGINE_GET_CLIENT_VERSION_V1),
get_blobs_v1: capabilities.contains(ENGINE_GET_BLOBS_V1), get_blobs_v1: capabilities.contains(ENGINE_GET_BLOBS_V1),
get_blobs_v2: capabilities.contains(ENGINE_GET_BLOBS_V2), get_blobs_v2: capabilities.contains(ENGINE_GET_BLOBS_V2),
@@ -1429,10 +1447,10 @@ impl HttpJsonRpc {
} }
} }
ForkName::Gloas => { ForkName::Gloas => {
if engine_capabilities.get_payload_v5 { if engine_capabilities.get_payload_v6 {
self.get_payload_v5(fork_name, payload_id).await self.get_payload_v6(fork_name, payload_id).await
} else { } else {
Err(Error::RequiredMethodUnsupported("engine_getPayloadv5")) Err(Error::RequiredMethodUnsupported("engine_getPayloadV6"))
} }
} }
ForkName::Base | ForkName::Altair => Err(Error::UnsupportedForkVariant(format!( ForkName::Base | ForkName::Altair => Err(Error::UnsupportedForkVariant(format!(

View File

@@ -277,7 +277,8 @@ pub async fn handle_rpc<E: EthSpec>(
| ENGINE_GET_PAYLOAD_V2 | ENGINE_GET_PAYLOAD_V2
| ENGINE_GET_PAYLOAD_V3 | ENGINE_GET_PAYLOAD_V3
| ENGINE_GET_PAYLOAD_V4 | ENGINE_GET_PAYLOAD_V4
| ENGINE_GET_PAYLOAD_V5 => { | ENGINE_GET_PAYLOAD_V5
| ENGINE_GET_PAYLOAD_V6 => {
let request: JsonPayloadIdRequest = let request: JsonPayloadIdRequest =
get_param(params, 0).map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?; get_param(params, 0).map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?;
let id = request.into(); let id = request.into();
@@ -363,7 +364,8 @@ pub async fn handle_rpc<E: EthSpec>(
&& (method == ENGINE_GET_PAYLOAD_V1 && (method == ENGINE_GET_PAYLOAD_V1
|| method == ENGINE_GET_PAYLOAD_V2 || method == ENGINE_GET_PAYLOAD_V2
|| method == ENGINE_GET_PAYLOAD_V3 || method == ENGINE_GET_PAYLOAD_V3
|| method == ENGINE_GET_PAYLOAD_V4) || method == ENGINE_GET_PAYLOAD_V4
|| method == ENGINE_GET_PAYLOAD_V5)
{ {
return Err(( return Err((
format!("{} called after Gloas fork!", method), format!("{} called after Gloas fork!", method),
@@ -455,13 +457,18 @@ pub async fn handle_rpc<E: EthSpec>(
}) })
.unwrap() .unwrap()
} }
_ => unreachable!(),
})
}
ENGINE_GET_PAYLOAD_V6 => {
Ok(match JsonExecutionPayload::try_from(response).unwrap() {
JsonExecutionPayload::Gloas(execution_payload) => { JsonExecutionPayload::Gloas(execution_payload) => {
serde_json::to_value(JsonGetPayloadResponseGloas { serde_json::to_value(JsonGetPayloadResponseGloas {
execution_payload, execution_payload,
block_value: Uint256::from(DEFAULT_MOCK_EL_PAYLOAD_VALUE_WEI), block_value: Uint256::from(DEFAULT_MOCK_EL_PAYLOAD_VALUE_WEI),
blobs_bundle: maybe_blobs blobs_bundle: maybe_blobs
.ok_or(( .ok_or((
"No blobs returned despite V5 Payload".to_string(), "No blobs returned despite V6 Payload".to_string(),
GENERIC_ERROR_CODE, GENERIC_ERROR_CODE,
))? ))?
.into(), .into(),

View File

@@ -55,6 +55,7 @@ pub const DEFAULT_ENGINE_CAPABILITIES: EngineCapabilities = EngineCapabilities {
get_payload_v3: true, get_payload_v3: true,
get_payload_v4: true, get_payload_v4: true,
get_payload_v5: true, get_payload_v5: true,
get_payload_v6: true,
get_client_version_v1: true, get_client_version_v1: true,
get_blobs_v1: true, get_blobs_v1: true,
get_blobs_v2: true, get_blobs_v2: true,