diff --git a/.changeset/many-lizards-drop.md b/.changeset/many-lizards-drop.md new file mode 100644 index 0000000000000..170447af9a5b4 --- /dev/null +++ b/.changeset/many-lizards-drop.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +Adds consistency checks for transaction entries in L1 syncing nodes diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/errors.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/errors.ts index 383fb3f368062..4a5389176060d 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/errors.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/errors.ts @@ -2,6 +2,7 @@ export type EventName = | 'TransactionEnqueued' | 'SequencerBatchAppended' | 'StateBatchAppended' + | 'SequencerBatchAppendedTransaction' export class MissingElementError extends Error { constructor(public name: EventName) { diff --git a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts index e1ca606fcb837..bd4177c10ab65 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/handlers/sequencer-batch-appended.ts @@ -206,6 +206,21 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< } } + // Same consistency checks but for transaction entries. + if ( + entry.transactionEntries.length > 0 && + entry.transactionEntries[0].index > 0 + ) { + const prevTransactionEntry = await db.getTransactionByIndex( + entry.transactionEntries[0].index - 1 + ) + + // We should *always* have a previous transaction here. + if (prevTransactionEntry === null) { + throw new MissingElementError('SequencerBatchAppendedTransaction') + } + } + await db.putTransactionEntries(entry.transactionEntries) // Add an additional field to the enqueued transactions in the database diff --git a/packages/data-transport-layer/src/services/l1-ingestion/service.ts b/packages/data-transport-layer/src/services/l1-ingestion/service.ts index 2055aa2e9b689..8b606bb9cd70a 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/service.ts @@ -277,6 +277,8 @@ export class L1IngestionService extends BaseService { const handlers = { SequencerBatchAppended: this.state.db.getLatestTransactionBatch.bind(this.state.db), + SequencerBatchAppendedTransaction: + this.state.db.getLatestTransaction.bind(this.state.db), StateBatchAppended: this.state.db.getLatestStateRootBatch.bind( this.state.db ),