From 3580c4de7d6400880f3a4df171ffb42b5000737b Mon Sep 17 00:00:00 2001 From: ron Date: Fri, 12 Jan 2024 01:16:08 +0800 Subject: [PATCH] Reorganize deneb primitives --- parachain/pallets/ethereum-client/src/lib.rs | 6 +- parachain/primitives/beacon/src/deneb.rs | 56 ------------- parachain/primitives/beacon/src/lib.rs | 4 - parachain/primitives/beacon/src/ssz.rs | 83 ++++++++++++++++++++ parachain/primitives/beacon/src/ssz_deneb.rs | 83 -------------------- parachain/primitives/beacon/src/types.rs | 83 ++++++++++++++++++-- 6 files changed, 161 insertions(+), 154 deletions(-) delete mode 100644 parachain/primitives/beacon/src/deneb.rs delete mode 100644 parachain/primitives/beacon/src/ssz_deneb.rs diff --git a/parachain/pallets/ethereum-client/src/lib.rs b/parachain/pallets/ethereum-client/src/lib.rs index de573475a7..743f604273 100644 --- a/parachain/pallets/ethereum-client/src/lib.rs +++ b/parachain/pallets/ethereum-client/src/lib.rs @@ -549,12 +549,10 @@ pub mod pallet { ); // Checks that we don't skip execution headers, they need to be imported sequentially. - let compact_execution_header: CompactExecutionHeader = - update.execution_header.clone().into(); let latest_execution_state: ExecutionHeaderState = Self::latest_execution_state(); ensure!( latest_execution_state.block_number == 0 || - compact_execution_header.block_number == + update.execution_header.block_number() == latest_execution_state.block_number + 1, Error::::ExecutionHeaderSkippedBlock ); @@ -606,7 +604,7 @@ pub mod pallet { Self::store_execution_header( update.execution_header.block_hash(), - compact_execution_header, + update.execution_header.clone().into(), update.header.slot, block_root, ); diff --git a/parachain/primitives/beacon/src/deneb.rs b/parachain/primitives/beacon/src/deneb.rs deleted file mode 100644 index ffbd56155a..0000000000 --- a/parachain/primitives/beacon/src/deneb.rs +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -use crate::CompactExecutionHeader; -use codec::{Decode, Encode}; -use frame_support::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; -use scale_info::TypeInfo; -use sp_core::{H160, H256, U256}; -use sp_std::prelude::*; - -#[cfg(feature = "std")] -use serde::{Deserialize, Serialize}; - -/// ExecutionPayloadHeader -/// https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md#executionpayloadheader -#[derive( - Default, Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo, -)] -#[cfg_attr( - feature = "std", - derive(Serialize, Deserialize), - serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) -)] -#[codec(mel_bound())] -pub struct ExecutionPayloadHeaderDeneb { - pub parent_hash: H256, - pub fee_recipient: H160, - pub state_root: H256, - pub receipts_root: H256, - #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes"))] - pub logs_bloom: Vec, - pub prev_randao: H256, - pub block_number: u64, - pub gas_limit: u64, - pub gas_used: u64, - pub timestamp: u64, - #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes"))] - pub extra_data: Vec, - #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_int_to_u256"))] - pub base_fee_per_gas: U256, - pub block_hash: H256, - pub transactions_root: H256, - pub withdrawals_root: H256, - pub blob_gas_used: u64, // [New in Deneb:EIP4844] - pub excess_blob_gas: u64, // [New in Deneb:EIP4844] -} - -impl From for CompactExecutionHeader { - fn from(execution_payload: ExecutionPayloadHeaderDeneb) -> Self { - Self { - parent_hash: execution_payload.parent_hash, - block_number: execution_payload.block_number, - state_root: execution_payload.state_root, - receipts_root: execution_payload.receipts_root, - } - } -} diff --git a/parachain/primitives/beacon/src/lib.rs b/parachain/primitives/beacon/src/lib.rs index bf0c63411c..4c569d0176 100644 --- a/parachain/primitives/beacon/src/lib.rs +++ b/parachain/primitives/beacon/src/lib.rs @@ -5,11 +5,9 @@ pub mod bits; pub mod bls; pub mod config; -pub mod deneb; pub mod merkle_proof; pub mod receipt; pub mod ssz; -pub mod ssz_deneb; pub mod types; pub mod updates; @@ -30,7 +28,5 @@ pub use bls::{ prepare_aggregate_signature, prepare_g1_pubkeys, AggregatePublicKey, AggregateSignature, BlsError, PublicKeyPrepared, SignaturePrepared, }; -pub use deneb::ExecutionPayloadHeaderDeneb; pub use merkle_proof::verify_merkle_branch; pub use receipt::verify_receipt_proof; -pub use ssz_deneb::SSZExecutionPayloadHeaderDeneb; diff --git a/parachain/primitives/beacon/src/ssz.rs b/parachain/primitives/beacon/src/ssz.rs index 4f8b19ca88..d7db418df7 100644 --- a/parachain/primitives/beacon/src/ssz.rs +++ b/parachain/primitives/beacon/src/ssz.rs @@ -192,3 +192,86 @@ pub fn hash_tree_root(mut object: T) -> Result Err(err.into()), } } + +pub mod deneb { + use crate::{ + config::{EXTRA_DATA_SIZE, FEE_RECIPIENT_SIZE, LOGS_BLOOM_SIZE}, + ssz::hash_tree_root, + types::deneb::ExecutionPayloadHeader, + }; + use byte_slice_cast::AsByteSlice; + use sp_core::H256; + use ssz_rs::{ + prelude::{List, Vector}, + Deserialize, DeserializeError, SimpleSerializeError, Sized, U256, + }; + use ssz_rs_derive::SimpleSerialize as SimpleSerializeDerive; + + #[derive(Default, SimpleSerializeDerive, Clone, Debug)] + pub struct SSZExecutionPayloadHeader { + pub parent_hash: [u8; 32], + pub fee_recipient: Vector, + pub state_root: [u8; 32], + pub receipts_root: [u8; 32], + pub logs_bloom: Vector, + pub prev_randao: [u8; 32], + pub block_number: u64, + pub gas_limit: u64, + pub gas_used: u64, + pub timestamp: u64, + pub extra_data: List, + pub base_fee_per_gas: U256, + pub block_hash: [u8; 32], + pub transactions_root: [u8; 32], + pub withdrawals_root: [u8; 32], + pub blob_gas_used: u64, + pub excess_blob_gas: u64, + } + + impl TryFrom for SSZExecutionPayloadHeader { + type Error = SimpleSerializeError; + + fn try_from(payload: ExecutionPayloadHeader) -> Result { + Ok(SSZExecutionPayloadHeader { + parent_hash: payload.parent_hash.to_fixed_bytes(), + fee_recipient: Vector::::try_from( + payload.fee_recipient.to_fixed_bytes().to_vec(), + ) + .expect("checked statically; qed"), + state_root: payload.state_root.to_fixed_bytes(), + receipts_root: payload.receipts_root.to_fixed_bytes(), + // Logs bloom bytes size is not constrained, so here we do need to check the + // try_from error + logs_bloom: Vector::::try_from(payload.logs_bloom) + .map_err(|(_, err)| err)?, + prev_randao: payload.prev_randao.to_fixed_bytes(), + block_number: payload.block_number, + gas_limit: payload.gas_limit, + gas_used: payload.gas_used, + timestamp: payload.timestamp, + // Extra data bytes size is not constrained, so here we do need to check the + // try_from error + extra_data: List::::try_from(payload.extra_data) + .map_err(|(_, err)| err)?, + base_fee_per_gas: U256::from_bytes_le( + payload + .base_fee_per_gas + .as_byte_slice() + .try_into() + .expect("checked in prep; qed"), + ), + block_hash: payload.block_hash.to_fixed_bytes(), + transactions_root: payload.transactions_root.to_fixed_bytes(), + withdrawals_root: payload.withdrawals_root.to_fixed_bytes(), + blob_gas_used: payload.blob_gas_used, + excess_blob_gas: payload.excess_blob_gas, + }) + } + } + + impl ExecutionPayloadHeader { + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::(self.clone().try_into()?) + } + } +} diff --git a/parachain/primitives/beacon/src/ssz_deneb.rs b/parachain/primitives/beacon/src/ssz_deneb.rs deleted file mode 100644 index aa0bbc96fc..0000000000 --- a/parachain/primitives/beacon/src/ssz_deneb.rs +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -use crate::{ - config::{EXTRA_DATA_SIZE, FEE_RECIPIENT_SIZE, LOGS_BLOOM_SIZE}, - ssz::hash_tree_root, - ExecutionPayloadHeaderDeneb, -}; -use byte_slice_cast::AsByteSlice; -use sp_core::H256; -use sp_std::{vec, vec::Vec}; -use ssz_rs::{ - prelude::{List, Vector}, - Deserialize, DeserializeError, SimpleSerializeError, Sized, U256, -}; -use ssz_rs_derive::SimpleSerialize as SimpleSerializeDerive; - -#[derive(Default, SimpleSerializeDerive, Clone, Debug)] -pub struct SSZExecutionPayloadHeaderDeneb { - pub parent_hash: [u8; 32], - pub fee_recipient: Vector, - pub state_root: [u8; 32], - pub receipts_root: [u8; 32], - pub logs_bloom: Vector, - pub prev_randao: [u8; 32], - pub block_number: u64, - pub gas_limit: u64, - pub gas_used: u64, - pub timestamp: u64, - pub extra_data: List, - pub base_fee_per_gas: U256, - pub block_hash: [u8; 32], - pub transactions_root: [u8; 32], - pub withdrawals_root: [u8; 32], - pub blob_gas_used: u64, - pub excess_blob_gas: u64, -} - -impl TryFrom for SSZExecutionPayloadHeaderDeneb { - type Error = SimpleSerializeError; - - fn try_from(payload: ExecutionPayloadHeaderDeneb) -> Result { - Ok(SSZExecutionPayloadHeaderDeneb { - parent_hash: payload.parent_hash.to_fixed_bytes(), - fee_recipient: Vector::::try_from( - payload.fee_recipient.to_fixed_bytes().to_vec(), - ) - .expect("checked statically; qed"), - state_root: payload.state_root.to_fixed_bytes(), - receipts_root: payload.receipts_root.to_fixed_bytes(), - // Logs bloom bytes size is not constrained, so here we do need to check the try_from - // error - logs_bloom: Vector::::try_from(payload.logs_bloom) - .map_err(|(_, err)| err)?, - prev_randao: payload.prev_randao.to_fixed_bytes(), - block_number: payload.block_number, - gas_limit: payload.gas_limit, - gas_used: payload.gas_used, - timestamp: payload.timestamp, - // Extra data bytes size is not constrained, so here we do need to check the try_from - // error - extra_data: List::::try_from(payload.extra_data) - .map_err(|(_, err)| err)?, - base_fee_per_gas: U256::from_bytes_le( - payload - .base_fee_per_gas - .as_byte_slice() - .try_into() - .expect("checked in prep; qed"), - ), - block_hash: payload.block_hash.to_fixed_bytes(), - transactions_root: payload.transactions_root.to_fixed_bytes(), - withdrawals_root: payload.withdrawals_root.to_fixed_bytes(), - blob_gas_used: payload.blob_gas_used, - excess_blob_gas: payload.excess_blob_gas, - }) - } -} - -impl ExecutionPayloadHeaderDeneb { - pub fn hash_tree_root(&self) -> Result { - hash_tree_root::(self.clone().try_into()?) - } -} diff --git a/parachain/primitives/beacon/src/types.rs b/parachain/primitives/beacon/src/types.rs index 0787e73536..b210fc0d39 100644 --- a/parachain/primitives/beacon/src/types.rs +++ b/parachain/primitives/beacon/src/types.rs @@ -23,11 +23,7 @@ use ssz_rs::SimpleSerializeError; pub use crate::bits::decompress_sync_committee_bits; -use crate::{ - bls::{prepare_g1_pubkeys, prepare_milagro_pubkey, BlsError}, - ssz_deneb::SSZExecutionPayloadHeaderDeneb, - ExecutionPayloadHeaderDeneb, -}; +use crate::bls::{prepare_g1_pubkeys, prepare_milagro_pubkey, BlsError}; use milagro_bls::PublicKey as PublicKeyPrepared; pub type ValidatorIndex = u64; @@ -401,7 +397,7 @@ pub struct CompactBeaconState { #[codec(mel_bound())] pub enum VersionedExecutionPayloadHeader { Capella(ExecutionPayloadHeader), - Deneb(ExecutionPayloadHeaderDeneb), + Deneb(deneb::ExecutionPayloadHeader), } /// Convert VersionedExecutionPayloadHeader to CompactExecutionHeader @@ -424,7 +420,7 @@ impl VersionedExecutionPayloadHeader { execution_payload_header.clone().try_into()?, ), VersionedExecutionPayloadHeader::Deneb(execution_payload_header) => - hash_tree_root::( + hash_tree_root::( execution_payload_header.clone().try_into()?, ), } @@ -438,6 +434,15 @@ impl VersionedExecutionPayloadHeader { execution_payload_header.block_hash, } } + + pub fn block_number(&self) -> u64 { + match self { + VersionedExecutionPayloadHeader::Capella(execution_payload_header) => + execution_payload_header.block_number, + VersionedExecutionPayloadHeader::Deneb(execution_payload_header) => + execution_payload_header.block_number, + } + } } #[cfg(test)] @@ -564,3 +569,67 @@ pub enum Mode { Active, Blocked, } + +pub mod deneb { + use crate::CompactExecutionHeader; + use codec::{Decode, Encode}; + use frame_support::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; + use scale_info::TypeInfo; + #[cfg(feature = "std")] + use serde::{Deserialize, Serialize}; + use sp_core::{H160, H256, U256}; + + /// ExecutionPayloadHeader + /// https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md#executionpayloadheader + #[derive( + Default, Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo, + )] + #[cfg_attr( + feature = "std", + derive(Serialize, Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) + )] + #[codec(mel_bound())] + pub struct ExecutionPayloadHeader { + pub parent_hash: H256, + pub fee_recipient: H160, + pub state_root: H256, + pub receipts_root: H256, + #[cfg_attr( + feature = "std", + serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes") + )] + pub logs_bloom: Vec, + pub prev_randao: H256, + pub block_number: u64, + pub gas_limit: u64, + pub gas_used: u64, + pub timestamp: u64, + #[cfg_attr( + feature = "std", + serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes") + )] + pub extra_data: Vec, + #[cfg_attr( + feature = "std", + serde(deserialize_with = "crate::serde_utils::from_int_to_u256") + )] + pub base_fee_per_gas: U256, + pub block_hash: H256, + pub transactions_root: H256, + pub withdrawals_root: H256, + pub blob_gas_used: u64, // [New in Deneb:EIP4844] + pub excess_blob_gas: u64, // [New in Deneb:EIP4844] + } + + impl From for CompactExecutionHeader { + fn from(execution_payload: ExecutionPayloadHeader) -> Self { + Self { + parent_hash: execution_payload.parent_hash, + block_number: execution_payload.block_number, + state_root: execution_payload.state_root, + receipts_root: execution_payload.receipts_root, + } + } + } +}