@@ -71,45 +71,56 @@ func (rh *ReorgHandler) Start() {
71
71
log .Debug ().Msgf ("Reorg handler running" )
72
72
go func () {
73
73
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 )
76
77
if err != nil {
77
- log .Error ().Err (err ).Msg ("Error getting recent block headers " )
78
+ log .Error ().Err (err ).Msg ("Error during reorg handling " )
78
79
continue
79
80
}
80
- if len (blockHeaders ) == 0 {
81
- log .Warn ().Msg ("No block headers found" )
81
+ if mostRecentBlockChecked == nil {
82
82
continue
83
83
}
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 ()))
106
88
}
107
89
}()
108
90
109
91
// Keep the program running (otherwise it will exit)
110
92
select {}
111
93
}
112
94
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
+
113
124
func findReorgEndIndex (reversedBlockHeaders []common.BlockHeader ) (index int ) {
114
125
for i := 0 ; i < len (reversedBlockHeaders )- 1 ; i ++ {
115
126
currentBlock := reversedBlockHeaders [i ]
@@ -129,20 +140,21 @@ func findReorgEndIndex(reversedBlockHeaders []common.BlockHeader) (index int) {
129
140
return - 1
130
141
}
131
142
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 ) {
133
144
newBlocksByNumber , err := rh .getNewBlocksByNumber (reversedBlockHeaders )
134
145
if err != nil {
135
146
return nil , err
136
147
}
137
148
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 ++ {
139
151
blockHeader := reversedBlockHeaders [i ]
140
152
block , ok := (* newBlocksByNumber )[blockHeader .Number .String ()]
141
153
if ! ok {
142
154
return nil , fmt .Errorf ("block not found: %s" , blockHeader .Number .String ())
143
155
}
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 ]
146
158
return previousBlock .Number , nil
147
159
}
148
160
}
@@ -151,7 +163,7 @@ func (rh *ReorgHandler) findForkPoint(reversedBlockHeaders []common.BlockHeader)
151
163
if err != nil {
152
164
return nil , fmt .Errorf ("error getting next headers batch: %w" , err )
153
165
}
154
- return rh .findForkPoint (nextHeadersBatch )
166
+ return rh .findFirstForkedBlockNumber (nextHeadersBatch )
155
167
}
156
168
157
169
func (rh * ReorgHandler ) getNewBlocksByNumber (reversedBlockHeaders []common.BlockHeader ) (* map [string ]common.Block , error ) {
0 commit comments