@@ -237,43 +237,73 @@ func (s *SyncMonitor) BlockMetadataByNumber(ctx context.Context, blockNum uint64
237237 return nil , nil
238238}
239239
240+ func (s * SyncMonitor ) getBlockHeaderForFinalityData (
241+ finalityData * arbutil.FinalityData ,
242+ finalityDataType string ,
243+ modifier func (curr * arbutil.FinalityData ) (arbutil.MessageIndex , common.Hash , error ),
244+ ) (* types.Header , error ) {
245+ if finalityData == nil {
246+ return nil , nil
247+ }
248+
249+ msgIdx := finalityData .MsgIdx
250+ blockHash := finalityData .BlockHash
251+
252+ if modifier != nil {
253+ var err error
254+ msgIdx , blockHash , err = modifier (finalityData )
255+ if err != nil {
256+ return nil , err
257+ }
258+ }
259+
260+ blockNumber := s .exec .MessageIndexToBlockNumber (msgIdx )
261+ block := s .exec .bc .GetBlockByNumber (blockNumber )
262+ if block == nil {
263+ log .Debug ("block not found" , "finalityDataType" , finalityDataType , "blockNumber" , blockNumber )
264+ return nil , nil
265+ }
266+ if block .Hash () != blockHash {
267+ errorMsg := fmt .Sprintf (
268+ "block hash mismatch,finalityDataType=%s blockNumber=%v, block hash provided by consensus=%v, block hash from execution=%v" ,
269+ finalityDataType ,
270+ blockNumber ,
271+ blockHash ,
272+ block .Hash (),
273+ )
274+ return nil , errors .New (errorMsg )
275+ }
276+ return block .Header (), nil
277+ }
278+
240279func (s * SyncMonitor ) getFinalityBlockHeader (
241280 waitForBlockValidator bool ,
242281 validatedFinalityData * arbutil.FinalityData ,
243282 finalityFinalityData * arbutil.FinalityData ,
283+ finalityDataType string ,
244284) (* types.Header , error ) {
245285 if finalityFinalityData == nil {
246286 return nil , nil
247287 }
248288
249289 finalityMsgIdx := finalityFinalityData .MsgIdx
250290 finalityBlockHash := finalityFinalityData .BlockHash
251- if waitForBlockValidator {
291+
292+ validatorModifier := func (curr * arbutil.FinalityData ) (arbutil.MessageIndex , common.Hash , error ) {
293+ if ! waitForBlockValidator {
294+ return finalityMsgIdx , finalityBlockHash , nil
295+ }
252296 if validatedFinalityData == nil {
253- return nil , errors .New ("block validator not set" )
297+ return 0 , common. Hash {} , errors .New ("block validator not set" )
254298 }
299+ // If the finalized index is ahead of the validated one, cap it at the validated one
255300 if finalityFinalityData .MsgIdx > validatedFinalityData .MsgIdx {
256- finalityMsgIdx = validatedFinalityData .MsgIdx
257- finalityBlockHash = validatedFinalityData .BlockHash
301+ return validatedFinalityData .MsgIdx , validatedFinalityData .BlockHash , nil
258302 }
303+ return finalityMsgIdx , finalityBlockHash , nil
259304 }
260305
261- finalityBlockNumber := s .exec .MessageIndexToBlockNumber (finalityMsgIdx )
262- finalityBlock := s .exec .bc .GetBlockByNumber (finalityBlockNumber )
263- if finalityBlock == nil {
264- log .Debug ("Finality block not found" , "blockNumber" , finalityBlockNumber )
265- return nil , nil
266- }
267- if finalityBlock .Hash () != finalityBlockHash {
268- errorMsg := fmt .Sprintf (
269- "finality block hash mismatch, blockNumber=%v, block hash provided by consensus=%v, block hash from execution=%v" ,
270- finalityBlockNumber ,
271- finalityBlockHash ,
272- finalityBlock .Hash (),
273- )
274- return nil , errors .New (errorMsg )
275- }
276- return finalityBlock .Header (), nil
306+ return s .getBlockHeaderForFinalityData (finalityFinalityData , finalityDataType , validatorModifier )
277307}
278308
279309func (s * SyncMonitor ) SetFinalityData (
@@ -282,28 +312,42 @@ func (s *SyncMonitor) SetFinalityData(
282312 finalizedFinalityData * arbutil.FinalityData ,
283313 validatedFinalityData * arbutil.FinalityData ,
284314) error {
315+ // Check finalized blocks
285316 finalizedBlockHeader , err := s .getFinalityBlockHeader (
286317 s .config .FinalizedBlockWaitForBlockValidator ,
287318 validatedFinalityData ,
288319 finalizedFinalityData ,
320+ "finalized" ,
289321 )
290322 if err != nil {
291323 return err
292324 }
293325 s .exec .bc .SetFinalized (finalizedBlockHeader )
294326
295- if executionDB != nil && finalizedBlockHeader != nil {
296- finalizedBlockHash := finalizedBlockHeader .Hash ()
297- err := executionDB .Put (ValidatedBlockHashKey , finalizedBlockHash .Bytes ())
327+ // Check validated blocks
328+ validatedBlockHeader , err := s .getBlockHeaderForFinalityData (
329+ validatedFinalityData ,
330+ "validated" ,
331+ nil ,
332+ )
333+ if err != nil {
334+ return err
335+ }
336+
337+ if executionDB != nil && validatedBlockHeader != nil {
338+ validatedBlockHash := validatedBlockHeader .Hash ()
339+ err := executionDB .Put (ValidatedBlockHashKey , validatedBlockHash .Bytes ())
298340 if err != nil {
299341 return err
300342 }
301343 }
302344
345+ // Check safe blocks
303346 safeBlockHeader , err := s .getFinalityBlockHeader (
304347 s .config .SafeBlockWaitForBlockValidator ,
305348 validatedFinalityData ,
306349 safeFinalityData ,
350+ "safe" ,
307351 )
308352 if err != nil {
309353 return err
0 commit comments