@@ -56,6 +56,7 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
56
56
}
57
57
58
58
happyCaseLogs := []string {"computed sync actions" }
59
+ noBlocksLogs := []string {"no blocks in state" }
59
60
60
61
type TestCase struct {
61
62
name string
@@ -68,6 +69,7 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
68
69
expected syncActions
69
70
expectedSeqOutOfSync bool
70
71
expectedLogs []string
72
+ preferLocalSafeL2 bool
71
73
}
72
74
73
75
testCases := []TestCase {
@@ -95,10 +97,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
95
97
// although the sequencer has derived up the same
96
98
// L1 block height, it derived fewer safe L2 blocks.
97
99
newSyncStatus : eth.SyncStatus {
98
- HeadL1 : eth.BlockRef {Number : 6 },
99
- CurrentL1 : eth.BlockRef {Number : 1 },
100
- LocalSafeL2 : eth.L2BlockRef {Number : 100 , L1Origin : eth.BlockID {Number : 1 }},
101
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
100
+ HeadL1 : eth.BlockRef {Number : 6 },
101
+ CurrentL1 : eth.BlockRef {Number : 1 },
102
+ SafeL2 : eth.L2BlockRef {Number : 100 , L1Origin : eth.BlockID {Number : 1 }},
103
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
102
104
},
103
105
prevCurrentL1 : eth.BlockRef {Number : 1 },
104
106
blocks : queue.Queue [* types.Block ]{block102 , block103 }, // note absence of block101
@@ -113,10 +115,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
113
115
// This can happen if another batcher instance got some blocks
114
116
// included in the safe chain:
115
117
newSyncStatus : eth.SyncStatus {
116
- HeadL1 : eth.BlockRef {Number : 6 },
117
- CurrentL1 : eth.BlockRef {Number : 2 },
118
- LocalSafeL2 : eth.L2BlockRef {Number : 104 , L1Origin : eth.BlockID {Number : 1 }},
119
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
118
+ HeadL1 : eth.BlockRef {Number : 6 },
119
+ CurrentL1 : eth.BlockRef {Number : 2 },
120
+ SafeL2 : eth.L2BlockRef {Number : 104 , L1Origin : eth.BlockID {Number : 1 }},
121
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
120
122
},
121
123
prevCurrentL1 : eth.BlockRef {Number : 1 },
122
124
blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -131,10 +133,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
131
133
// This can happen if there is an L1 reorg, the safe chain is at an acceptable
132
134
// height but it does not descend from the blocks in state:
133
135
newSyncStatus : eth.SyncStatus {
134
- HeadL1 : eth.BlockRef {Number : 5 },
135
- CurrentL1 : eth.BlockRef {Number : 2 },
136
- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }}, // note hash mismatch
137
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
136
+ HeadL1 : eth.BlockRef {Number : 5 },
137
+ CurrentL1 : eth.BlockRef {Number : 2 },
138
+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }}, // note hash mismatch
139
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
138
140
},
139
141
prevCurrentL1 : eth.BlockRef {Number : 1 },
140
142
blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -149,10 +151,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
149
151
// This could happen if the batcher unexpectedly violates the
150
152
// Holocene derivation rules:
151
153
newSyncStatus : eth.SyncStatus {
152
- HeadL1 : eth.BlockRef {Number : 3 },
153
- CurrentL1 : eth.BlockRef {Number : 2 },
154
- LocalSafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
155
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
154
+ HeadL1 : eth.BlockRef {Number : 3 },
155
+ CurrentL1 : eth.BlockRef {Number : 2 },
156
+ SafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
157
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
156
158
},
157
159
prevCurrentL1 : eth.BlockRef {Number : 1 },
158
160
blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -166,10 +168,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
166
168
{name : "failed to make expected progress (unsafe=safe)" ,
167
169
// Edge case where unsafe = safe
168
170
newSyncStatus : eth.SyncStatus {
169
- HeadL1 : eth.BlockRef {Number : 3 },
170
- CurrentL1 : eth.BlockRef {Number : 2 },
171
- LocalSafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
172
- UnsafeL2 : eth.L2BlockRef {Number : 101 },
171
+ HeadL1 : eth.BlockRef {Number : 3 },
172
+ CurrentL1 : eth.BlockRef {Number : 2 },
173
+ SafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash (), L1Origin : eth.BlockID {Number : 1 }},
174
+ UnsafeL2 : eth.L2BlockRef {Number : 101 },
173
175
},
174
176
prevCurrentL1 : eth.BlockRef {Number : 1 },
175
177
blocks : queue.Queue [* types.Block ]{block102 , block103 },
@@ -185,10 +187,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
185
187
// and we didn't submit or have any txs confirmed since
186
188
// the last sync.
187
189
newSyncStatus : eth.SyncStatus {
188
- HeadL1 : eth.BlockRef {Number : 4 },
189
- CurrentL1 : eth.BlockRef {Number : 1 },
190
- LocalSafeL2 : eth.L2BlockRef {Number : 100 },
191
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
190
+ HeadL1 : eth.BlockRef {Number : 4 },
191
+ CurrentL1 : eth.BlockRef {Number : 1 },
192
+ SafeL2 : eth.L2BlockRef {Number : 100 },
193
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
192
194
},
193
195
prevCurrentL1 : eth.BlockRef {Number : 1 },
194
196
blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -201,10 +203,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
201
203
{name : "no blocks" ,
202
204
// This happens when the batcher is starting up for the first time
203
205
newSyncStatus : eth.SyncStatus {
204
- HeadL1 : eth.BlockRef {Number : 5 },
205
- CurrentL1 : eth.BlockRef {Number : 2 },
206
- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
207
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
206
+ HeadL1 : eth.BlockRef {Number : 5 },
207
+ CurrentL1 : eth.BlockRef {Number : 2 },
208
+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
209
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
208
210
},
209
211
prevCurrentL1 : eth.BlockRef {Number : 1 },
210
212
blocks : queue.Queue [* types.Block ]{},
@@ -217,10 +219,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
217
219
{name : "happy path" ,
218
220
// This happens when the safe chain is being progressed as expected:
219
221
newSyncStatus : eth.SyncStatus {
220
- HeadL1 : eth.BlockRef {Number : 5 },
221
- CurrentL1 : eth.BlockRef {Number : 2 },
222
- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
223
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
222
+ HeadL1 : eth.BlockRef {Number : 5 },
223
+ CurrentL1 : eth.BlockRef {Number : 2 },
224
+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
225
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
224
226
},
225
227
prevCurrentL1 : eth.BlockRef {Number : 1 },
226
228
blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 },
@@ -234,10 +236,10 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
234
236
},
235
237
{name : "happy path + multiple channels" ,
236
238
newSyncStatus : eth.SyncStatus {
237
- HeadL1 : eth.BlockRef {Number : 5 },
238
- CurrentL1 : eth.BlockRef {Number : 2 },
239
- LocalSafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
240
- UnsafeL2 : eth.L2BlockRef {Number : 109 },
239
+ HeadL1 : eth.BlockRef {Number : 5 },
240
+ CurrentL1 : eth.BlockRef {Number : 2 },
241
+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
242
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
241
243
},
242
244
prevCurrentL1 : eth.BlockRef {Number : 1 },
243
245
blocks : queue.Queue [* types.Block ]{block101 , block102 , block103 , block104 },
@@ -251,23 +253,23 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
251
253
},
252
254
{name : "no progress + unsafe=safe" ,
253
255
newSyncStatus : eth.SyncStatus {
254
- HeadL1 : eth.BlockRef {Number : 5 },
255
- CurrentL1 : eth.BlockRef {Number : 2 },
256
- LocalSafeL2 : eth.L2BlockRef {Number : 100 },
257
- UnsafeL2 : eth.L2BlockRef {Number : 100 },
256
+ HeadL1 : eth.BlockRef {Number : 5 },
257
+ CurrentL1 : eth.BlockRef {Number : 2 },
258
+ SafeL2 : eth.L2BlockRef {Number : 100 },
259
+ UnsafeL2 : eth.L2BlockRef {Number : 100 },
258
260
},
259
261
prevCurrentL1 : eth.BlockRef {Number : 1 },
260
262
blocks : queue.Queue [* types.Block ]{},
261
263
channels : []channelStatuser {},
262
264
expected : syncActions {},
263
- expectedLogs : [] string { "no blocks in state" } ,
265
+ expectedLogs : noBlocksLogs ,
264
266
},
265
267
{name : "no progress + unsafe=safe + blocks in state" ,
266
268
newSyncStatus : eth.SyncStatus {
267
- HeadL1 : eth.BlockRef {Number : 5 },
268
- CurrentL1 : eth.BlockRef {Number : 2 },
269
- LocalSafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash ()},
270
- UnsafeL2 : eth.L2BlockRef {Number : 101 },
269
+ HeadL1 : eth.BlockRef {Number : 5 },
270
+ CurrentL1 : eth.BlockRef {Number : 2 },
271
+ SafeL2 : eth.L2BlockRef {Number : 101 , Hash : block101 .Hash ()},
272
+ UnsafeL2 : eth.L2BlockRef {Number : 101 },
271
273
},
272
274
prevCurrentL1 : eth.BlockRef {Number : 1 },
273
275
blocks : queue.Queue [* types.Block ]{block101 },
@@ -277,6 +279,54 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
277
279
},
278
280
expectedLogs : happyCaseLogs ,
279
281
},
282
+ {name : "localSafeL2 > safeL2, preferLocalSafeL2=false" ,
283
+ newSyncStatus : eth.SyncStatus {
284
+ HeadL1 : eth.BlockRef {Number : 5 },
285
+ CurrentL1 : eth.BlockRef {Number : 2 },
286
+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
287
+ LocalSafeL2 : eth.L2BlockRef {Number : 104 , Hash : block104 .Hash ()},
288
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
289
+ },
290
+ prevCurrentL1 : eth.BlockRef {Number : 1 },
291
+ blocks : queue.Queue [* types.Block ]{},
292
+ channels : []channelStatuser {},
293
+ expected : syncActions {
294
+ blocksToLoad : & inclusiveBlockRange {104 , 109 },
295
+ },
296
+ expectedLogs : noBlocksLogs ,
297
+ },
298
+ {name : "localSafeL2 > safeL2, preferLocalSafeL2=true" ,
299
+ preferLocalSafeL2 : true ,
300
+ newSyncStatus : eth.SyncStatus {
301
+ HeadL1 : eth.BlockRef {Number : 5 },
302
+ CurrentL1 : eth.BlockRef {Number : 2 },
303
+ SafeL2 : eth.L2BlockRef {Number : 103 , Hash : block103 .Hash ()},
304
+ LocalSafeL2 : eth.L2BlockRef {Number : 104 , Hash : block104 .Hash ()},
305
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
306
+ },
307
+ prevCurrentL1 : eth.BlockRef {Number : 1 },
308
+ blocks : queue.Queue [* types.Block ]{},
309
+ channels : []channelStatuser {},
310
+ expected : syncActions {
311
+ blocksToLoad : & inclusiveBlockRange {105 , 109 },
312
+ },
313
+ expectedLogs : noBlocksLogs ,
314
+ },
315
+ {name : "LocalSafeL2=0,SafeL2>0" , // This shouldn't ever happen, but has occurred due to bugs
316
+ newSyncStatus : eth.SyncStatus {
317
+ HeadL1 : eth.BlockRef {Number : 5 },
318
+ CurrentL1 : eth.BlockRef {Number : 2 },
319
+ SafeL2 : eth.L2BlockRef {Number : 104 , Hash : block104 .Hash ()},
320
+ UnsafeL2 : eth.L2BlockRef {Number : 109 },
321
+ },
322
+ prevCurrentL1 : eth.BlockRef {Number : 1 },
323
+ blocks : queue.Queue [* types.Block ]{},
324
+ channels : []channelStatuser {},
325
+ expected : syncActions {
326
+ blocksToLoad : & inclusiveBlockRange {105 , 109 },
327
+ },
328
+ expectedLogs : noBlocksLogs ,
329
+ },
280
330
}
281
331
282
332
for _ , tc := range testCases {
@@ -285,7 +335,7 @@ func TestBatchSubmitter_computeSyncActions(t *testing.T) {
285
335
l , h := testlog .CaptureLogger (t , log .LevelDebug )
286
336
287
337
result , outOfSync := computeSyncActions (
288
- tc .newSyncStatus , tc .prevCurrentL1 , tc .blocks , tc .channels , l ,
338
+ tc .newSyncStatus , tc .prevCurrentL1 , tc .blocks , tc .channels , l , tc . preferLocalSafeL2 ,
289
339
)
290
340
291
341
require .Equal (t , tc .expected , result , "unexpected actions" )
0 commit comments