Execution requests with prefix (#6801)

* Exclude empty requests and add back prefix

* cleanup

* fix after rebase
This commit is contained in:
Pawan Dhananjay
2025-01-14 07:36:27 +05:30
committed by GitHub
parent 06e4d22d49
commit 93f9c2c718
3 changed files with 99 additions and 37 deletions

View File

@@ -43,10 +43,29 @@ impl<E: EthSpec> ExecutionRequests<E> {
/// Returns the encoding according to EIP-7685 to send
/// to the execution layer over the engine api.
pub fn get_execution_requests_list(&self) -> Vec<Bytes> {
let deposit_bytes = Bytes::from(self.deposits.as_ssz_bytes());
let withdrawal_bytes = Bytes::from(self.withdrawals.as_ssz_bytes());
let consolidation_bytes = Bytes::from(self.consolidations.as_ssz_bytes());
vec![deposit_bytes, withdrawal_bytes, consolidation_bytes]
let mut requests_list = Vec::new();
if !self.deposits.is_empty() {
requests_list.push(Bytes::from_iter(
[RequestType::Deposit.to_u8()]
.into_iter()
.chain(self.deposits.as_ssz_bytes()),
));
}
if !self.withdrawals.is_empty() {
requests_list.push(Bytes::from_iter(
[RequestType::Withdrawal.to_u8()]
.into_iter()
.chain(self.withdrawals.as_ssz_bytes()),
));
}
if !self.consolidations.is_empty() {
requests_list.push(Bytes::from_iter(
[RequestType::Consolidation.to_u8()]
.into_iter()
.chain(self.consolidations.as_ssz_bytes()),
));
}
requests_list
}
/// Generate the execution layer `requests_hash` based on EIP-7685.
@@ -55,9 +74,8 @@ impl<E: EthSpec> ExecutionRequests<E> {
pub fn requests_hash(&self) -> Hash256 {
let mut hasher = DynamicContext::new();
for (i, request) in self.get_execution_requests_list().iter().enumerate() {
for request in self.get_execution_requests_list().iter() {
let mut request_hasher = DynamicContext::new();
request_hasher.update(&[i as u8]);
request_hasher.update(request);
let request_hash = request_hasher.finalize();
@@ -68,16 +86,16 @@ impl<E: EthSpec> ExecutionRequests<E> {
}
}
/// This is used to index into the `execution_requests` array.
/// The prefix types for `ExecutionRequest` objects.
#[derive(Debug, Copy, Clone)]
pub enum RequestPrefix {
pub enum RequestType {
Deposit,
Withdrawal,
Consolidation,
}
impl RequestPrefix {
pub fn from_prefix(prefix: u8) -> Option<Self> {
impl RequestType {
pub fn from_u8(prefix: u8) -> Option<Self> {
match prefix {
0 => Some(Self::Deposit),
1 => Some(Self::Withdrawal),
@@ -85,6 +103,13 @@ impl RequestPrefix {
_ => None,
}
}
pub fn to_u8(&self) -> u8 {
match self {
Self::Deposit => 0,
Self::Withdrawal => 1,
Self::Consolidation => 2,
}
}
}
#[cfg(test)]

View File

@@ -172,7 +172,7 @@ pub use crate::execution_payload_header::{
ExecutionPayloadHeaderDeneb, ExecutionPayloadHeaderElectra, ExecutionPayloadHeaderFulu,
ExecutionPayloadHeaderRef, ExecutionPayloadHeaderRefMut,
};
pub use crate::execution_requests::{ExecutionRequests, RequestPrefix};
pub use crate::execution_requests::{ExecutionRequests, RequestType};
pub use crate::fork::Fork;
pub use crate::fork_context::ForkContext;
pub use crate::fork_data::ForkData;