Skip to content
This repository was archived by the owner on Dec 5, 2021. It is now read-only.

Commit a75f05b

Browse files
fix[dtl]: fix dtl bug breaking verifiers (ethereum-optimism#1011)
* fix[dtl]: fix dtl bug breaking verifiers * tweaks so tests pass * chore: add changeset
1 parent e3dc90c commit a75f05b

11 files changed

Lines changed: 66 additions & 19 deletions

File tree

.changeset/quick-pandas-laugh.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@eth-optimism/data-transport-layer': patch
3+
---
4+
5+
Fixes a bug that prevented verifiers from syncing properly with the DTL

packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
import {
2121
SEQUENCER_ENTRYPOINT_ADDRESS,
2222
SEQUENCER_GAS_LIMIT,
23+
parseSignatureVParam,
2324
} from '../../../utils'
2425

2526
export const handleEventsSequencerBatchAppended: EventHandlerSet<
@@ -76,7 +77,7 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet<
7677
batchExtraData: batchSubmissionEvent.args._extraData,
7778
}
7879
},
79-
parseEvent: (event, extraData) => {
80+
parseEvent: (event, extraData, l2ChainId) => {
8081
const transactionEntries: TransactionEntry[] = []
8182

8283
// It's easier to deal with this data if it's a Buffer.
@@ -103,7 +104,8 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet<
103104
)
104105

105106
const decoded = maybeDecodeSequencerBatchTransaction(
106-
sequencerTransaction
107+
sequencerTransaction,
108+
l2ChainId
107109
)
108110

109111
transactionEntries.push({
@@ -234,7 +236,8 @@ const parseSequencerBatchTransaction = (
234236
}
235237

236238
const maybeDecodeSequencerBatchTransaction = (
237-
transaction: Buffer
239+
transaction: Buffer,
240+
l2ChainId: number
238241
): DecodedSequencerBatchTransaction | null => {
239242
try {
240243
const decodedTx = ethers.utils.parseTransaction(transaction)
@@ -247,7 +250,7 @@ const maybeDecodeSequencerBatchTransaction = (
247250
target: toHexString(decodedTx.to), // Maybe null this out for creations?
248251
data: toHexString(decodedTx.data),
249252
sig: {
250-
v: BigNumber.from(decodedTx.v).toNumber(),
253+
v: parseSignatureVParam(decodedTx.v, l2ChainId),
251254
r: toHexString(decodedTx.r),
252255
s: toHexString(decodedTx.s),
253256
},

packages/data-transport-layer/src/services/l1-ingestion/service.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { fromHexString, EventArgsAddressSet } from '@eth-optimism/core-utils'
33
import { BaseService } from '@eth-optimism/common-ts'
44
import { JsonRpcProvider } from '@ethersproject/providers'
55
import { LevelUp } from 'levelup'
6+
import { ethers, constants } from 'ethers'
67

78
/* Imports: Internal */
89
import { TransportDB } from '../../db/transport-db'
@@ -18,7 +19,6 @@ import { handleEventsTransactionEnqueued } from './handlers/transaction-enqueued
1819
import { handleEventsSequencerBatchAppended } from './handlers/sequencer-batch-appended'
1920
import { handleEventsStateBatchAppended } from './handlers/state-batch-appended'
2021
import { L1DataTransportServiceOptions } from '../main/service'
21-
import { constants } from 'ethers'
2222

2323
export interface L1IngestionServiceOptions
2424
extends L1DataTransportServiceOptions {
@@ -65,6 +65,7 @@ export class L1IngestionService extends BaseService<L1IngestionServiceOptions> {
6565
contracts: OptimismContracts
6666
l1RpcProvider: JsonRpcProvider
6767
startingL1BlockNumber: number
68+
l2ChainId: number
6869
} = {} as any
6970

7071
protected async _init(): Promise<void> {
@@ -114,6 +115,10 @@ export class L1IngestionService extends BaseService<L1IngestionServiceOptions> {
114115
this.options.addressManager
115116
)
116117

118+
this.state.l2ChainId = ethers.BigNumber.from(
119+
await this.state.contracts.OVM_ExecutionManager.ovmCHAINID()
120+
).toNumber()
121+
117122
const startingL1BlockNumber = await this.state.db.getStartingL1Block()
118123
if (startingL1BlockNumber) {
119124
this.state.startingL1BlockNumber = startingL1BlockNumber
@@ -295,7 +300,11 @@ export class L1IngestionService extends BaseService<L1IngestionServiceOptions> {
295300
event,
296301
this.state.l1RpcProvider
297302
)
298-
const parsedEvent = await handlers.parseEvent(event, extraData)
303+
const parsedEvent = await handlers.parseEvent(
304+
event,
305+
extraData,
306+
this.state.l2ChainId
307+
)
299308
await handlers.storeEvent(parsedEvent, this.state.db)
300309
}
301310

packages/data-transport-layer/src/services/l2-ingestion/handlers/transaction.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
padHexString,
1414
SEQUENCER_ENTRYPOINT_ADDRESS,
1515
SEQUENCER_GAS_LIMIT,
16+
parseSignatureVParam,
1617
} from '../../../utils'
1718

1819
export const handleSequencerBlock = {
@@ -43,7 +44,7 @@ export const handleSequencerBlock = {
4344
if (transaction.queueOrigin === 'sequencer') {
4445
const decodedTransaction: DecodedSequencerBatchTransaction = {
4546
sig: {
46-
v: BigNumber.from(transaction.v).toNumber() - 2 * chainId - 35,
47+
v: parseSignatureVParam(transaction.v, chainId),
4748
r: padHexString(transaction.r, 32),
4849
s: padHexString(transaction.s, 32),
4950
},

packages/data-transport-layer/src/types/event-handler-types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ export type GetExtraDataHandler<TEventArgs, TExtraData> = (
2020

2121
export type ParseEventHandler<TEventArgs, TExtraData, TParsedEvent> = (
2222
event: TypedEthersEvent<TEventArgs>,
23-
extraData: TExtraData
23+
extraData: TExtraData,
24+
l2ChainId: number
2425
) => TParsedEvent
2526

2627
export type StoreEventHandler<TParsedEvent> = (
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/* Imports: External */
2+
import { ethers } from 'ethers'
3+
4+
export const parseSignatureVParam = (
5+
v: number | ethers.BigNumber,
6+
chainId: number
7+
): number => {
8+
return ethers.BigNumber.from(v).toNumber() - 2 * chainId - 35
9+
}

packages/data-transport-layer/src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './common'
22
export * from './constants'
33
export * from './contracts'
44
export * from './validation'
5+
export * from './eth-tx'

packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/sequencer-batch-appended.spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { BigNumber, ethers } from 'ethers'
2+
3+
/* Imports: Internal */
24
import { expect } from '../../../../setup'
35
import { handleEventsSequencerBatchAppended } from '../../../../../src/services/l1-ingestion/handlers/sequencer-batch-appended'
46
import { SequencerBatchAppendedExtraData } from '../../../../../src/types'
5-
import { l1TransactionData } from '../../../examples/l1-data'
6-
import { blocksOnL2 } from '../../../examples/l2-data'
77

88
describe('Event Handlers: OVM_CanonicalTransactionChain.SequencerBatchAppended', () => {
99
describe('handleEventsSequencerBatchAppended.parseEvent', () => {
@@ -28,7 +28,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.SequencerBatchAppended',
2828
}
2929

3030
it('should error on malformed transaction data', async () => {
31-
const input1: [any, SequencerBatchAppendedExtraData] = [
31+
const input1: [any, SequencerBatchAppendedExtraData, number] = [
3232
{
3333
args: {
3434
_startingQueueIndex: ethers.constants.Zero,
@@ -40,6 +40,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.SequencerBatchAppended',
4040
l1TransactionData: '0x00000',
4141
...exampleExtraData,
4242
},
43+
0,
4344
]
4445

4546
expect(() => {

packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/state-batch-appended.spec.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import { expect } from '../../../../setup'
2+
3+
/* Imports: External */
14
import { BigNumber } from 'ethers'
25
import { Block } from '@ethersproject/abstract-provider'
36

4-
import { expect } from '../../../../setup'
7+
/* Imports: Internal */
58
import { handleEventsStateBatchAppended } from '../../../../../src/services/l1-ingestion/handlers/state-batch-appended'
69
import { StateBatchAppendedExtraData } from '../../../../../src/types'
710
import { l1StateBatchData } from '../../../examples/l1-data'
@@ -73,7 +76,11 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.StateBatchAppended', ()
7376
l1TransactionHash:
7477
'0x4ca72484e93cdb50fe1089984db152258c2bbffc2534dcafbfe032b596bd5b49',
7578
}
76-
const input1: [any, StateBatchAppendedExtraData] = [event, extraData]
79+
const input1: [any, StateBatchAppendedExtraData, number] = [
80+
event,
81+
extraData,
82+
0,
83+
]
7784

7885
const output1 = handleEventsStateBatchAppended.parseEvent(...input1)
7986

packages/data-transport-layer/test/unit-tests/services/l1-ingestion/handlers/transaction-enqueued.spec.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import { expect } from '../../../../setup'
2+
3+
/* Imports: External */
14
import { ethers, BigNumber } from 'ethers'
25

3-
import { expect } from '../../../../setup'
6+
/* Imports: Internal */
47
import { handleEventsTransactionEnqueued } from '../../../../../src/services/l1-ingestion/handlers/transaction-enqueued'
58

69
const MAX_ITERATIONS = 128
@@ -22,7 +25,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
2225
// but it's probably better to get wider test coverage first.
2326

2427
it('should have a ctcIndex equal to null', () => {
25-
const input1: [any, any] = [
28+
const input1: [any, any, number] = [
2629
{
2730
blockNumber: 0,
2831
args: {
@@ -32,6 +35,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
3235
},
3336
},
3437
null,
38+
0,
3539
]
3640

3741
const output1 = handleEventsTransactionEnqueued.parseEvent(...input1)
@@ -47,7 +51,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
4751
i < Number.MAX_SAFE_INTEGER;
4852
i += Math.floor(Number.MAX_SAFE_INTEGER / MAX_ITERATIONS)
4953
) {
50-
const input1: [any, any] = [
54+
const input1: [any, any, number] = [
5155
{
5256
blockNumber: i,
5357
args: {
@@ -57,6 +61,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
5761
},
5862
},
5963
null,
64+
0,
6065
]
6166

6267
const output1 = handleEventsTransactionEnqueued.parseEvent(...input1)
@@ -73,7 +78,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
7378
i < Number.MAX_SAFE_INTEGER;
7479
i += Math.floor(Number.MAX_SAFE_INTEGER / MAX_ITERATIONS)
7580
) {
76-
const input1: [any, any] = [
81+
const input1: [any, any, number] = [
7782
{
7883
blockNumber: 0,
7984
args: {
@@ -83,6 +88,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
8388
},
8489
},
8590
null,
91+
0,
8692
]
8793

8894
const output1 = handleEventsTransactionEnqueued.parseEvent(...input1)
@@ -99,7 +105,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
99105
i < Number.MAX_SAFE_INTEGER;
100106
i += Math.floor(Number.MAX_SAFE_INTEGER / MAX_ITERATIONS)
101107
) {
102-
const input1: [any, any] = [
108+
const input1: [any, any, number] = [
103109
{
104110
blockNumber: 0,
105111
args: {
@@ -109,6 +115,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
109115
},
110116
},
111117
null,
118+
0,
112119
]
113120

114121
const output1 = handleEventsTransactionEnqueued.parseEvent(...input1)
@@ -125,7 +132,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
125132
i < Number.MAX_SAFE_INTEGER;
126133
i += Math.floor(Number.MAX_SAFE_INTEGER / MAX_ITERATIONS)
127134
) {
128-
const input1: [any, any] = [
135+
const input1: [any, any, number] = [
129136
{
130137
blockNumber: 0,
131138
args: {
@@ -135,6 +142,7 @@ describe('Event Handlers: OVM_CanonicalTransactionChain.TransactionEnqueued', ()
135142
},
136143
},
137144
null,
145+
0,
138146
]
139147

140148
const output1 = handleEventsTransactionEnqueued.parseEvent(...input1)

0 commit comments

Comments
 (0)