diff --git a/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go b/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go index b79debd7a5..994574c2ad 100644 --- a/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go +++ b/packages/taiko-client/pkg/chain_iterator/block_batch_iterator.go @@ -20,6 +20,7 @@ const ( DefaultBlocksReadPerEpoch = 1000 DefaultRetryInterval = 12 * time.Second DefaultBlockConfirmations = 0 + BackOffMaxRetries = 5 ) var ( @@ -163,7 +164,13 @@ func (i *BlockBatchIterator) Iter() error { return nil } - if err := backoff.Retry(iterOp, backoff.WithContext(backoff.NewConstantBackOff(i.retryInterval), i.ctx)); err != nil { + if err := backoff.Retry( + iterOp, + backoff.WithMaxRetries( + backoff.WithContext(backoff.NewConstantBackOff(i.retryInterval), i.ctx), + BackOffMaxRetries, + ), + ); err != nil { return err } diff --git a/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go b/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go index 5441623c03..4d051780fc 100644 --- a/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go +++ b/packages/taiko-client/pkg/chain_iterator/event_iterator/block_proposed_iterator.go @@ -3,6 +3,7 @@ package eventiterator import ( "context" "errors" + "fmt" "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -110,7 +111,10 @@ func assembleBlockProposedIteratorCallback( updateCurrentFunc chainIterator.UpdateCurrentFunc, endFunc chainIterator.EndIterFunc, ) error { - endHeight := end.Number.Uint64() + var ( + endHeight = end.Number.Uint64() + lastBlockID uint64 + ) log.Debug("Iterating BlockProposed events", "start", start.Number, "end", endHeight) @@ -127,6 +131,20 @@ func assembleBlockProposedIteratorCallback( event := iterOntake.Event log.Debug("Processing BlockProposedV2 event", "block", event.BlockId, "l1BlockHeight", event.Raw.BlockNumber) + if lastBlockID != 0 && event.BlockId.Uint64() != lastBlockID+1 { + log.Warn( + "BlockProposedV2 event is not continuous, rescan the L1 chain", + "fromL1Block", start.Number, + "toL1Block", endHeight, + "lastScannedBlockID", lastBlockID, + "currentScannedBlockID", event.BlockId.Uint64(), + ) + return fmt.Errorf( + "BlockProposedV2 event is not continuous, lastScannedBlockID: %d, currentScannedBlockID: %d", + lastBlockID, event.BlockId.Uint64(), + ) + } + if err := callback(ctx, metadata.NewTaikoDataBlockMetadataOntake(event), eventIter.end); err != nil { log.Warn("Error while processing BlockProposedV2 events, keep retrying", "error", err) return err @@ -145,6 +163,8 @@ func assembleBlockProposedIteratorCallback( log.Debug("Updating current block cursor for processing BlockProposedV2 events", "block", current.Number) + lastBlockID = event.BlockId.Uint64() + updateCurrentFunc(current) }