@@ -71,45 +71,56 @@ func (rh *ReorgHandler) Start() {
7171 log .Debug ().Msgf ("Reorg handler running" )
7272 go func () {
7373 for range ticker .C {
74- lookbackFrom := new (big.Int ).Add (rh .lastCheckedBlock , big .NewInt (int64 (rh .blocksPerScan )))
75- blockHeaders , err := rh .storage .MainStorage .LookbackBlockHeaders (rh .rpc .GetChainID (), rh .blocksPerScan , lookbackFrom )
74+ // need to include lastCheckedBlock to check if next block's parent matches
75+ lookbackFrom := new (big.Int ).Add (rh .lastCheckedBlock , big .NewInt (int64 (rh .blocksPerScan - 1 )))
76+ mostRecentBlockChecked , err := rh .RunFromBlock (lookbackFrom )
7677 if err != nil {
77- log .Error ().Err (err ).Msg ("Error getting recent block headers " )
78+ log .Error ().Err (err ).Msg ("Error during reorg handling " )
7879 continue
7980 }
80- if len (blockHeaders ) == 0 {
81- log .Warn ().Msg ("No block headers found" )
81+ if mostRecentBlockChecked == nil {
8282 continue
8383 }
84- mostRecentBlockHeader := blockHeaders [0 ]
85- reorgEndIndex := findReorgEndIndex (blockHeaders )
86- if reorgEndIndex == - 1 {
87- rh .lastCheckedBlock = mostRecentBlockHeader .Number
88- rh .storage .OrchestratorStorage .SetLastReorgCheckedBlockNumber (rh .rpc .GetChainID (), mostRecentBlockHeader .Number )
89- metrics .ReorgHandlerLastCheckedBlock .Set (float64 (mostRecentBlockHeader .Number .Int64 ()))
90- continue
91- }
92- metrics .ReorgCounter .Inc ()
93- forkPoint , err := rh .findForkPoint (blockHeaders [reorgEndIndex :])
94- if err != nil {
95- log .Error ().Err (err ).Msg ("Error while finding fork point" )
96- continue
97- }
98- err = rh .handleReorg (forkPoint , lookbackFrom )
99- if err != nil {
100- log .Error ().Err (err ).Msg ("Error while handling reorg" )
101- continue
102- }
103- rh .lastCheckedBlock = mostRecentBlockHeader .Number
104- rh .storage .OrchestratorStorage .SetLastReorgCheckedBlockNumber (rh .rpc .GetChainID (), mostRecentBlockHeader .Number )
105- metrics .ReorgHandlerLastCheckedBlock .Set (float64 (mostRecentBlockHeader .Number .Int64 ()))
84+
85+ rh .lastCheckedBlock = mostRecentBlockChecked
86+ rh .storage .OrchestratorStorage .SetLastReorgCheckedBlockNumber (rh .rpc .GetChainID (), mostRecentBlockChecked )
87+ metrics .ReorgHandlerLastCheckedBlock .Set (float64 (mostRecentBlockChecked .Int64 ()))
10688 }
10789 }()
10890
10991 // Keep the program running (otherwise it will exit)
11092 select {}
11193}
11294
95+ func (rh * ReorgHandler ) RunFromBlock (lookbackFrom * big.Int ) (lastCheckedBlock * big.Int , err error ) {
96+ blockHeaders , err := rh .storage .MainStorage .LookbackBlockHeaders (rh .rpc .GetChainID (), rh .blocksPerScan , lookbackFrom )
97+ if err != nil {
98+ return nil , fmt .Errorf ("error getting recent block headers: %w" , err )
99+ }
100+ if len (blockHeaders ) == 0 {
101+ log .Warn ().Msg ("No block headers found during reorg handling" )
102+ return nil , nil
103+ }
104+ mostRecentBlockHeader := blockHeaders [0 ]
105+ reorgEndIndex := findReorgEndIndex (blockHeaders )
106+ log .Debug ().Msgf ("Reorg end index: %d" , reorgEndIndex )
107+ if reorgEndIndex == - 1 {
108+ return mostRecentBlockHeader .Number , nil
109+ }
110+ reorgEndBlock := blockHeaders [reorgEndIndex ].Number
111+ metrics .ReorgCounter .Inc ()
112+ forkPoint , err := rh .findFirstForkedBlockNumber (blockHeaders [reorgEndIndex :])
113+ if err != nil {
114+ return nil , fmt .Errorf ("error while finding fork point: %w" , err )
115+ }
116+ log .Debug ().Msgf ("Fork point: %s" , forkPoint .String ())
117+ err = rh .handleReorg (forkPoint , reorgEndBlock )
118+ if err != nil {
119+ return nil , fmt .Errorf ("error while handling reorg: %w" , err )
120+ }
121+ return mostRecentBlockHeader .Number , nil
122+ }
123+
113124func findReorgEndIndex (reversedBlockHeaders []common.BlockHeader ) (index int ) {
114125 for i := 0 ; i < len (reversedBlockHeaders )- 1 ; i ++ {
115126 currentBlock := reversedBlockHeaders [i ]
@@ -129,20 +140,21 @@ func findReorgEndIndex(reversedBlockHeaders []common.BlockHeader) (index int) {
129140 return - 1
130141}
131142
132- func (rh * ReorgHandler ) findForkPoint (reversedBlockHeaders []common.BlockHeader ) (forkPoint * big.Int , err error ) {
143+ func (rh * ReorgHandler ) findFirstForkedBlockNumber (reversedBlockHeaders []common.BlockHeader ) (forkPoint * big.Int , err error ) {
133144 newBlocksByNumber , err := rh .getNewBlocksByNumber (reversedBlockHeaders )
134145 if err != nil {
135146 return nil , err
136147 }
137148
138- for i := 0 ; i < len (reversedBlockHeaders )- 1 ; i ++ {
149+ // skip first because that is the reorg end block
150+ for i := 1 ; i < len (reversedBlockHeaders ); i ++ {
139151 blockHeader := reversedBlockHeaders [i ]
140152 block , ok := (* newBlocksByNumber )[blockHeader .Number .String ()]
141153 if ! ok {
142154 return nil , fmt .Errorf ("block not found: %s" , blockHeader .Number .String ())
143155 }
144- if block .Hash == blockHeader .Hash {
145- previousBlock := reversedBlockHeaders [i + 1 ]
156+ if blockHeader . ParentHash == block .ParentHash && blockHeader . Hash == block .Hash {
157+ previousBlock := reversedBlockHeaders [i - 1 ]
146158 return previousBlock .Number , nil
147159 }
148160 }
@@ -151,7 +163,7 @@ func (rh *ReorgHandler) findForkPoint(reversedBlockHeaders []common.BlockHeader)
151163 if err != nil {
152164 return nil , fmt .Errorf ("error getting next headers batch: %w" , err )
153165 }
154- return rh .findForkPoint (nextHeadersBatch )
166+ return rh .findFirstForkedBlockNumber (nextHeadersBatch )
155167}
156168
157169func (rh * ReorgHandler ) getNewBlocksByNumber (reversedBlockHeaders []common.BlockHeader ) (* map [string ]common.Block , error ) {
0 commit comments