Skip to content

Commit

Permalink
fix(op): headers above merge (#7622)
Browse files Browse the repository at this point in the history
  • Loading branch information
emhane committed Apr 15, 2024
1 parent 62eb8fd commit ceeb0da
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 6 deletions.
5 changes: 4 additions & 1 deletion crates/consensus/beacon-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ workspace = true
# reth
reth-consensus-common.workspace = true
reth-primitives.workspace = true
reth-interfaces.workspace = true
reth-interfaces.workspace = true

[features]
optimism = ["reth-primitives/optimism"]
23 changes: 18 additions & 5 deletions crates/consensus/beacon-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,27 @@ impl Consensus for BeaconConsensus {
Ok(())
}

#[allow(unused_assignments)]
#[allow(unused_mut)]
fn validate_header_with_total_difficulty(
&self,
header: &Header,
total_difficulty: U256,
) -> Result<(), ConsensusError> {
if self.chain_spec.fork(Hardfork::Paris).active_at_ttd(total_difficulty, header.difficulty)
let mut is_post_merge = self
.chain_spec
.fork(Hardfork::Paris)
.active_at_ttd(total_difficulty, header.difficulty);

#[cfg(feature = "optimism")]
{
if !header.is_zero_difficulty() {
// If OP-Stack then bedrock activation number determines when TTD (eth Merge) has been
// reached.
is_post_merge = self.chain_spec.is_bedrock_active_at_block(header.number);
}

if is_post_merge {
if !self.chain_spec.is_optimism() && !header.is_zero_difficulty() {
return Err(ConsensusError::TheMergeDifficultyIsNotZero)
}

Expand Down Expand Up @@ -94,10 +107,10 @@ impl Consensus for BeaconConsensus {
})
}

// Goerli exception:
// Goerli and early OP exception:
// * If the network is goerli pre-merge, ignore the extradata check, since we do not
// support clique.
if self.chain_spec.chain != Chain::goerli() {
// support clique. Same goes for OP blocks below Bedrock.
if self.chain_spec.chain != Chain::goerli() && !self.chain_spec.is_optimism() {
validate_header_extradata(header)?;
}
}
Expand Down
1 change: 1 addition & 0 deletions crates/consensus/beacon/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,5 @@ optimism = [
"reth-interfaces/optimism",
"reth-provider/optimism",
"reth-blockchain-tree/optimism",
"reth-beacon-consensus-core/optimism"
]
19 changes: 19 additions & 0 deletions crates/primitives/src/chain/spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,12 @@ impl ChainSpec {
self.chain.is_optimism()
}

/// Returns `true` if this chain is Optimism mainnet.
#[inline]
pub fn is_optimism_mainnet(&self) -> bool {
self.chain == Chain::optimism_mainnet()
}

/// Get the genesis block specification.
///
/// To get the header for the genesis block, use [`Self::genesis_header`] instead.
Expand Down Expand Up @@ -779,6 +785,13 @@ impl ChainSpec {
self.fork(Hardfork::Homestead).active_at_block(block_number)
}

/// Convenience method to check if [Hardfork::Bedrock] is active at a given block number.
#[cfg(feature = "optimism")]
#[inline]
pub fn is_bedrock_active_at_block(&self, block_number: u64) -> bool {
self.fork(Hardfork::Bedrock).active_at_block(block_number)
}

/// Creates a [`ForkFilter`] for the block described by [Head].
pub fn fork_filter(&self, head: Head) -> ForkFilter {
let forks = self.forks_iter().filter_map(|(_, condition)| {
Expand Down Expand Up @@ -3176,4 +3189,10 @@ Post-merge hard forks (timestamp based):
BASE_MAINNET.latest_fork_id()
)
}

#[cfg(feature = "optimism")]
#[test]
fn is_bedrock_active() {
assert!(!OP_MAINNET.is_bedrock_active_at_block(1))
}
}

0 comments on commit ceeb0da

Please sign in to comment.