@@ -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