@@ -10,10 +10,11 @@ use reth_network::{
1010use reth_node_api:: TxTy ;
1111use reth_node_builder:: { components:: NetworkBuilder , BuilderContext , FullNodeTypes } ;
1212use reth_node_types:: NodeTypes ;
13- use reth_primitives_traits:: BlockHeader ;
13+ use reth_primitives_traits:: { BlockHeader , Header } ;
1414use reth_scroll_chainspec:: ScrollChainSpec ;
1515use reth_scroll_primitives:: ScrollPrimitives ;
1616use reth_transaction_pool:: { PoolTransaction , TransactionPool } ;
17+ use rollup_node_primitives:: sig_encode_hash;
1718use rollup_node_signer:: SignatureAsBytes ;
1819use scroll_alloy_hardforks:: ScrollHardforks ;
1920use scroll_db:: { Database , DatabaseOperations } ;
@@ -165,13 +166,14 @@ impl<H: BlockHeader, ChainSpec: EthChainSpec + ScrollHardforks + Debug + Send +
165166 if !self . chain_spec . is_euclid_v2_active_at_timestamp ( header. timestamp ( ) ) {
166167 return header;
167168 }
169+
168170 // TODO: remove this once we deprecated l2geth
169171 // Validate and process signature
170-
171172 if let Err ( err) = self . validate_and_store_signature ( & mut header, self . signer ) {
172173 debug ! (
173174 target: "scroll::network::response_header_transform" ,
174- "Header signature persistence failed, header hash: {:?}, error: {}" ,
175+ "Header signature persistence failed, block number: {:?}, header hash: {:?}, error: {}" ,
176+ header. number( ) ,
175177 header. hash_slow( ) , err
176178 ) ;
177179 }
@@ -190,7 +192,7 @@ impl<ChainSpec: ScrollHardforks + Debug + Send + Sync> ScrollHeaderTransform<Cha
190192 let signature = parse_65b_signature ( & signature_bytes) ?;
191193
192194 // Recover and verify signer
193- recover_and_verify_signer ( & signature, header. hash_slow ( ) , authorized_signer) ?;
195+ recover_and_verify_signer ( & signature, header, authorized_signer) ?;
194196
195197 // Store signature in database
196198 persist_signature ( self . db . clone ( ) , header. hash_slow ( ) , signature) ;
@@ -231,15 +233,17 @@ impl<H: BlockHeader, ChainSpec: EthChainSpec + ScrollHardforks + Debug + Send +
231233 }
232234
233235 // read the signature from the rollup node.
234- let block_hash = header. hash_slow ( ) ;
236+ let hash = header. hash_slow ( ) ;
237+
235238 let signature = self
236239 . db
237- . get_signature ( block_hash )
240+ . get_signature ( hash )
238241 . await
239242 . inspect_err ( |e| {
240243 warn ! ( target: "scroll::network::request_header_transform" ,
241- "Failed to get block signature from database, header hash: {:?}, error: {}" ,
242- header. hash_slow( ) ,
244+ "Failed to get block signature from database, block number: {:?}, header hash: {:?}, error: {}" ,
245+ header. number( ) ,
246+ hash,
243247 HeaderTransformError :: DatabaseError ( e. to_string( ) )
244248 )
245249 } )
@@ -249,32 +253,42 @@ impl<H: BlockHeader, ChainSpec: EthChainSpec + ScrollHardforks + Debug + Send +
249253 // If we have a signature in the database and it matches configured signer then add it
250254 // to the extra data field
251255 if let Some ( sig) = signature {
252- if let Err ( err) = recover_and_verify_signer ( & sig, header. hash_slow ( ) , self . signer ) {
256+ if let Err ( err) = recover_and_verify_signer ( & sig, & header, self . signer ) {
253257 warn ! (
254258 target: "scroll::network::request_header_transform" ,
255- "Found invalid signature(different from the hardcoded signer) for header hash: {:?}, sig: {:?}, error: {}" ,
256- header. hash_slow( ) ,
259+ "Found invalid signature(different from the hardcoded signer={:?}) for block number: {:?}, header hash: {:?}, sig: {:?}, error: {}" ,
260+ self . signer,
261+ header. number( ) ,
262+ hash,
257263 sig. to_string( ) ,
258264 err
259265 ) ;
260266 } else {
261267 * header. extra_data_mut ( ) = sig. sig_as_bytes ( ) . into ( ) ;
262268 }
269+ } else {
270+ debug ! (
271+ target: "scroll::network::request_header_transform" ,
272+ "No signature found in database for block number: {:?}, header hash: {:?}" ,
273+ header. number( ) ,
274+ hash,
275+ ) ;
263276 }
264277
265278 header
266279 }
267280}
268281
269282/// Recover signer from signature and verify authorization.
270- fn recover_and_verify_signer (
283+ fn recover_and_verify_signer < H : BlockHeader > (
271284 signature : & Signature ,
272- hash : B256 ,
285+ header : & H ,
273286 authorized_signer : Option < Address > ,
274287) -> Result < Address , HeaderTransformError > {
288+ let hash = sig_encode_hash ( & header_to_alloy ( header) ) ;
289+
275290 // Recover signer from signature
276- let signer = signature
277- . recover_address_from_prehash ( & hash)
291+ let signer = reth_primitives_traits:: crypto:: secp256k1:: recover_signer ( signature, hash)
278292 . map_err ( |_| HeaderTransformError :: RecoveryFailed ) ?;
279293
280294 // Verify signer is authorized
@@ -310,3 +324,30 @@ fn persist_signature(db: Arc<Database>, hash: B256, signature: Signature) {
310324 }
311325 } ) ;
312326}
327+
328+ /// Convert a generic `BlockHeader` to `alloy_consensus::Header`
329+ fn header_to_alloy < H : BlockHeader > ( header : & H ) -> Header {
330+ Header {
331+ parent_hash : header. parent_hash ( ) ,
332+ ommers_hash : header. ommers_hash ( ) ,
333+ beneficiary : header. beneficiary ( ) ,
334+ state_root : header. state_root ( ) ,
335+ transactions_root : header. transactions_root ( ) ,
336+ receipts_root : header. receipts_root ( ) ,
337+ logs_bloom : header. logs_bloom ( ) ,
338+ difficulty : header. difficulty ( ) ,
339+ number : header. number ( ) ,
340+ gas_limit : header. gas_limit ( ) ,
341+ gas_used : header. gas_used ( ) ,
342+ timestamp : header. timestamp ( ) ,
343+ extra_data : header. extra_data ( ) . clone ( ) ,
344+ mix_hash : header. mix_hash ( ) . unwrap_or_default ( ) ,
345+ nonce : header. nonce ( ) . unwrap_or_default ( ) ,
346+ base_fee_per_gas : header. base_fee_per_gas ( ) ,
347+ withdrawals_root : header. withdrawals_root ( ) ,
348+ blob_gas_used : header. blob_gas_used ( ) ,
349+ excess_blob_gas : header. excess_blob_gas ( ) ,
350+ parent_beacon_block_root : header. parent_beacon_block_root ( ) ,
351+ requests_hash : header. requests_hash ( ) ,
352+ }
353+ }
0 commit comments