Skip to content

Commit 4aaf7a9

Browse files
committed
improve logic
1 parent 2b485b8 commit 4aaf7a9

1 file changed

Lines changed: 48 additions & 42 deletions

File tree

crates/network/src/manager.rs

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,6 @@ impl<
218218
return;
219219
}
220220

221-
// Compute the block hash.
222221
let hash = block.block.hash_slow();
223222

224223
let peers = match self.inner_network_handle.get_all_peers().await {
@@ -230,31 +229,10 @@ impl<
230229
};
231230

232231
// TODO: remove this once we deprecate l2geth.
233-
// Determine if we should announce via eth wire
234-
let should_announce_eth_wire = if let Some(authorized_signer) = self.authorized_signer {
235-
// Only announce if the block signature matches the authorized signer
236-
let sig_hash = sig_encode_hash(&block.block.header);
237-
if let Ok(signature) = Signature::from_raw(&block.signature) {
238-
if let Ok(recovered_signer) =
239-
reth_primitives_traits::crypto::secp256k1::recover_signer(&signature, sig_hash)
240-
{
241-
authorized_signer == recovered_signer
242-
} else {
243-
false
244-
}
245-
} else {
246-
false
247-
}
248-
} else {
249-
// If no authorized signer is set, always announce
250-
true
251-
};
252-
let eth_wire_new_block = {
253-
let td = compute_td(self.td_constant, block.block.header.number);
254-
let mut eth_wire_block = block.block.clone();
255-
eth_wire_block.header.extra_data = block.signature.clone().into();
256-
EthWireNewBlock { block: eth_wire_block, td }
257-
};
232+
let should_announce_eth_wire = self.verify_block_signature(&block);
233+
234+
// Lazily build eth-wire block only if needed
235+
let mut eth_wire_new_block = None;
258236

259237
for peer in peers {
260238
// Skip peers that have already seen this block
@@ -267,27 +245,55 @@ impl<
267245
continue;
268246
}
269247

270-
if peer
271-
.capabilities
272-
.capabilities()
273-
.iter()
274-
.any(|cap| cap == &ScrollMessage::capability())
275-
{
248+
// Announce via scroll-wire if peer supports it
249+
if self.peer_supports_scroll_wire(&peer) {
276250
trace!(target: "scroll::network::manager", peer_id = %peer.remote_id, block_number = %block.block.header.number, block_hash = %hash, "Announcing new block to peer via scroll-wire");
277251
self.scroll_wire.announce_block(peer.remote_id, &block);
278-
} else {
279-
if should_announce_eth_wire {
280-
trace!(target: "scroll::network::manager", peer_id = %peer.remote_id, block_number = %block.block.header.number, block_hash = %hash, "Announcing new block to peer via eth-wire");
281-
self.inner_network_handle.eth_wire_announce_block_to(
282-
peer.remote_id,
283-
eth_wire_new_block.clone(),
284-
hash,
285-
);
286-
}
287-
};
252+
} else if should_announce_eth_wire {
253+
// Build eth-wire block on first use
254+
let eth_wire_block = eth_wire_new_block.get_or_insert_with(|| {
255+
let td = compute_td(self.td_constant, block.block.header.number);
256+
let mut eth_wire_block = block.block.clone();
257+
eth_wire_block.header.extra_data = block.signature.clone().into();
258+
EthWireNewBlock { block: eth_wire_block, td }
259+
});
260+
261+
trace!(target: "scroll::network::manager", peer_id = %peer.remote_id, block_number = %block.block.header.number, block_hash = %hash, "Announcing new block to peer via eth-wire");
262+
self.inner_network_handle.eth_wire_announce_block_to(
263+
peer.remote_id,
264+
eth_wire_block.clone(),
265+
hash,
266+
);
267+
}
288268
}
289269
}
290270

271+
/// Checks if a peer supports the scroll-wire protocol.
272+
fn peer_supports_scroll_wire(&self, peer: &reth_network_api::PeerInfo) -> bool {
273+
peer.capabilities.capabilities().iter().any(|cap| cap == &ScrollMessage::capability())
274+
}
275+
276+
/// Verifies the block signature against the authorized signer.
277+
///
278+
/// Returns true if the signature is valid or if no authorized signer is configured.
279+
fn verify_block_signature(&self, block: &NewBlock) -> bool {
280+
let Some(authorized_signer) = self.authorized_signer else {
281+
return true;
282+
};
283+
284+
let sig_hash = sig_encode_hash(&block.block.header);
285+
let Ok(signature) = Signature::from_raw(&block.signature) else {
286+
return false;
287+
};
288+
let Ok(recovered_signer) =
289+
reth_primitives_traits::crypto::secp256k1::recover_signer(&signature, sig_hash)
290+
else {
291+
return false;
292+
};
293+
294+
authorized_signer == recovered_signer
295+
}
296+
291297
/// Handler for received events from the [`ScrollWireManager`].
292298
fn on_scroll_wire_event(
293299
&mut self,

0 commit comments

Comments
 (0)