beacon: consensus: implement engine api getBlobs
This commit is contained in:
parent
dcfae6c5cf
commit
8473f08d10
@ -24,7 +24,7 @@ use state_processing::per_block_processing::{
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
use tree_hash::TreeHash;
|
use tree_hash::TreeHash;
|
||||||
use types::*;
|
use types::{*, execution_payload::BlobsBundle};
|
||||||
|
|
||||||
pub type PreparePayloadResult<Payload> = Result<Payload, BlockProductionError>;
|
pub type PreparePayloadResult<Payload> = Result<Payload, BlockProductionError>;
|
||||||
pub type PreparePayloadHandle<Payload> = JoinHandle<Option<PreparePayloadResult<Payload>>>;
|
pub type PreparePayloadHandle<Payload> = JoinHandle<Option<PreparePayloadResult<Payload>>>;
|
||||||
@ -483,5 +483,13 @@ where
|
|||||||
.await
|
.await
|
||||||
.map_err(BlockProductionError::GetPayloadFailed)?;
|
.map_err(BlockProductionError::GetPayloadFailed)?;
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: fetch blob bundles from el engine for block building
|
||||||
|
let suggested_fee_recipient = execution_layer.get_suggested_fee_recipient(proposer_index).await;
|
||||||
|
let blobs = execution_layer.get_blob_bundles(parent_hash, timestamp, random, suggested_fee_recipient)
|
||||||
|
.await
|
||||||
|
.map_err(BlockProductionError::GetPayloadFailed)?;
|
||||||
|
*/
|
||||||
|
|
||||||
Ok(execution_payload)
|
Ok(execution_payload)
|
||||||
}
|
}
|
||||||
|
@ -681,19 +681,6 @@ impl HttpJsonRpc {
|
|||||||
Ok(response.into())
|
Ok(response.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn get_full_payload<T: EthSpec>(
|
|
||||||
&self,
|
|
||||||
payload_id: PayloadId,
|
|
||||||
) -> Result<FullPayload<T>, Error> {
|
|
||||||
let payload = self.get_payload_v1(payload_id).await;
|
|
||||||
let blobs = self.get_blobs_bundle_v1(payload_id).await;
|
|
||||||
|
|
||||||
Ok(FullPayload{
|
|
||||||
execution_payload: payload?,
|
|
||||||
blobs_bundle: blobs?.into(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn forkchoice_updated_v1(
|
pub async fn forkchoice_updated_v1(
|
||||||
&self,
|
&self,
|
||||||
forkchoice_state: ForkChoiceState,
|
forkchoice_state: ForkChoiceState,
|
||||||
|
@ -20,6 +20,7 @@ use sensitive_url::SensitiveUrl;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use slog::{crit, debug, error, info, trace, warn, Logger};
|
use slog::{crit, debug, error, info, trace, warn, Logger};
|
||||||
use slot_clock::SlotClock;
|
use slot_clock::SlotClock;
|
||||||
|
use types::execution_payload::BlobsBundle;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
@ -759,6 +760,55 @@ impl<T: EthSpec> ExecutionLayer<T> {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_blob_bundles(
|
||||||
|
&self,
|
||||||
|
parent_hash: ExecutionBlockHash,
|
||||||
|
timestamp: u64,
|
||||||
|
prev_randao: Hash256,
|
||||||
|
suggested_fee_recipient: Address,
|
||||||
|
) -> Result<BlobsBundle<T>, Error> {
|
||||||
|
debug!(
|
||||||
|
self.log(),
|
||||||
|
"Issuing engine_getPayload";
|
||||||
|
"suggested_fee_recipient" => ?suggested_fee_recipient,
|
||||||
|
"prev_randao" => ?prev_randao,
|
||||||
|
"timestamp" => timestamp,
|
||||||
|
"parent_hash" => ?parent_hash,
|
||||||
|
);
|
||||||
|
self.engine()
|
||||||
|
.request(|engine| async move {
|
||||||
|
let payload_id = if let Some(id) = engine
|
||||||
|
.get_payload_id(parent_hash, timestamp, prev_randao, suggested_fee_recipient)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
// The payload id has been cached for this engine.
|
||||||
|
metrics::inc_counter_vec(
|
||||||
|
&metrics::EXECUTION_LAYER_PRE_PREPARED_PAYLOAD_ID,
|
||||||
|
&[metrics::HIT],
|
||||||
|
);
|
||||||
|
id
|
||||||
|
} else {
|
||||||
|
error!(
|
||||||
|
self.log(),
|
||||||
|
"Exec engine unable to produce blobs, did you call get_payload before?",
|
||||||
|
);
|
||||||
|
return Err(ApiError::PayloadIdUnavailable);
|
||||||
|
};
|
||||||
|
|
||||||
|
engine
|
||||||
|
.api
|
||||||
|
.get_blobs_bundle_v1::<T>(payload_id)
|
||||||
|
.await
|
||||||
|
.map(|bundle| {
|
||||||
|
// TODO verify the blob bundle here?
|
||||||
|
bundle.into()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.map_err(Box::new)
|
||||||
|
.map_err(Error::EngineError)
|
||||||
|
}
|
||||||
|
|
||||||
async fn get_full_payload_with<Payload: ExecPayload<T>>(
|
async fn get_full_payload_with<Payload: ExecPayload<T>>(
|
||||||
&self,
|
&self,
|
||||||
parent_hash: ExecutionBlockHash,
|
parent_hash: ExecutionBlockHash,
|
||||||
@ -835,10 +885,10 @@ impl<T: EthSpec> ExecutionLayer<T> {
|
|||||||
|
|
||||||
engine
|
engine
|
||||||
.api
|
.api
|
||||||
.get_full_payload::<T>(payload_id)
|
.get_payload_v1::<T>(payload_id)
|
||||||
.await
|
.await
|
||||||
.map(|full_payload| {
|
.map(|full_payload| {
|
||||||
if full_payload.execution_payload.fee_recipient != suggested_fee_recipient {
|
if full_payload.fee_recipient != suggested_fee_recipient {
|
||||||
error!(
|
error!(
|
||||||
self.log(),
|
self.log(),
|
||||||
"Inconsistent fee recipient";
|
"Inconsistent fee recipient";
|
||||||
@ -847,11 +897,11 @@ impl<T: EthSpec> ExecutionLayer<T> {
|
|||||||
indicate that fees are being diverted to another address. Please \
|
indicate that fees are being diverted to another address. Please \
|
||||||
ensure that the value of suggested_fee_recipient is set correctly and \
|
ensure that the value of suggested_fee_recipient is set correctly and \
|
||||||
that the Execution Engine is trusted.",
|
that the Execution Engine is trusted.",
|
||||||
"fee_recipient" => ?full_payload.execution_payload.fee_recipient,
|
"fee_recipient" => ?full_payload.fee_recipient,
|
||||||
"suggested_fee_recipient" => ?suggested_fee_recipient,
|
"suggested_fee_recipient" => ?suggested_fee_recipient,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if f(self, &full_payload.execution_payload).is_some() {
|
if f(self, &full_payload).is_some() {
|
||||||
warn!(
|
warn!(
|
||||||
self.log(),
|
self.log(),
|
||||||
"Duplicate payload cached, this might indicate redundant proposal \
|
"Duplicate payload cached, this might indicate redundant proposal \
|
||||||
|
@ -232,7 +232,7 @@ impl<E: EthSpec> From<BeaconBlockBodyMerge<E, FullPayload<E>>>
|
|||||||
deposits,
|
deposits,
|
||||||
voluntary_exits,
|
voluntary_exits,
|
||||||
sync_aggregate,
|
sync_aggregate,
|
||||||
execution_payload: FullPayload { execution_payload, blobs_bundle },
|
execution_payload: FullPayload { execution_payload },
|
||||||
} = body;
|
} = body;
|
||||||
|
|
||||||
(
|
(
|
||||||
@ -272,7 +272,7 @@ for (
|
|||||||
deposits,
|
deposits,
|
||||||
voluntary_exits,
|
voluntary_exits,
|
||||||
sync_aggregate,
|
sync_aggregate,
|
||||||
execution_payload: FullPayload { execution_payload, blobs_bundle },
|
execution_payload: FullPayload { execution_payload},
|
||||||
blob_kzg_commitments,
|
blob_kzg_commitments,
|
||||||
} = body;
|
} = body;
|
||||||
|
|
||||||
@ -324,7 +324,7 @@ impl<E: EthSpec> BeaconBlockBodyMerge<E, FullPayload<E>> {
|
|||||||
deposits,
|
deposits,
|
||||||
voluntary_exits,
|
voluntary_exits,
|
||||||
sync_aggregate,
|
sync_aggregate,
|
||||||
execution_payload: FullPayload { execution_payload, blobs_bundle },
|
execution_payload: FullPayload { execution_payload },
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
BeaconBlockBodyMerge {
|
BeaconBlockBodyMerge {
|
||||||
@ -356,7 +356,7 @@ impl<E: EthSpec> BeaconBlockBodyEip4844<E, FullPayload<E>> {
|
|||||||
deposits,
|
deposits,
|
||||||
voluntary_exits,
|
voluntary_exits,
|
||||||
sync_aggregate,
|
sync_aggregate,
|
||||||
execution_payload: FullPayload { execution_payload, blobs_bundle },
|
execution_payload: FullPayload { execution_payload },
|
||||||
blob_kzg_commitments,
|
blob_kzg_commitments,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
|
@ -230,8 +230,7 @@ impl<T: EthSpec> Encode for BlindedPayload<T> {
|
|||||||
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
|
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(bound = "T: EthSpec")]
|
#[serde(bound = "T: EthSpec")]
|
||||||
pub struct FullPayload<T: EthSpec> {
|
pub struct FullPayload<T: EthSpec> {
|
||||||
pub execution_payload: ExecutionPayload<T>,
|
pub execution_payload: ExecutionPayload<T>
|
||||||
pub blobs_bundle: Option<BlobsBundle<T>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <T: EthSpec> TestRandom for FullPayload<T> {
|
impl <T: EthSpec> TestRandom for FullPayload<T> {
|
||||||
@ -255,8 +254,7 @@ impl <T: EthSpec> Hash for FullPayload<T> {
|
|||||||
impl<T: EthSpec> From<ExecutionPayload<T>> for FullPayload<T> {
|
impl<T: EthSpec> From<ExecutionPayload<T>> for FullPayload<T> {
|
||||||
fn from(execution_payload: ExecutionPayload<T>) -> Self {
|
fn from(execution_payload: ExecutionPayload<T>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
execution_payload,
|
execution_payload
|
||||||
blobs_bundle: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -294,8 +292,7 @@ impl<T: EthSpec> Decode for FullPayload<T> {
|
|||||||
|
|
||||||
fn from_ssz_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
|
fn from_ssz_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
|
||||||
Ok(FullPayload {
|
Ok(FullPayload {
|
||||||
execution_payload: Decode::from_ssz_bytes(bytes)?,
|
execution_payload: Decode::from_ssz_bytes(bytes)?
|
||||||
blobs_bundle: None,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -304,7 +304,7 @@ impl<E: EthSpec> SignedBeaconBlockMerge<E, BlindedPayload<E>> {
|
|||||||
deposits,
|
deposits,
|
||||||
voluntary_exits,
|
voluntary_exits,
|
||||||
sync_aggregate,
|
sync_aggregate,
|
||||||
execution_payload: FullPayload { execution_payload: execution_payload, blobs_bundle: None },
|
execution_payload: FullPayload { execution_payload },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
signature,
|
signature,
|
||||||
@ -357,7 +357,7 @@ impl<E: EthSpec> SignedBeaconBlockEip4844<E, BlindedPayload<E>> {
|
|||||||
deposits,
|
deposits,
|
||||||
voluntary_exits,
|
voluntary_exits,
|
||||||
sync_aggregate,
|
sync_aggregate,
|
||||||
execution_payload: FullPayload { execution_payload: execution_payload, blobs_bundle: None },
|
execution_payload: FullPayload { execution_payload },
|
||||||
blob_kzg_commitments,
|
blob_kzg_commitments,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user