@@ -47,19 +47,22 @@ export class L2BlockStream {
47
47
const localTips = await this . localData . getL2Tips ( ) ;
48
48
this . log . debug ( `Running L2 block stream` , {
49
49
sourceLatest : sourceTips . latest . number ,
50
- localLatest : localTips . latest ,
50
+ localLatest : localTips . latest . number ,
51
51
sourceFinalized : sourceTips . finalized . number ,
52
- localFinalized : localTips . finalized ,
52
+ localFinalized : localTips . finalized . number ,
53
53
sourceProven : sourceTips . proven . number ,
54
- localProven : localTips . proven ,
54
+ localProven : localTips . proven . number ,
55
55
sourceLatestHash : sourceTips . latest . hash ,
56
+ localLatestHash : localTips . latest . hash ,
56
57
sourceProvenHash : sourceTips . proven . hash ,
58
+ localProvenHash : localTips . proven . hash ,
57
59
sourceFinalizedHash : sourceTips . finalized . hash ,
60
+ localFinalizedHash : localTips . finalized . hash ,
58
61
} ) ;
59
62
60
63
// Check if there was a reorg and emit a chain-pruned event if so.
61
64
let latestBlockNumber = localTips . latest . number ;
62
- while ( ! ( await this . areBlockHashesEqual ( latestBlockNumber , sourceTips . latest ) ) ) {
65
+ while ( ! ( await this . areBlockHashesEqualAt ( latestBlockNumber , { sourceCache : [ sourceTips . latest ] } ) ) ) {
63
66
latestBlockNumber -- ;
64
67
}
65
68
if ( latestBlockNumber < localTips . latest . number ) {
@@ -97,15 +100,19 @@ export class L2BlockStream {
97
100
}
98
101
}
99
102
100
- private async areBlockHashesEqual ( blockNumber : number , sourceLatest : L2BlockId ) {
103
+ /**
104
+ * Returns whether the source and local agree on the block hash at a given height.
105
+ * @param blockNumber - The block number to test.
106
+ * @param args - A cache of data already requested from source, to avoid re-requesting it.
107
+ */
108
+ private async areBlockHashesEqualAt ( blockNumber : number , args : { sourceCache : L2BlockId [ ] } ) {
101
109
if ( blockNumber === 0 ) {
102
110
return true ;
103
111
}
104
112
const localBlockHash = await this . localData . getL2BlockHash ( blockNumber ) ;
105
113
const sourceBlockHash =
106
- sourceLatest . number === blockNumber && sourceLatest . hash
107
- ? sourceLatest . hash
108
- : await this . l2BlockSource . getBlockHeader ( blockNumber ) . then ( h => h ?. hash ( ) . toString ( ) ) ;
114
+ args . sourceCache . find ( id => id . number === blockNumber && id . hash ) ?. hash ??
115
+ ( await this . l2BlockSource . getBlockHeader ( blockNumber ) . then ( h => h ?. hash ( ) . toString ( ) ) ) ;
109
116
this . log . debug ( `Comparing block hashes for block ${ blockNumber } ` , { localBlockHash, sourceBlockHash } ) ;
110
117
return localBlockHash === sourceBlockHash ;
111
118
}
0 commit comments