From 6970f7a19f3e2ab2a9d1fefed554bd46933e281e Mon Sep 17 00:00:00 2001 From: realbigsean Date: Wed, 7 Jun 2023 11:03:49 -0400 Subject: [PATCH] add data gas used and update excess data gas to u64 --- beacon_node/execution_layer/src/block_hash.rs | 8 ++ beacon_node/execution_layer/src/engine_api.rs | 9 +- .../src/engine_api/json_structures.rs | 9 +- beacon_node/execution_layer/src/lib.rs | 1 + .../test_utils/execution_block_generator.rs | 116 +++++++++--------- consensus/types/src/execution_block_header.rs | 8 +- consensus/types/src/execution_payload.rs | 8 +- .../types/src/execution_payload_header.rs | 13 +- 8 files changed, 99 insertions(+), 73 deletions(-) diff --git a/beacon_node/execution_layer/src/block_hash.rs b/beacon_node/execution_layer/src/block_hash.rs index c0bae9af7a..c71482aaf3 100644 --- a/beacon_node/execution_layer/src/block_hash.rs +++ b/beacon_node/execution_layer/src/block_hash.rs @@ -36,6 +36,7 @@ impl ExecutionLayer { None }; + let rlp_data_gas_used = payload.data_gas_used().ok(); let rlp_excess_data_gas = payload.excess_data_gas().ok(); // Construct the block header. @@ -44,6 +45,7 @@ impl ExecutionLayer { KECCAK_EMPTY_LIST_RLP.as_fixed_bytes().into(), rlp_transactions_root, rlp_withdrawals_root, + rlp_data_gas_used.copied(), rlp_excess_data_gas.copied(), ); @@ -84,6 +86,9 @@ pub fn rlp_encode_block_header(header: &ExecutionBlockHeader) -> Vec { if let Some(withdrawals_root) = &header.withdrawals_root { rlp_header_stream.append(withdrawals_root); } + if let Some(data_gas_used) = &header.data_gas_used { + rlp_header_stream.append(data_gas_used); + } if let Some(excess_data_gas) = &header.excess_data_gas { rlp_header_stream.append(excess_data_gas); } @@ -133,6 +138,7 @@ mod test { nonce: Hash64::zero(), base_fee_per_gas: 0x036b_u64.into(), withdrawals_root: None, + data_gas_used: None, excess_data_gas: None, }; let expected_rlp = "f90200a0e0a94a7a3c9617401586b1a27025d2d9671332d22d540e0af72b069170380f2aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794ba5e000000000000000000000000000000000000a0ec3c94b18b8a1cff7d60f8d258ec723312932928626b4c9355eb4ab3568ec7f7a050f738580ed699f0469702c7ccc63ed2e51bc034be9479b7bff4e68dee84accfa029b0562f7140574dd0d50dee8a271b22e1a0a7b78fca58f7c60370d8317ba2a9b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200000188016345785d8a00008301553482079e42a0000000000000000000000000000000000000000000000000000000000000000088000000000000000082036b"; @@ -162,6 +168,7 @@ mod test { nonce: Hash64::zero(), base_fee_per_gas: 0x036b_u64.into(), withdrawals_root: None, + data_gas_used: None, excess_data_gas: None, }; let expected_rlp = "f901fda0927ca537f06c783a3a2635b8805eef1c8c2124f7444ad4a3389898dd832f2dbea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794ba5e000000000000000000000000000000000000a0e97859b065bd8dbbb4519c7cb935024de2484c2b7f881181b4360492f0b06b82a050f738580ed699f0469702c7ccc63ed2e51bc034be9479b7bff4e68dee84accfa029b0562f7140574dd0d50dee8a271b22e1a0a7b78fca58f7c60370d8317ba2a9b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800188016345785d8a00008301553482079e42a0000000000000000000000000000000000000000000000000000000000002000088000000000000000082036b"; @@ -192,6 +199,7 @@ mod test { nonce: Hash64::zero(), base_fee_per_gas: 0x34187b238_u64.into(), withdrawals_root: None, + data_gas_used: None, excess_data_gas: None, }; let expected_hash = diff --git a/beacon_node/execution_layer/src/engine_api.rs b/beacon_node/execution_layer/src/engine_api.rs index 0a5d155f58..3f8674d36e 100644 --- a/beacon_node/execution_layer/src/engine_api.rs +++ b/beacon_node/execution_layer/src/engine_api.rs @@ -189,8 +189,11 @@ pub struct ExecutionBlockWithTransactions { #[superstruct(only(Capella, Deneb))] pub withdrawals: Vec, #[superstruct(only(Deneb))] - #[serde(with = "serde_utils::u256_hex_be")] - pub excess_data_gas: Uint256, + #[serde(with = "serde_utils::u64_hex_be")] + pub data_gas_used: u64, + #[superstruct(only(Deneb))] + #[serde(with = "serde_utils::u64_hex_be")] + pub excess_data_gas: u64, } impl TryFrom> for ExecutionBlockWithTransactions { @@ -267,6 +270,7 @@ impl TryFrom> for ExecutionBlockWithTransactions .into_iter() .map(|withdrawal| withdrawal.into()) .collect(), + data_gas_used: block.data_gas_used, excess_data_gas: block.excess_data_gas, }), }; @@ -509,6 +513,7 @@ impl ExecutionPayloadBodyV1 { block_hash: header.block_hash, transactions: self.transactions, withdrawals, + data_gas_used: header.data_gas_used, excess_data_gas: header.excess_data_gas, })) } else { diff --git a/beacon_node/execution_layer/src/engine_api/json_structures.rs b/beacon_node/execution_layer/src/engine_api/json_structures.rs index d541107d28..d94e707876 100644 --- a/beacon_node/execution_layer/src/engine_api/json_structures.rs +++ b/beacon_node/execution_layer/src/engine_api/json_structures.rs @@ -99,8 +99,11 @@ pub struct JsonExecutionPayload { #[superstruct(only(V2, V3))] pub withdrawals: VariableList, #[superstruct(only(V3))] - #[serde(with = "serde_utils::u256_hex_be")] - pub excess_data_gas: Uint256, + #[serde(with = "serde_utils::u64_hex_be")] + pub data_gas_used: u64, + #[superstruct(only(V3))] + #[serde(with = "serde_utils::u64_hex_be")] + pub excess_data_gas: u64, } impl From> for JsonExecutionPayloadV1 { @@ -172,6 +175,7 @@ impl From> for JsonExecutionPayloadV3 { .map(Into::into) .collect::>() .into(), + data_gas_used: payload.data_gas_used, excess_data_gas: payload.excess_data_gas, } } @@ -256,6 +260,7 @@ impl From> for ExecutionPayloadDeneb { .map(Into::into) .collect::>() .into(), + data_gas_used: payload.data_gas_used, excess_data_gas: payload.excess_data_gas, } } diff --git a/beacon_node/execution_layer/src/lib.rs b/beacon_node/execution_layer/src/lib.rs index 1033c743ee..a02cb78a32 100644 --- a/beacon_node/execution_layer/src/lib.rs +++ b/beacon_node/execution_layer/src/lib.rs @@ -1856,6 +1856,7 @@ impl ExecutionLayer { block_hash: deneb_block.block_hash, transactions: convert_transactions(deneb_block.transactions)?, withdrawals, + data_gas_used: deneb_block.data_gas_used, excess_data_gas: deneb_block.excess_data_gas, }) } diff --git a/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs b/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs index 96514a15ff..15c2c9332c 100644 --- a/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs +++ b/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs @@ -518,67 +518,61 @@ impl ExecutionBlockGenerator { block_hash: ExecutionBlockHash::zero(), transactions: vec![].into(), }), - PayloadAttributes::V2(pa) => { - match self.get_fork_at_timestamp(pa.timestamp) { - ForkName::Merge => ExecutionPayload::Merge(ExecutionPayloadMerge { - parent_hash: forkchoice_state.head_block_hash, - fee_recipient: pa.suggested_fee_recipient, - receipts_root: Hash256::repeat_byte(42), - state_root: Hash256::repeat_byte(43), - logs_bloom: vec![0; 256].into(), - prev_randao: pa.prev_randao, - block_number: parent.block_number() + 1, - gas_limit: GAS_LIMIT, - gas_used: GAS_USED, - timestamp: pa.timestamp, - extra_data: "block gen was here".as_bytes().to_vec().into(), - base_fee_per_gas: Uint256::one(), - block_hash: ExecutionBlockHash::zero(), - transactions: vec![].into(), - }), - ForkName::Capella => { - ExecutionPayload::Capella(ExecutionPayloadCapella { - parent_hash: forkchoice_state.head_block_hash, - fee_recipient: pa.suggested_fee_recipient, - receipts_root: Hash256::repeat_byte(42), - state_root: Hash256::repeat_byte(43), - logs_bloom: vec![0; 256].into(), - prev_randao: pa.prev_randao, - block_number: parent.block_number() + 1, - gas_limit: GAS_LIMIT, - gas_used: GAS_USED, - timestamp: pa.timestamp, - extra_data: "block gen was here".as_bytes().to_vec().into(), - base_fee_per_gas: Uint256::one(), - block_hash: ExecutionBlockHash::zero(), - transactions: vec![].into(), - withdrawals: pa.withdrawals.clone().into(), - }) - } - ForkName::Deneb => { - ExecutionPayload::Deneb(ExecutionPayloadDeneb { - parent_hash: forkchoice_state.head_block_hash, - fee_recipient: pa.suggested_fee_recipient, - receipts_root: Hash256::repeat_byte(42), - state_root: Hash256::repeat_byte(43), - logs_bloom: vec![0; 256].into(), - prev_randao: pa.prev_randao, - block_number: parent.block_number() + 1, - gas_limit: GAS_LIMIT, - gas_used: GAS_USED, - timestamp: pa.timestamp, - extra_data: "block gen was here".as_bytes().to_vec().into(), - base_fee_per_gas: Uint256::one(), - block_hash: ExecutionBlockHash::zero(), - transactions: vec![].into(), - withdrawals: pa.withdrawals.clone().into(), - // FIXME(deneb) maybe this should be set to something? - excess_data_gas: Uint256::one(), - }) - } - _ => unreachable!(), - } - } + PayloadAttributes::V2(pa) => match self.get_fork_at_timestamp(pa.timestamp) { + ForkName::Merge => ExecutionPayload::Merge(ExecutionPayloadMerge { + parent_hash: forkchoice_state.head_block_hash, + fee_recipient: pa.suggested_fee_recipient, + receipts_root: Hash256::repeat_byte(42), + state_root: Hash256::repeat_byte(43), + logs_bloom: vec![0; 256].into(), + prev_randao: pa.prev_randao, + block_number: parent.block_number() + 1, + gas_limit: GAS_LIMIT, + gas_used: GAS_USED, + timestamp: pa.timestamp, + extra_data: "block gen was here".as_bytes().to_vec().into(), + base_fee_per_gas: Uint256::one(), + block_hash: ExecutionBlockHash::zero(), + transactions: vec![].into(), + }), + ForkName::Capella => ExecutionPayload::Capella(ExecutionPayloadCapella { + parent_hash: forkchoice_state.head_block_hash, + fee_recipient: pa.suggested_fee_recipient, + receipts_root: Hash256::repeat_byte(42), + state_root: Hash256::repeat_byte(43), + logs_bloom: vec![0; 256].into(), + prev_randao: pa.prev_randao, + block_number: parent.block_number() + 1, + gas_limit: GAS_LIMIT, + gas_used: GAS_USED, + timestamp: pa.timestamp, + extra_data: "block gen was here".as_bytes().to_vec().into(), + base_fee_per_gas: Uint256::one(), + block_hash: ExecutionBlockHash::zero(), + transactions: vec![].into(), + withdrawals: pa.withdrawals.clone().into(), + }), + ForkName::Deneb => ExecutionPayload::Deneb(ExecutionPayloadDeneb { + parent_hash: forkchoice_state.head_block_hash, + fee_recipient: pa.suggested_fee_recipient, + receipts_root: Hash256::repeat_byte(42), + state_root: Hash256::repeat_byte(43), + logs_bloom: vec![0; 256].into(), + prev_randao: pa.prev_randao, + block_number: parent.block_number() + 1, + gas_limit: GAS_LIMIT, + gas_used: GAS_USED, + timestamp: pa.timestamp, + extra_data: "block gen was here".as_bytes().to_vec().into(), + base_fee_per_gas: Uint256::one(), + block_hash: ExecutionBlockHash::zero(), + transactions: vec![].into(), + withdrawals: pa.withdrawals.clone().into(), + data_gas_used: 0, + excess_data_gas: 0, + }), + _ => unreachable!(), + }, }; match execution_payload.fork_name() { diff --git a/consensus/types/src/execution_block_header.rs b/consensus/types/src/execution_block_header.rs index c0c08795e8..9dca679739 100644 --- a/consensus/types/src/execution_block_header.rs +++ b/consensus/types/src/execution_block_header.rs @@ -26,6 +26,7 @@ use metastruct::metastruct; #[derive(Debug, Clone, PartialEq, Eq, Hash)] #[metastruct(mappings(map_execution_block_header_fields_except_withdrawals(exclude( withdrawals_root, + data_gas_used, excess_data_gas )),))] pub struct ExecutionBlockHeader { @@ -46,7 +47,8 @@ pub struct ExecutionBlockHeader { pub nonce: Hash64, pub base_fee_per_gas: Uint256, pub withdrawals_root: Option, - pub excess_data_gas: Option, + pub data_gas_used: Option, + pub excess_data_gas: Option, } impl ExecutionBlockHeader { @@ -55,7 +57,8 @@ impl ExecutionBlockHeader { rlp_empty_list_root: Hash256, rlp_transactions_root: Hash256, rlp_withdrawals_root: Option, - rlp_excess_data_gas: Option, + rlp_data_gas_used: Option, + rlp_excess_data_gas: Option, ) -> Self { // Most of these field mappings are defined in EIP-3675 except for `mixHash`, which is // defined in EIP-4399. @@ -77,6 +80,7 @@ impl ExecutionBlockHeader { nonce: Hash64::zero(), base_fee_per_gas: payload.base_fee_per_gas(), withdrawals_root: rlp_withdrawals_root, + data_gas_used: rlp_data_gas_used, excess_data_gas: rlp_excess_data_gas, } } diff --git a/consensus/types/src/execution_payload.rs b/consensus/types/src/execution_payload.rs index 448c1bf23e..8aa01830b8 100644 --- a/consensus/types/src/execution_payload.rs +++ b/consensus/types/src/execution_payload.rs @@ -84,9 +84,13 @@ pub struct ExecutionPayload { #[superstruct(only(Capella, Deneb))] pub withdrawals: Withdrawals, #[superstruct(only(Deneb))] - #[serde(with = "serde_utils::quoted_u256")] + #[serde(with = "serde_utils::quoted_u64")] #[superstruct(getter(copy))] - pub excess_data_gas: Uint256, + pub data_gas_used: u64, + #[superstruct(only(Deneb))] + #[serde(with = "serde_utils::quoted_u64")] + #[superstruct(getter(copy))] + pub excess_data_gas: u64, } impl<'a, T: EthSpec> ExecutionPayloadRef<'a, T> { diff --git a/consensus/types/src/execution_payload_header.rs b/consensus/types/src/execution_payload_header.rs index 57381b5327..5cb89f7442 100644 --- a/consensus/types/src/execution_payload_header.rs +++ b/consensus/types/src/execution_payload_header.rs @@ -78,9 +78,13 @@ pub struct ExecutionPayloadHeader { #[superstruct(getter(copy))] pub withdrawals_root: Hash256, #[superstruct(only(Deneb))] - #[serde(with = "serde_utils::quoted_u256")] + #[serde(with = "serde_utils::quoted_u64")] #[superstruct(getter(copy))] - pub excess_data_gas: Uint256, + pub data_gas_used: u64, + #[superstruct(only(Deneb))] + #[serde(with = "serde_utils::quoted_u64")] + #[superstruct(getter(copy))] + pub excess_data_gas: u64, } impl ExecutionPayloadHeader { @@ -151,8 +155,8 @@ impl ExecutionPayloadHeaderCapella { block_hash: self.block_hash, transactions_root: self.transactions_root, withdrawals_root: self.withdrawals_root, - // TODO: verify if this is correct - excess_data_gas: Uint256::zero(), + data_gas_used: 0, + excess_data_gas: 0, } } } @@ -217,6 +221,7 @@ impl<'a, T: EthSpec> From<&'a ExecutionPayloadDeneb> for ExecutionPayloadHead block_hash: payload.block_hash, transactions_root: payload.transactions.tree_hash_root(), withdrawals_root: payload.withdrawals.tree_hash_root(), + data_gas_used: payload.data_gas_used, excess_data_gas: payload.excess_data_gas, } }