From 0491ff05a4647c94db02975e1a55ec0a5ac47f22 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 20 Apr 2021 16:36:52 -0700 Subject: [PATCH 1/6] dtl: remove stopL2SyncAtHeight config --- .../src/services/l2-ingestion/service.ts | 29 +------------------ .../src/services/main/service.ts | 1 - .../data-transport-layer/src/services/run.ts | 1 - .../src/services/server/service.ts | 3 -- 4 files changed, 1 insertion(+), 33 deletions(-) diff --git a/packages/data-transport-layer/src/services/l2-ingestion/service.ts b/packages/data-transport-layer/src/services/l2-ingestion/service.ts index 61c6536b081..1d7f6848ddb 100644 --- a/packages/data-transport-layer/src/services/l2-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l2-ingestion/service.ts @@ -43,10 +43,6 @@ const optionSettings = { default: false, validate: validators.isBoolean, }, - stopL2SyncAtBlock: { - default: Infinity, - validate: validators.isInteger, - }, } export class L2IngestionService extends BaseService { @@ -80,30 +76,7 @@ export class L2IngestionService extends BaseService { const highestSyncedL2BlockNumber = (await this.state.db.getHighestSyncedUnconfirmedBlock()) || 1 - // Shut down if we're at the stop block. - if ( - this.options.stopL2SyncAtBlock !== undefined && - this.options.stopL2SyncAtBlock !== null && - highestSyncedL2BlockNumber >= this.options.stopL2SyncAtBlock - ) { - this.logger.info( - "L2 sync is shutting down because we've reached your target block. Goodbye!" - ) - return - } - - let currentL2Block = await this.state.l2RpcProvider.getBlockNumber() - - // Make sure we can't exceed the stop block. - if ( - this.options.stopL2SyncAtBlock !== undefined && - this.options.stopL2SyncAtBlock !== null - ) { - currentL2Block = Math.min( - currentL2Block, - this.options.stopL2SyncAtBlock - ) - } + const currentL2Block = await this.state.l2RpcProvider.getBlockNumber() // Make sure we don't exceed the tip. const targetL2Block = Math.min( diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 703d9ff2f41..7523809b14d 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -26,7 +26,6 @@ export interface L1DataTransportServiceOptions { syncFromL2?: boolean transactionsPerPollingInterval: number legacySequencerCompatibility: boolean - stopL2SyncAtBlock?: number sentryDsn?: string } diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 181ca7bd00e..a169f14b0fc 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -48,7 +48,6 @@ interface Bcfg { 'legacySequencerCompatibility', false ), - stopL2SyncAtBlock: config.uint('stopL2SyncAtBlock'), sentryDsn: config.str('sentryDsn'), }) diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index 32a1f7c04a2..c7930e5d854 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -48,9 +48,6 @@ const optionSettings = { return validators.isUrl(val) || validators.isJsonRpcProvider(val) }, }, - showUnconfirmedTransactions: { - validate: validators.isBoolean, - }, } export class L1TransportServer extends BaseService { From 5f6cf32ee60a1225ec9b1d87312746cc3c8efc13 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 20 Apr 2021 16:37:24 -0700 Subject: [PATCH 2/6] dtl: implement query param based backend --- .../src/services/main/service.ts | 2 +- .../data-transport-layer/src/services/run.ts | 2 +- .../src/services/server/service.ts | 128 +++++++++++------- 3 files changed, 78 insertions(+), 54 deletions(-) diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 7523809b14d..e0cc597a4b2 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -21,12 +21,12 @@ export interface L1DataTransportServiceOptions { logsPerPollingInterval: number pollingInterval: number port: number - showUnconfirmedTransactions: boolean syncFromL1?: boolean syncFromL2?: boolean transactionsPerPollingInterval: number legacySequencerCompatibility: boolean sentryDsn?: string + defaultSource: string } const optionSettings = { diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index a169f14b0fc..9474c52f0e0 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -39,7 +39,6 @@ interface Bcfg { l2ChainId: config.uint('l2ChainId'), syncFromL1: config.bool('syncFromL1', true), syncFromL2: config.bool('syncFromL2', false), - showUnconfirmedTransactions: config.bool('syncFromL2', false), transactionsPerPollingInterval: config.uint( 'transactionsPerPollingInterval', 1000 @@ -49,6 +48,7 @@ interface Bcfg { false ), sentryDsn: config.str('sentryDsn'), + defaultSource: config.str('defaultSource', 'batched'), }) await service.start() diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index c7930e5d854..e4cd803764f 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -48,6 +48,12 @@ const optionSettings = { return validators.isUrl(val) || validators.isJsonRpcProvider(val) }, }, + defaultSource: { + default: 'batched', + validate: (val: string) => { + return val === 'batched' || val === 'sequenced' + } + } } export class L1TransportServer extends BaseService { @@ -63,7 +69,6 @@ export class L1TransportServer extends BaseService { } = {} as any protected async _init(): Promise { - // TODO: I don't know if this is strictly necessary, but it's probably a good thing to do. if (!this.options.db.isOpen()) { await this.options.db.open() } @@ -168,14 +173,27 @@ export class L1TransportServer extends BaseService { * TODO: Link to our API spec. */ private _registerAllRoutes(): void { - // TODO: Maybe add doc-like comments to each of these routes? - + // TODO: this needs a source argument this._registerRoute( 'get', '/eth/syncing', - async (): Promise => { - const highestL2BlockNumber = await this.state.db.getHighestL2BlockNumber() - const currentL2Block = await this.state.db.getLatestTransaction() + async (req): Promise => { + const source = req.query.source || this.options.defaultSource + + let currentL2Block + let highestL2BlockNumber + switch (source) { + case 'batched': + currentL2Block = await this.state.db.getLatestTransaction() + highestL2BlockNumber = await this.state.db.getHighestL2BlockNumber() + break + case 'sequenced': + currentL2Block = await this.state.db.getLatestUnconfirmedTransaction() + highestL2BlockNumber = await this.state.db.getHighestSyncedUnconfirmedBlock() + break + default: + throw new Error(`Unknown transaction source ${source}`) + } if (currentL2Block === null) { if (highestL2BlockNumber === null) { @@ -326,21 +344,19 @@ export class L1TransportServer extends BaseService { this._registerRoute( 'get', '/transaction/latest', - async (): Promise => { - let transaction = await this.state.db.getLatestFullTransaction() - if (this.options.showUnconfirmedTransactions) { - const latestUnconfirmedTx = await this.state.db.getLatestUnconfirmedTransaction() - if ( - transaction === null || - transaction === undefined || - latestUnconfirmedTx.index >= transaction.index - ) { - transaction = latestUnconfirmedTx - } - } + async (req): Promise => { + const source = req.query.source || this.options.defaultSource + let transaction = null - if (transaction === null) { - transaction = await this.state.db.getLatestFullTransaction() + switch (source) { + case 'batched': + transaction = await this.state.db.getLatestFullTransaction() + break + case 'sequenced': + transaction = await this.state.db.getLatestUnconfirmedTransaction() + break + default: + throw new Error(`Unknown transaction source ${source}`) } if (transaction === null) { @@ -365,17 +381,22 @@ export class L1TransportServer extends BaseService { 'get', '/transaction/index/:index', async (req): Promise => { + const source = req.query.source || this.options.defaultSource let transaction = null - if (this.options.showUnconfirmedTransactions) { - transaction = await this.state.db.getUnconfirmedTransactionByIndex( - BigNumber.from(req.params.index).toNumber() - ) - } - if (transaction === null) { - transaction = await this.state.db.getFullTransactionByIndex( - BigNumber.from(req.params.index).toNumber() - ) + switch (source) { + case 'batched': + transaction = await this.state.db.getFullTransactionByIndex( + BigNumber.from(req.params.index).toNumber() + ) + break + case 'sequenced': + transaction = await this.state.db.getUnconfirmedTransactionByIndex( + BigNumber.from(req.params.index).toNumber() + ) + break + default: + throw new Error(`Unknown transaction source ${source}`) } if (transaction === null) { @@ -453,21 +474,19 @@ export class L1TransportServer extends BaseService { this._registerRoute( 'get', '/stateroot/latest', - async (): Promise => { - let stateRoot = await this.state.db.getLatestStateRoot() - if (this.options.showUnconfirmedTransactions) { - const latestUnconfirmedStateRoot = await this.state.db.getLatestUnconfirmedStateRoot() - if ( - stateRoot === null || - stateRoot === undefined || - latestUnconfirmedStateRoot.index >= stateRoot.index - ) { - stateRoot = latestUnconfirmedStateRoot - } - } + async (req): Promise => { + const source = req.query.source || this.options.defaultSource + let stateRoot = null - if (stateRoot === null) { - stateRoot = await this.state.db.getLatestStateRoot() + switch (source) { + case 'batched': + stateRoot = await this.state.db.getLatestStateRoot() + break + case 'sequenced': + stateRoot = await this.state.db.getLatestUnconfirmedStateRoot() + break + default: + throw new Error(`Unknown transaction source ${source}`) } if (stateRoot === null) { @@ -492,17 +511,22 @@ export class L1TransportServer extends BaseService { 'get', '/stateroot/index/:index', async (req): Promise => { + const source = req.query.source || this.options.defaultSource let stateRoot = null - if (this.options.showUnconfirmedTransactions) { - stateRoot = await this.state.db.getUnconfirmedStateRootByIndex( - BigNumber.from(req.params.index).toNumber() - ) - } - if (stateRoot === null) { - stateRoot = await this.state.db.getStateRootByIndex( - BigNumber.from(req.params.index).toNumber() - ) + switch (source) { + case 'batched': + stateRoot = await this.state.db.getStateRootByIndex( + BigNumber.from(req.params.index).toNumber() + ) + break + case 'sequenced': + stateRoot = await this.state.db.getUnconfirmedStateRootByIndex( + BigNumber.from(req.params.index).toNumber() + ) + break + default: + throw new Error(`Unknown transaction source ${source}`) } if (stateRoot === null) { From 79df95137a931737f559ac7ad7257099d85fbcfb Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 20 Apr 2021 16:39:34 -0700 Subject: [PATCH 3/6] dtl: remove dead comment --- packages/data-transport-layer/src/services/server/service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index e4cd803764f..4387904604f 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -173,7 +173,6 @@ export class L1TransportServer extends BaseService { * TODO: Link to our API spec. */ private _registerAllRoutes(): void { - // TODO: this needs a source argument this._registerRoute( 'get', '/eth/syncing', From f5b8763e449509982e84fbc54621045194ba298e Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Tue, 20 Apr 2021 16:41:00 -0700 Subject: [PATCH 4/6] dtl: add changeset --- .changeset/calm-books-hope.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/calm-books-hope.md diff --git a/.changeset/calm-books-hope.md b/.changeset/calm-books-hope.md new file mode 100644 index 00000000000..5f9f17a96a1 --- /dev/null +++ b/.changeset/calm-books-hope.md @@ -0,0 +1,5 @@ +--- +"@eth-optimism/data-transport-layer": patch +--- + +Add backwards compatible query params to REST API From 2e922096716e0b8a6c32a0c08cc50aee5cda75b2 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 21 Apr 2021 11:45:17 -0700 Subject: [PATCH 5/6] dtl: standardize on backend query param --- .../src/services/main/service.ts | 2 +- .../data-transport-layer/src/services/run.ts | 2 +- .../src/services/server/service.ts | 56 +++++++++---------- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index e0cc597a4b2..dde1f33ec70 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -26,7 +26,7 @@ export interface L1DataTransportServiceOptions { transactionsPerPollingInterval: number legacySequencerCompatibility: boolean sentryDsn?: string - defaultSource: string + defaultBackend: string } const optionSettings = { diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index 9474c52f0e0..fd6e568e8af 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -48,7 +48,7 @@ interface Bcfg { false ), sentryDsn: config.str('sentryDsn'), - defaultSource: config.str('defaultSource', 'batched'), + defaultBackend: config.str('defaultBackend', 'l1'), }) await service.start() diff --git a/packages/data-transport-layer/src/services/server/service.ts b/packages/data-transport-layer/src/services/server/service.ts index 4387904604f..ae9940d3ed9 100644 --- a/packages/data-transport-layer/src/services/server/service.ts +++ b/packages/data-transport-layer/src/services/server/service.ts @@ -48,10 +48,10 @@ const optionSettings = { return validators.isUrl(val) || validators.isJsonRpcProvider(val) }, }, - defaultSource: { - default: 'batched', + defaultBackend: { + default: 'l1', validate: (val: string) => { - return val === 'batched' || val === 'sequenced' + return val === 'l1' || val === 'l2' } } } @@ -177,21 +177,21 @@ export class L1TransportServer extends BaseService { 'get', '/eth/syncing', async (req): Promise => { - const source = req.query.source || this.options.defaultSource + const backend = req.query.backend || this.options.defaultBackend let currentL2Block let highestL2BlockNumber - switch (source) { - case 'batched': + switch (backend) { + case 'l1': currentL2Block = await this.state.db.getLatestTransaction() highestL2BlockNumber = await this.state.db.getHighestL2BlockNumber() break - case 'sequenced': + case 'l2': currentL2Block = await this.state.db.getLatestUnconfirmedTransaction() highestL2BlockNumber = await this.state.db.getHighestSyncedUnconfirmedBlock() break default: - throw new Error(`Unknown transaction source ${source}`) + throw new Error(`Unknown transaction backend ${backend}`) } if (currentL2Block === null) { @@ -344,18 +344,18 @@ export class L1TransportServer extends BaseService { 'get', '/transaction/latest', async (req): Promise => { - const source = req.query.source || this.options.defaultSource + const backend = req.query.backend || this.options.defaultBackend let transaction = null - switch (source) { - case 'batched': + switch (backend) { + case 'l1': transaction = await this.state.db.getLatestFullTransaction() break - case 'sequenced': + case 'l2': transaction = await this.state.db.getLatestUnconfirmedTransaction() break default: - throw new Error(`Unknown transaction source ${source}`) + throw new Error(`Unknown transaction backend ${backend}`) } if (transaction === null) { @@ -380,22 +380,22 @@ export class L1TransportServer extends BaseService { 'get', '/transaction/index/:index', async (req): Promise => { - const source = req.query.source || this.options.defaultSource + const backend = req.query.backend || this.options.defaultBackend let transaction = null - switch (source) { - case 'batched': + switch (backend ) { + case 'l1': transaction = await this.state.db.getFullTransactionByIndex( BigNumber.from(req.params.index).toNumber() ) break - case 'sequenced': + case 'l2': transaction = await this.state.db.getUnconfirmedTransactionByIndex( BigNumber.from(req.params.index).toNumber() ) break default: - throw new Error(`Unknown transaction source ${source}`) + throw new Error(`Unknown transaction backend ${backend}`) } if (transaction === null) { @@ -474,18 +474,18 @@ export class L1TransportServer extends BaseService { 'get', '/stateroot/latest', async (req): Promise => { - const source = req.query.source || this.options.defaultSource + const backend = req.query.backend || this.options.defaultBackend let stateRoot = null - switch (source) { - case 'batched': + switch (backend) { + case 'l1': stateRoot = await this.state.db.getLatestStateRoot() break - case 'sequenced': + case 'l2': stateRoot = await this.state.db.getLatestUnconfirmedStateRoot() break default: - throw new Error(`Unknown transaction source ${source}`) + throw new Error(`Unknown transaction backend ${backend}`) } if (stateRoot === null) { @@ -510,22 +510,22 @@ export class L1TransportServer extends BaseService { 'get', '/stateroot/index/:index', async (req): Promise => { - const source = req.query.source || this.options.defaultSource + const backend = req.query.backend || this.options.defaultBackend let stateRoot = null - switch (source) { - case 'batched': + switch (backend) { + case 'l1': stateRoot = await this.state.db.getStateRootByIndex( BigNumber.from(req.params.index).toNumber() ) break - case 'sequenced': + case 'l2': stateRoot = await this.state.db.getUnconfirmedStateRootByIndex( BigNumber.from(req.params.index).toNumber() ) break default: - throw new Error(`Unknown transaction source ${source}`) + throw new Error(`Unknown transaction backend ${backend}`) } if (stateRoot === null) { From e86ee090b8e47a9e7e3d1aed943392ef65e35a00 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Wed, 21 Apr 2021 11:53:37 -0700 Subject: [PATCH 6/6] changeset: update comment --- .changeset/calm-books-hope.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.changeset/calm-books-hope.md b/.changeset/calm-books-hope.md index 5f9f17a96a1..beaec01e286 100644 --- a/.changeset/calm-books-hope.md +++ b/.changeset/calm-books-hope.md @@ -2,4 +2,7 @@ "@eth-optimism/data-transport-layer": patch --- -Add backwards compatible query params to REST API +Allow the DTL to provide data from either L1 or L2, configurable via a query param sent by the client. +The config option `default-backend` can be used to specify the backend to be +used if the query param is not specified. This allows it to be backwards +compatible with how the DTL was previously used.