diff --git a/.changeset/old-weeks-study.md b/.changeset/old-weeks-study.md new file mode 100644 index 0000000000000..5d50c7d45e9eb --- /dev/null +++ b/.changeset/old-weeks-study.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/data-transport-layer': patch +--- + +dtl: Support basic authentication for RPC endpoints diff --git a/packages/data-transport-layer/README.md b/packages/data-transport-layer/README.md index a18b32669122b..e1469f4f8c3e9 100644 --- a/packages/data-transport-layer/README.md +++ b/packages/data-transport-layer/README.md @@ -55,9 +55,13 @@ Here's the list of environment variables you can change: | DATA_TRANSPORT_LAYER__SERVER_PORT | 7878 | Port to run the API on. | | DATA_TRANSPORT_LAYER__SYNC_FROM_L1 | true | Whether or not to sync from L1. | | DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT | - | RPC endpoint for an L1 node. | +| DATA_TRANSPORT_LAYER__L1_RPC_USER | - | Basic Authentication user for the L1 node endpoint. | +| DATA_TRANSPORT_LAYER__L1_RPC_PASSWORD | - | Basic Authentication password for the L1 node endpoint. | | DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL | 2000 | Logs to sync per polling interval. | | DATA_TRANSPORT_LAYER__SYNC_FROM_L2 | false | Whether or not to sync from L2. | | DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT | - | RPC endpoint for an L2 node. | +| DATA_TRANSPORT_LAYER__L2_RPC_USER | - | Basic Authentication user for the L2 node endpoint. | +| DATA_TRANSPORT_LAYER__L2_RPC_PASSWORD | - | Basic Authentication password for the L2 node endpoint. | | DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL | 1000 | Number of L2 transactions to query per polling interval. | | DATA_TRANSPORT_LAYER__L2_CHAIN_ID | - | L2 chain ID. | | DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY | false | Whether or not to enable "legacy" sequencer sync (without the custom `eth_getBlockRange` endpoint) | 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 35c80dde92530..c6f5289fe8a8b 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/service.ts @@ -1,12 +1,8 @@ /* Imports: External */ -import { - fromHexString, - FallbackProvider, - sleep, -} from '@eth-optimism/core-utils' +import { fromHexString, sleep } from '@eth-optimism/core-utils' import { BaseService, Metrics } from '@eth-optimism/common-ts' import { TypedEvent } from '@eth-optimism/contracts/dist/types/common' -import { BaseProvider } from '@ethersproject/providers' +import { BaseProvider, StaticJsonRpcProvider } from '@ethersproject/providers' import { LevelUp } from 'levelup' import { constants } from 'ethers' import { Gauge, Counter } from 'prom-client' @@ -114,8 +110,11 @@ export class L1IngestionService extends BaseService { this.l1IngestionMetrics = registerMetrics(this.metrics) if (typeof this.options.l1RpcProvider === 'string') { - this.state.l1RpcProvider = FallbackProvider(this.options.l1RpcProvider, { - 'User-Agent': 'data-transport-layer', + this.state.l1RpcProvider = new StaticJsonRpcProvider({ + url: this.options.l1RpcProvider, + user: this.options.l1RpcProviderUser, + password: this.options.l1RpcProviderPassword, + headers: { 'User-Agent': 'data-transport-layer' }, }) } else { this.state.l1RpcProvider = this.options.l1RpcProvider 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 97aa6d2be6db2..8119e3fca6d2d 100644 --- a/packages/data-transport-layer/src/services/l2-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l2-ingestion/service.ts @@ -93,6 +93,8 @@ export class L2IngestionService extends BaseService { typeof this.options.l2RpcProvider === 'string' ? new StaticJsonRpcProvider({ url: this.options.l2RpcProvider, + user: this.options.l2RpcProviderUser, + password: this.options.l2RpcProviderPassword, headers: { 'User-Agent': 'data-transport-layer' }, }) : this.options.l2RpcProvider diff --git a/packages/data-transport-layer/src/services/main/service.ts b/packages/data-transport-layer/src/services/main/service.ts index 484d6bb02119d..9e70dcbd8cfa7 100644 --- a/packages/data-transport-layer/src/services/main/service.ts +++ b/packages/data-transport-layer/src/services/main/service.ts @@ -20,8 +20,12 @@ export interface L1DataTransportServiceOptions { dangerouslyCatchAllErrors?: boolean hostname: string l1RpcProvider: string + l1RpcProviderUser?: string + l1RpcProviderPassword?: string l2ChainId: number l2RpcProvider: string + l2RpcProviderUser?: string + l2RpcProviderPassword?: string metrics?: Metrics dbPath: string logsPerPollingInterval: number diff --git a/packages/data-transport-layer/src/services/run.ts b/packages/data-transport-layer/src/services/run.ts index fdd54ab30f997..44d7d7c0aae44 100644 --- a/packages/data-transport-layer/src/services/run.ts +++ b/packages/data-transport-layer/src/services/run.ts @@ -26,6 +26,8 @@ type ethNetwork = 'mainnet' | 'kovan' | 'goerli' hostname: config.str('server-hostname', 'localhost'), confirmations: config.uint('confirmations', 35), l1RpcProvider: config.str('l1-rpc-endpoint'), + l1RpcProviderUser: config.str('l1-rpc-user'), + l1RpcProviderPassword: config.str('l1-rpc-password'), addressManager: config.str('address-manager'), pollingInterval: config.uint('polling-interval', 5000), logsPerPollingInterval: config.uint('logs-per-polling-interval', 2000), @@ -34,6 +36,8 @@ type ethNetwork = 'mainnet' | 'kovan' | 'goerli' false ), l2RpcProvider: config.str('l2-rpc-endpoint'), + l2RpcProviderUser: config.str('l2-rpc-user'), + l2RpcProviderPassword: config.str('l2-rpc-password'), l2ChainId: config.uint('l2-chain-id'), syncFromL1: config.bool('sync-from-l1', true), syncFromL2: config.bool('sync-from-l2', false),