From fd40954a653b8f3705fed788bc6de6b23893875f Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Thu, 10 Jul 2025 01:57:27 +0100 Subject: [PATCH 1/7] fix(node/p2p): Invalid Blocks Marked as Seen #2361 --- crates/node/p2p/src/gossip/block_validity.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index 8735f45a52..5f57cb2ffc 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -160,15 +160,13 @@ impl BlockHandler { block_hash: envelope.payload.block_hash(), }); } - - seen_hashes_at_height.insert(envelope.payload.block_hash()); - } else { - self.seen_hashes.insert( - envelope.payload.block_number(), - HashSet::from([envelope.payload.block_hash()]), - ); } + self.seen_hashes + .entry(envelope.payload.block_number()) + .or_default() + .insert(envelope.payload.block_hash()); + // CHECK: The signature is valid. let msg = envelope.payload_hash.signature_message(self.rollup_config.l2_chain_id); let block_signer = *self.signer_recv.borrow(); @@ -259,7 +257,7 @@ pub(crate) mod tests { use super::*; use alloy_consensus::{Block, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawal}; - use alloy_primitives::{Address, B256, Bytes, Signature}; + use alloy_primitives::{Address, Bytes, Signature, B256}; use alloy_rlp::BufMut; use alloy_rpc_types_engine::{ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3}; use arbitrary::{Arbitrary, Unstructured}; From ebfd39870eba5303cb8ccceb8c66ff2739745522 Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Thu, 10 Jul 2025 02:01:14 +0100 Subject: [PATCH 2/7] fix(node/p2p): Invalid Blocks Marked as Seen #2361 --- crates/node/p2p/src/gossip/block_validity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index 5f57cb2ffc..fbac938b25 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -257,7 +257,7 @@ pub(crate) mod tests { use super::*; use alloy_consensus::{Block, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawal}; - use alloy_primitives::{Address, Bytes, Signature, B256}; + use alloy_primitives::{Address, B256, Bytes, Signature}; use alloy_rlp::BufMut; use alloy_rpc_types_engine::{ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3}; use arbitrary::{Arbitrary, Unstructured}; From 819a2906370bd1911638275a196d8865b2c466e6 Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Thu, 10 Jul 2025 02:08:40 +0100 Subject: [PATCH 3/7] fix(node/p2p): Invalid Blocks Marked as Seen op-rs#2361 --- crates/node/p2p/src/gossip/block_validity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index fbac938b25..80c8951c81 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -1,4 +1,4 @@ -use std::{collections::HashSet, time::SystemTime}; +use std::time::SystemTime; use alloy_consensus::Block; use alloy_eips::eip7685::EMPTY_REQUESTS_HASH; From 85a17103df21377282002615d93408e58d91c338 Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Thu, 17 Jul 2025 19:15:35 +0100 Subject: [PATCH 4/7] feat: update to check signature before inserting into seen hashes --- crates/node/p2p/src/gossip/block_validity.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index 80c8951c81..57c4fb07b4 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -162,11 +162,6 @@ impl BlockHandler { } } - self.seen_hashes - .entry(envelope.payload.block_number()) - .or_default() - .insert(envelope.payload.block_hash()); - // CHECK: The signature is valid. let msg = envelope.payload_hash.signature_message(self.rollup_config.l2_chain_id); let block_signer = *self.signer_recv.borrow(); @@ -181,6 +176,11 @@ impl BlockHandler { return Err(BlockInvalidError::Signer { expected: msg_signer, received: block_signer }); } + self.seen_hashes + .entry(envelope.payload.block_number()) + .or_default() + .insert(envelope.payload.block_hash()); + // Mark the block as seen. if self.seen_hashes.len() >= Self::SEEN_HASH_CACHE_SIZE { self.seen_hashes.pop_first(); @@ -257,7 +257,7 @@ pub(crate) mod tests { use super::*; use alloy_consensus::{Block, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawal}; - use alloy_primitives::{Address, B256, Bytes, Signature}; + use alloy_primitives::{Address, Bytes, Signature, B256}; use alloy_rlp::BufMut; use alloy_rpc_types_engine::{ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3}; use arbitrary::{Arbitrary, Unstructured}; From 49f39c83ea199f89b5a8e19061488af2ba7c7e25 Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Thu, 17 Jul 2025 19:17:51 +0100 Subject: [PATCH 5/7] feat: fix native check --- crates/node/p2p/src/gossip/block_validity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index 57c4fb07b4..814fdc64a7 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -257,7 +257,7 @@ pub(crate) mod tests { use super::*; use alloy_consensus::{Block, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawal}; - use alloy_primitives::{Address, Bytes, Signature, B256}; + use alloy_primitives::{Address, B256, Bytes, Signature}; use alloy_rlp::BufMut; use alloy_rpc_types_engine::{ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3}; use arbitrary::{Arbitrary, Unstructured}; From c7cf6e131f4018a6f14c8efee6a9dbb917248129 Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Mon, 21 Jul 2025 16:43:23 +0100 Subject: [PATCH 6/7] feat: update test to check if seen hash is empty --- crates/node/p2p/src/gossip/block_validity.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index 814fdc64a7..2e37024854 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -257,7 +257,7 @@ pub(crate) mod tests { use super::*; use alloy_consensus::{Block, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawal}; - use alloy_primitives::{Address, B256, Bytes, Signature}; + use alloy_primitives::{Address, Bytes, Signature, B256}; use alloy_rlp::BufMut; use alloy_rpc_types_engine::{ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3}; use arbitrary::{Arbitrary, Unstructured}; @@ -574,6 +574,7 @@ pub(crate) mod tests { signature_bytes[0] = !signature_bytes[0]; envelope.signature = Signature::from_raw_array(&signature_bytes).unwrap(); + assert!(handler.seen_hashes.is_empty()); assert!(matches!(handler.block_valid(&envelope), Err(BlockInvalidError::Signature))); } From 28adc0d69bee9e47b6f756584ff83fe4839f6eab Mon Sep 17 00:00:00 2001 From: Josh_dfG Date: Mon, 21 Jul 2025 16:45:20 +0100 Subject: [PATCH 7/7] feat: add assertion in test_invalid_signature --- crates/node/p2p/src/gossip/block_validity.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/node/p2p/src/gossip/block_validity.rs b/crates/node/p2p/src/gossip/block_validity.rs index 2e37024854..bdc43ff020 100644 --- a/crates/node/p2p/src/gossip/block_validity.rs +++ b/crates/node/p2p/src/gossip/block_validity.rs @@ -257,7 +257,7 @@ pub(crate) mod tests { use super::*; use alloy_consensus::{Block, EMPTY_OMMER_ROOT_HASH}; use alloy_eips::{eip2718::Encodable2718, eip4895::Withdrawal}; - use alloy_primitives::{Address, Bytes, Signature, B256}; + use alloy_primitives::{Address, B256, Bytes, Signature}; use alloy_rlp::BufMut; use alloy_rpc_types_engine::{ExecutionPayloadV1, ExecutionPayloadV2, ExecutionPayloadV3}; use arbitrary::{Arbitrary, Unstructured};