Skip to content

Commit 90b6ae6

Browse files
authored
Use Local Payload if More Profitable than Builder (#3934)
* Use Local Payload if More Profitable than Builder * Rename clone -> clone_from_ref * Minimize Clones of GetPayloadResponse * Cleanup & Fix Tests * Added Tests for Payload Choice by Profit * Fix Outdated Comments
1 parent 4d0955c commit 90b6ae6

File tree

10 files changed

+344
-69
lines changed

10 files changed

+344
-69
lines changed

beacon_node/beacon_chain/src/test_utils.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ where
426426
DEFAULT_TERMINAL_BLOCK,
427427
shanghai_time,
428428
eip4844_time,
429+
None,
429430
Some(JwtKey::from_slice(&DEFAULT_JWT_SECRET).unwrap()),
430431
spec,
431432
None,
@@ -435,7 +436,11 @@ where
435436
self
436437
}
437438

438-
pub fn mock_execution_layer_with_builder(mut self, beacon_url: SensitiveUrl) -> Self {
439+
pub fn mock_execution_layer_with_builder(
440+
mut self,
441+
beacon_url: SensitiveUrl,
442+
builder_threshold: Option<u128>,
443+
) -> Self {
439444
// Get a random unused port
440445
let port = unused_port::unused_tcp_port().unwrap();
441446
let builder_url = SensitiveUrl::parse(format!("http://127.0.0.1:{port}").as_str()).unwrap();
@@ -452,6 +457,7 @@ where
452457
DEFAULT_TERMINAL_BLOCK,
453458
shanghai_time,
454459
eip4844_time,
460+
builder_threshold,
455461
Some(JwtKey::from_slice(&DEFAULT_JWT_SECRET).unwrap()),
456462
spec.clone(),
457463
Some(builder_url.clone()),

beacon_node/execution_layer/src/engine_api.rs

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use std::convert::TryFrom;
1414
use strum::IntoStaticStr;
1515
use superstruct::superstruct;
1616
pub use types::{
17-
Address, EthSpec, ExecutionBlockHash, ExecutionPayload, ExecutionPayloadHeader, FixedVector,
18-
ForkName, Hash256, Uint256, VariableList, Withdrawal,
17+
Address, EthSpec, ExecutionBlockHash, ExecutionPayload, ExecutionPayloadHeader,
18+
ExecutionPayloadRef, FixedVector, ForkName, Hash256, Uint256, VariableList, Withdrawal,
1919
};
2020
use types::{ExecutionPayloadCapella, ExecutionPayloadEip4844, ExecutionPayloadMerge};
2121

@@ -322,6 +322,8 @@ pub struct ProposeBlindedBlockResponse {
322322
#[superstruct(
323323
variants(Merge, Capella, Eip4844),
324324
variant_attributes(derive(Clone, Debug, PartialEq),),
325+
map_into(ExecutionPayload),
326+
map_ref_into(ExecutionPayloadRef),
325327
cast_error(ty = "Error", expr = "Error::IncorrectStateVariant"),
326328
partial_getter_error(ty = "Error", expr = "Error::IncorrectStateVariant")
327329
)]
@@ -336,22 +338,47 @@ pub struct GetPayloadResponse<T: EthSpec> {
336338
pub block_value: Uint256,
337339
}
338340

339-
impl<T: EthSpec> GetPayloadResponse<T> {
340-
pub fn execution_payload(self) -> ExecutionPayload<T> {
341-
match self {
342-
GetPayloadResponse::Merge(response) => {
343-
ExecutionPayload::Merge(response.execution_payload)
344-
}
345-
GetPayloadResponse::Capella(response) => {
346-
ExecutionPayload::Capella(response.execution_payload)
347-
}
348-
GetPayloadResponse::Eip4844(response) => {
349-
ExecutionPayload::Eip4844(response.execution_payload)
350-
}
341+
impl<'a, T: EthSpec> From<GetPayloadResponseRef<'a, T>> for ExecutionPayloadRef<'a, T> {
342+
fn from(response: GetPayloadResponseRef<'a, T>) -> Self {
343+
map_get_payload_response_ref_into_execution_payload_ref!(&'a _, response, |inner, cons| {
344+
cons(&inner.execution_payload)
345+
})
346+
}
347+
}
348+
349+
impl<T: EthSpec> From<GetPayloadResponse<T>> for ExecutionPayload<T> {
350+
fn from(response: GetPayloadResponse<T>) -> Self {
351+
map_get_payload_response_into_execution_payload!(response, |inner, cons| {
352+
cons(inner.execution_payload)
353+
})
354+
}
355+
}
356+
357+
impl<T: EthSpec> From<GetPayloadResponse<T>> for (ExecutionPayload<T>, Uint256) {
358+
fn from(response: GetPayloadResponse<T>) -> Self {
359+
match response {
360+
GetPayloadResponse::Merge(inner) => (
361+
ExecutionPayload::Merge(inner.execution_payload),
362+
inner.block_value,
363+
),
364+
GetPayloadResponse::Capella(inner) => (
365+
ExecutionPayload::Capella(inner.execution_payload),
366+
inner.block_value,
367+
),
368+
GetPayloadResponse::Eip4844(inner) => (
369+
ExecutionPayload::Eip4844(inner.execution_payload),
370+
inner.block_value,
371+
),
351372
}
352373
}
353374
}
354375

376+
impl<T: EthSpec> GetPayloadResponse<T> {
377+
pub fn execution_payload_ref(&self) -> ExecutionPayloadRef<T> {
378+
self.to_ref().into()
379+
}
380+
}
381+
355382
#[derive(Clone, Copy, Debug)]
356383
pub struct EngineCapabilities {
357384
pub new_payload_v1: bool,

beacon_node/execution_layer/src/engine_api/http.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -804,7 +804,7 @@ impl HttpJsonRpc {
804804
pub async fn get_payload_v1<T: EthSpec>(
805805
&self,
806806
payload_id: PayloadId,
807-
) -> Result<ExecutionPayload<T>, Error> {
807+
) -> Result<GetPayloadResponse<T>, Error> {
808808
let params = json!([JsonPayloadIdRequest::from(payload_id)]);
809809

810810
let payload_v1: JsonExecutionPayloadV1<T> = self
@@ -815,7 +815,11 @@ impl HttpJsonRpc {
815815
)
816816
.await?;
817817

818-
Ok(JsonExecutionPayload::V1(payload_v1).into())
818+
Ok(GetPayloadResponse::Merge(GetPayloadResponseMerge {
819+
execution_payload: payload_v1.into(),
820+
// Have to guess zero here as we don't know the value
821+
block_value: Uint256::zero(),
822+
}))
819823
}
820824

821825
pub async fn get_payload_v2<T: EthSpec>(
@@ -1015,16 +1019,10 @@ impl HttpJsonRpc {
10151019
&self,
10161020
fork_name: ForkName,
10171021
payload_id: PayloadId,
1018-
) -> Result<ExecutionPayload<T>, Error> {
1022+
) -> Result<GetPayloadResponse<T>, Error> {
10191023
let engine_capabilities = self.get_engine_capabilities(None).await?;
10201024
if engine_capabilities.get_payload_v2 {
1021-
// TODO: modify this method to return GetPayloadResponse instead
1022-
// of throwing away the `block_value` and returning only the
1023-
// ExecutionPayload
1024-
Ok(self
1025-
.get_payload_v2(fork_name, payload_id)
1026-
.await?
1027-
.execution_payload())
1025+
self.get_payload_v2(fork_name, payload_id).await
10281026
} else if engine_capabilities.new_payload_v1 {
10291027
self.get_payload_v1(payload_id).await
10301028
} else {
@@ -1675,10 +1673,11 @@ mod test {
16751673
}
16761674
})],
16771675
|client| async move {
1678-
let payload = client
1676+
let payload: ExecutionPayload<_> = client
16791677
.get_payload_v1::<MainnetEthSpec>(str_to_payload_id("0xa247243752eb10b4"))
16801678
.await
1681-
.unwrap();
1679+
.unwrap()
1680+
.into();
16821681

16831682
let expected = ExecutionPayload::Merge(ExecutionPayloadMerge {
16841683
parent_hash: ExecutionBlockHash::from_str("0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a").unwrap(),

0 commit comments

Comments
 (0)