Merge conflicts

This commit is contained in:
Eitan Seri-Levi
2026-04-30 09:48:04 +02:00
86 changed files with 2835 additions and 1038 deletions

View File

@@ -25,9 +25,9 @@ use tree_hash::TreeHash;
use tree_hash_derive::TreeHash;
use types::{
Blob, ChainSpec, EthSpec, ExecutionBlockHash, ExecutionPayload, ExecutionPayloadBellatrix,
ExecutionPayloadCapella, ExecutionPayloadDeneb, ExecutionPayloadEip7805,
ExecutionPayloadElectra, ExecutionPayloadFulu, ExecutionPayloadGloas, ExecutionPayloadHeader,
ExecutionRequests, ForkName, Hash256, KzgProofs, Transaction, Transactions, Uint256,
ExecutionPayloadCapella, ExecutionPayloadDeneb, ExecutionPayloadElectra, ExecutionPayloadFulu,
ExecutionPayloadGloas, ExecutionPayloadHeader, ExecutionPayloadHeze, ExecutionRequests,
ForkName, Hash256, KzgProofs, Transaction, Transactions, Uint256,
};
const TEST_BLOB_BUNDLE: &[u8] = include_bytes!("fixtures/mainnet/test_blobs_bundle.ssz");
@@ -154,8 +154,8 @@ pub struct ExecutionBlockGenerator<E: EthSpec> {
pub cancun_time: Option<u64>, // deneb
pub prague_time: Option<u64>, // electra
pub osaka_time: Option<u64>, // fulu
pub eip7805_time: Option<u64>, // eip7805
pub amsterdam_time: Option<u64>, // gloas
pub heze_time: Option<u64>, // heze
/*
* deneb stuff
*/
@@ -184,9 +184,9 @@ impl<E: EthSpec> ExecutionBlockGenerator<E> {
shanghai_time: Option<u64>,
cancun_time: Option<u64>,
prague_time: Option<u64>,
eip7805_time: Option<u64>,
osaka_time: Option<u64>,
amsterdam_time: Option<u64>,
heze_time: Option<u64>,
kzg: Option<Arc<Kzg>>,
) -> Self {
let mut generator = Self {
@@ -204,9 +204,9 @@ impl<E: EthSpec> ExecutionBlockGenerator<E> {
shanghai_time,
cancun_time,
prague_time,
eip7805_time,
osaka_time,
amsterdam_time,
heze_time,
blobs_bundles: <_>::default(),
kzg,
rng: make_rng(),
@@ -258,8 +258,9 @@ impl<E: EthSpec> ExecutionBlockGenerator<E> {
pub fn get_fork_at_timestamp(&self, timestamp: u64) -> ForkName {
let forks = [
(self.heze_time, ForkName::Heze),
(self.amsterdam_time, ForkName::Gloas),
(self.eip7805_time, ForkName::Eip7805),
(self.heze_time, ForkName::Heze),
(self.osaka_time, ForkName::Fulu),
(self.prague_time, ForkName::Electra),
(self.cancun_time, ForkName::Deneb),
@@ -758,7 +759,10 @@ impl<E: EthSpec> ExecutionBlockGenerator<E> {
blob_gas_used: 0,
excess_blob_gas: 0,
}),
ForkName::Eip7805 => ExecutionPayload::Eip7805(ExecutionPayloadEip7805 {
_ => unreachable!(),
},
PayloadAttributes::V4(pa) => match self.get_fork_at_timestamp(pa.timestamp) {
ForkName::Gloas => ExecutionPayload::Gloas(ExecutionPayloadGloas {
parent_hash: head_block_hash,
fee_recipient: pa.suggested_fee_recipient,
receipts_root: Hash256::repeat_byte(42),
@@ -769,18 +773,17 @@ impl<E: EthSpec> ExecutionBlockGenerator<E> {
gas_limit: DEFAULT_GAS_LIMIT,
gas_used: GAS_USED,
timestamp: pa.timestamp,
extra_data: mock_el_extra_data::<E>(),
extra_data: "block gen was here".as_bytes().to_vec().try_into().unwrap(),
base_fee_per_gas: Uint256::from(1u64),
block_hash: ExecutionBlockHash::zero(),
transactions: vec![].try_into().unwrap(),
withdrawals: pa.withdrawals.clone().try_into().unwrap(),
blob_gas_used: 0,
excess_blob_gas: 0,
block_access_list: VariableList::empty(),
slot_number: pa.slot_number.into(),
}),
_ => unreachable!(),
},
PayloadAttributes::V4(pa) => match self.get_fork_at_timestamp(pa.timestamp) {
ForkName::Gloas => ExecutionPayload::Gloas(ExecutionPayloadGloas {
ForkName::Heze => ExecutionPayload::Heze(ExecutionPayloadHeze {
parent_hash: head_block_hash,
fee_recipient: pa.suggested_fee_recipient,
receipts_root: Hash256::repeat_byte(42),
@@ -978,8 +981,8 @@ pub fn generate_genesis_header<E: EthSpec>(spec: &ChainSpec) -> Option<Execution
*header.transactions_root_mut() = empty_transactions_root;
Some(header)
}
ForkName::Eip7805 => {
let mut header = ExecutionPayloadHeader::Eip7805(<_>::default());
ForkName::Heze => {
let mut header = ExecutionPayloadHeader::Heze(<_>::default());
*header.block_hash_mut() = genesis_block_hash.unwrap_or_default();
*header.transactions_root_mut() = empty_transactions_root;
Some(header)
@@ -998,6 +1001,14 @@ pub fn generate_genesis_header<E: EthSpec>(spec: &ChainSpec) -> Option<Execution
*header.transactions_root_mut() = empty_transactions_root;
Some(header)
}
ForkName::Heze => {
// TODO(heze): we are using a Fulu header for now, but this gets fixed up by the
// genesis builder anyway which translates it to bid/latest_block_hash.
let mut header = ExecutionPayloadHeader::Fulu(<_>::default());
*header.block_hash_mut() = genesis_block_hash.unwrap_or_default();
*header.transactions_root_mut() = empty_transactions_root;
Some(header)
}
}
}

View File

@@ -127,9 +127,16 @@ pub async fn handle_rpc<E: EthSpec>(
.map(|jep| JsonExecutionPayload::Electra(jep))
})
.map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?,
ENGINE_NEW_PAYLOAD_V5 => get_param::<JsonExecutionPayloadGloas<E>>(params, 0)
.map(|jep| JsonExecutionPayload::Gloas(jep))
.map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?,
ENGINE_NEW_PAYLOAD_V5 => {
// Try Heze first, fall back to Gloas
get_param::<JsonExecutionPayloadHeze<E>>(params, 0)
.map(|jep| JsonExecutionPayload::Heze(jep))
.or_else(|_| {
get_param::<JsonExecutionPayloadGloas<E>>(params, 0)
.map(|jep| JsonExecutionPayload::Gloas(jep))
})
.map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?
}
_ => unreachable!(),
};
@@ -193,7 +200,7 @@ pub async fn handle_rpc<E: EthSpec>(
));
}
}
ForkName::Electra | ForkName::Fulu | ForkName::Eip7805 | ForkName::Gloas => {
ForkName::Electra | ForkName::Fulu | ForkName::Heze | ForkName::Gloas => {
if method == ENGINE_NEW_PAYLOAD_V1
|| method == ENGINE_NEW_PAYLOAD_V2
|| method == ENGINE_NEW_PAYLOAD_V3
@@ -239,6 +246,14 @@ pub async fn handle_rpc<E: EthSpec>(
));
}
}
ForkName::Heze => {
if method != ENGINE_NEW_PAYLOAD_V5 {
return Err((
format!("{} called after Heze fork!", method),
GENERIC_ERROR_CODE,
));
}
}
_ => unreachable!(),
};
@@ -377,6 +392,24 @@ pub async fn handle_rpc<E: EthSpec>(
));
}
// validate method called correctly according to heze fork time
if ctx
.execution_block_generator
.read()
.get_fork_at_timestamp(response.timestamp())
== ForkName::Heze
&& (method == ENGINE_GET_PAYLOAD_V1
|| method == ENGINE_GET_PAYLOAD_V2
|| method == ENGINE_GET_PAYLOAD_V3
|| method == ENGINE_GET_PAYLOAD_V4
|| method == ENGINE_GET_PAYLOAD_V5)
{
return Err((
format!("{} called after Heze fork!", method),
FORK_REQUEST_MISMATCH_ERROR_CODE,
));
}
match method {
ENGINE_GET_PAYLOAD_V1 => Ok(serde_json::to_value(
JsonExecutionPayload::try_from(response).unwrap(),
@@ -466,8 +499,8 @@ pub async fn handle_rpc<E: EthSpec>(
})
.unwrap()
}
JsonExecutionPayload::Eip7805(execution_payload) => {
serde_json::to_value(JsonGetPayloadResponseEip7805 {
JsonExecutionPayload::Heze(execution_payload) => {
serde_json::to_value(JsonGetPayloadResponseHeze {
execution_payload,
block_value: Uint256::from(DEFAULT_MOCK_EL_PAYLOAD_VALUE_WEI),
blobs_bundle: maybe_blobs
@@ -503,6 +536,23 @@ pub async fn handle_rpc<E: EthSpec>(
})
.unwrap()
}
JsonExecutionPayload::Heze(execution_payload) => {
serde_json::to_value(JsonGetPayloadResponseHeze {
execution_payload,
block_value: Uint256::from(DEFAULT_MOCK_EL_PAYLOAD_VALUE_WEI),
blobs_bundle: maybe_blobs
.ok_or((
"No blobs returned despite V6 Payload".to_string(),
GENERIC_ERROR_CODE,
))?
.into(),
should_override_builder: false,
execution_requests: maybe_execution_requests
.unwrap_or_default()
.into(),
})
.unwrap()
}
_ => unreachable!(),
})
}
@@ -649,7 +699,7 @@ pub async fn handle_rpc<E: EthSpec>(
ForkName::Deneb
| ForkName::Electra
| ForkName::Fulu
| ForkName::Eip7805
| ForkName::Heze
| ForkName::Gloas => {
if method == ENGINE_FORKCHOICE_UPDATED_V1 {
return Err((
@@ -672,6 +722,14 @@ pub async fn handle_rpc<E: EthSpec>(
));
}
}
ForkName::Heze => {
if method != ENGINE_FORKCHOICE_UPDATED_V4 {
return Err((
format!("{} called after Heze fork! Use V4.", method),
FORK_REQUEST_MISMATCH_ERROR_CODE,
));
}
}
_ => unreachable!(),
};
}

View File

@@ -30,7 +30,7 @@ use tracing::{debug, error, info, warn};
use tree_hash::TreeHash;
use types::ExecutionBlockHash;
use types::builder::{
BuilderBid, BuilderBidBellatrix, BuilderBidCapella, BuilderBidDeneb, BuilderBidEip7805,
BuilderBid, BuilderBidBellatrix, BuilderBidCapella, BuilderBidDeneb, BuilderBidHeze,
BuilderBidElectra, BuilderBidFulu, SignedBuilderBid,
};
use types::{
@@ -114,7 +114,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.fee_recipient = fee_recipient;
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.fee_recipient = fee_recipient;
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -137,7 +137,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.gas_limit = gas_limit;
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.gas_limit = gas_limit;
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -164,7 +164,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.parent_hash = ExecutionBlockHash::from_root(parent_hash);
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.parent_hash = ExecutionBlockHash::from_root(parent_hash);
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -187,7 +187,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.prev_randao = prev_randao;
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.prev_randao = prev_randao;
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -210,7 +210,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.block_number = block_number;
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.block_number = block_number;
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -233,7 +233,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.timestamp = timestamp;
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.timestamp = timestamp;
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -256,7 +256,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
ExecutionPayloadHeaderRefMut::Electra(header) => {
header.withdrawals_root = withdrawals_root;
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.withdrawals_root = withdrawals_root;
}
ExecutionPayloadHeaderRefMut::Fulu(header) => {
@@ -291,7 +291,7 @@ impl<E: EthSpec> BidStuff<E> for BuilderBid<E> {
header.extra_data = extra_data;
header.block_hash = ExecutionBlockHash::from_root(header.tree_hash_root());
}
ExecutionPayloadHeaderRefMut::Eip7805(header) => {
ExecutionPayloadHeaderRefMut::Heze(header) => {
header.extra_data = extra_data;
header.block_hash = ExecutionBlockHash::from_root(header.tree_hash_root());
}
@@ -493,9 +493,6 @@ impl<E: EthSpec> MockBuilder<E> {
SignedBlindedBeaconBlock::Electra(block) => {
block.message.body.execution_payload.tree_hash_root()
}
SignedBlindedBeaconBlock::Eip7805(block) => {
block.message.body.execution_payload.tree_hash_root()
}
SignedBlindedBeaconBlock::Fulu(block) => {
block.message.body.execution_payload.tree_hash_root()
}
@@ -503,6 +500,10 @@ impl<E: EthSpec> MockBuilder<E> {
// TODO(EIP7732) Check if this is how we want to do error handling for gloas
return Err("invalid fork".to_string());
}
SignedBlindedBeaconBlock::Heze(_) => {
// TODO(EIP7732) Check if this is how we want to do error handling for heze
return Err("invalid fork".to_string());
}
};
let block_hash = block
.message()
@@ -621,6 +622,10 @@ impl<E: EthSpec> MockBuilder<E> {
// TODO(EIP7732) Check if this is how we want to do error handling for gloas
return Err("invalid fork".to_string());
}
ForkName::Heze => {
// TODO(EIP7732) Check if this is how we want to do error handling for heze
return Err("invalid fork".to_string());
}
ForkName::Fulu => BuilderBid::Fulu(BuilderBidFulu {
header: payload
.as_fulu()
@@ -633,9 +638,9 @@ impl<E: EthSpec> MockBuilder<E> {
pubkey: self.builder_sk.public_key().compress(),
execution_requests: maybe_requests.unwrap_or_default(),
}),
ForkName::Eip7805 => BuilderBid::Eip7805(BuilderBidEip7805 {
ForkName::Heze => BuilderBid::Heze(BuilderBidHeze {
header: payload
.as_eip7805()
.as_heze()
.map_err(|_| "incorrect payload variant".to_string())?
.into(),
blob_kzg_commitments: maybe_blobs_bundle
@@ -944,17 +949,15 @@ impl<E: EthSpec> MockBuilder<E> {
None,
None,
),
ForkName::Deneb | ForkName::Electra | ForkName::Fulu | ForkName::Eip7805 => {
PayloadAttributes::new(
timestamp,
*prev_randao,
fee_recipient,
expected_withdrawals,
Some(head_block_root),
None,
)
}
ForkName::Gloas => PayloadAttributes::new(
ForkName::Deneb | ForkName::Electra | ForkName::Fulu => PayloadAttributes::new(
timestamp,
*prev_randao,
fee_recipient,
expected_withdrawals,
Some(head_block_root),
None,
),
ForkName::Gloas | ForkName::Heze => PayloadAttributes::new(
timestamp,
*prev_randao,
fee_recipient,

View File

@@ -37,9 +37,9 @@ impl<E: EthSpec> MockExecutionLayer<E> {
shanghai_time: Option<u64>,
cancun_time: Option<u64>,
prague_time: Option<u64>,
eip7805_time: Option<u64>,
osaka_time: Option<u64>,
amsterdam_time: Option<u64>,
heze_time: Option<u64>,
jwt_key: Option<JwtKey>,
spec: Arc<ChainSpec>,
kzg: Option<Arc<Kzg>>,
@@ -53,9 +53,9 @@ impl<E: EthSpec> MockExecutionLayer<E> {
shanghai_time,
cancun_time,
prague_time,
eip7805_time,
osaka_time,
amsterdam_time,
heze_time,
kzg,
);

View File

@@ -85,9 +85,9 @@ pub struct MockExecutionConfig {
pub shanghai_time: Option<u64>,
pub cancun_time: Option<u64>,
pub prague_time: Option<u64>,
pub eip7805_time: Option<u64>,
pub osaka_time: Option<u64>,
pub amsterdam_time: Option<u64>,
pub heze_time: Option<u64>,
}
impl Default for MockExecutionConfig {
@@ -98,9 +98,9 @@ impl Default for MockExecutionConfig {
shanghai_time: None,
cancun_time: None,
prague_time: None,
eip7805_time: None,
osaka_time: None,
amsterdam_time: None,
heze_time: None,
}
}
}
@@ -120,9 +120,9 @@ impl<E: EthSpec> MockServer<E> {
None, // FIXME(capella): should this be the default?
None, // FIXME(deneb): should this be the default?
None, // FIXME(electra): should this be the default?
None,
None, // FIXME(fulu): should this be the default?
None, // FIXME(gloas): should this be the default?
None, // FIXME(heze): should this be the default?
None,
)
}
@@ -139,9 +139,9 @@ impl<E: EthSpec> MockServer<E> {
shanghai_time,
cancun_time,
prague_time,
eip7805_time,
osaka_time,
amsterdam_time,
heze_time,
} = config;
let last_echo_request = Arc::new(RwLock::new(None));
let preloaded_responses = Arc::new(Mutex::new(vec![]));
@@ -149,9 +149,9 @@ impl<E: EthSpec> MockServer<E> {
shanghai_time,
cancun_time,
prague_time,
eip7805_time,
osaka_time,
amsterdam_time,
heze_time,
kzg,
);
@@ -211,9 +211,9 @@ impl<E: EthSpec> MockServer<E> {
shanghai_time: Option<u64>,
cancun_time: Option<u64>,
prague_time: Option<u64>,
eip7805_time: Option<u64>,
osaka_time: Option<u64>,
amsterdam_time: Option<u64>,
heze_time: Option<u64>,
kzg: Option<Arc<Kzg>>,
) -> Self {
Self::new_with_config(
@@ -224,9 +224,9 @@ impl<E: EthSpec> MockServer<E> {
shanghai_time,
cancun_time,
prague_time,
eip7805_time,
osaka_time,
amsterdam_time,
heze_time,
},
kzg,
)