From 6ae2fe926950a075ef2c44f8d0e6a1df5923df12 Mon Sep 17 00:00:00 2001 From: Mark Tyneway Date: Thu, 4 Nov 2021 12:34:37 -0700 Subject: [PATCH] pkgs: add http headers to ethers providers Adds the http header 'User-Agent' to the creation of ethers providers across the services to allow for more visibility into what services are sending requests. Also delete dead imports since they were breaking during linting. --- .changeset/five-penguins-protect.md | 10 ++++++++ .../src/exec/run-batch-submitter.ts | 23 ++++++++++--------- packages/core-utils/package.json | 1 + packages/core-utils/src/provider.ts | 18 +++++++++++++-- .../src/services/l1-ingestion/service.ts | 10 ++++---- .../src/services/l2-ingestion/service.ts | 5 +++- packages/message-relayer/src/exec/run.ts | 10 ++++++-- .../src/healthcheck-server.ts | 10 ++++++-- 8 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 .changeset/five-penguins-protect.md diff --git a/.changeset/five-penguins-protect.md b/.changeset/five-penguins-protect.md new file mode 100644 index 000000000000..b5375881888a --- /dev/null +++ b/.changeset/five-penguins-protect.md @@ -0,0 +1,10 @@ +--- +'@eth-optimism/builder': patch +'@eth-optimism/batch-submitter': patch +'@eth-optimism/core-utils': patch +'@eth-optimism/data-transport-layer': patch +'@eth-optimism/message-relayer': patch +'@eth-optimism/replica-healthcheck': patch +--- + +Add 'User-Agent' to the http headers for ethers providers diff --git a/packages/batch-submitter/src/exec/run-batch-submitter.ts b/packages/batch-submitter/src/exec/run-batch-submitter.ts index f2bb3bc9e2e3..2639662975fc 100644 --- a/packages/batch-submitter/src/exec/run-batch-submitter.ts +++ b/packages/batch-submitter/src/exec/run-batch-submitter.ts @@ -139,9 +139,10 @@ export const run = async () => { ) const getSequencerSigner = async (): Promise => { - const l1Provider = new StaticJsonRpcProvider( - requiredEnvVars.L1_NODE_WEB3_URL - ) + const l1Provider = new StaticJsonRpcProvider({ + url: requiredEnvVars.L1_NODE_WEB3_URL, + headers: { 'User-Agent': 'batch-submitter' }, + }) if (useHardhat) { if (!DEBUG_IMPERSONATE_SEQUENCER_ADDRESS) { @@ -166,9 +167,10 @@ export const run = async () => { } const getProposerSigner = async (): Promise => { - const l1Provider = new StaticJsonRpcProvider( - requiredEnvVars.L1_NODE_WEB3_URL - ) + const l1Provider = new StaticJsonRpcProvider({ + url: requiredEnvVars.L1_NODE_WEB3_URL, + headers: { 'User-Agent': 'batch-submitter' }, + }) if (useHardhat) { if (!DEBUG_IMPERSONATE_PROPOSER_ADDRESS) { @@ -205,10 +207,6 @@ export const run = async () => { 'min-gas-price-in-gwei', parseInt(env.MIN_GAS_PRICE_IN_GWEI, 10) || 0 ) - const MAX_GAS_PRICE_IN_GWEI = config.uint( - 'max-gas-price-in-gwei', - parseInt(env.MAX_GAS_PRICE_IN_GWEI, 10) || 70 - ) const GAS_RETRY_INCREMENT = config.uint( 'gas-retry-increment', parseInt(env.GAS_RETRY_INCREMENT, 10) || 5 @@ -348,7 +346,10 @@ export const run = async () => { const clearPendingTxs = requiredEnvVars.CLEAR_PENDING_TXS const l2Provider = injectL2Context( - new StaticJsonRpcProvider(requiredEnvVars.L2_NODE_WEB3_URL) + new StaticJsonRpcProvider({ + url: requiredEnvVars.L2_NODE_WEB3_URL, + headers: { 'User-Agent': 'batch-submitter' }, + }) ) const sequencerSigner: Signer = await getSequencerSigner() diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 8705cfa1babc..020129188bfa 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -48,6 +48,7 @@ "@ethersproject/abstract-provider": "^5.4.1", "@ethersproject/bytes": "^5.5.0", "@ethersproject/providers": "^5.4.5", + "@ethersproject/web": "^5.5.0", "chai": "^4.3.4", "ethers": "^5.4.5", "lodash": "^4.17.21" diff --git a/packages/core-utils/src/provider.ts b/packages/core-utils/src/provider.ts index 66adfe013068..7a630503678f 100644 --- a/packages/core-utils/src/provider.ts +++ b/packages/core-utils/src/provider.ts @@ -4,6 +4,11 @@ import { ethers } from 'ethers' import { Provider } from '@ethersproject/providers' +import { ConnectionInfo } from '@ethersproject/web' + +export interface HttpHeaders { + [key: string]: string +} // Copied from @ethersproject/providers since it is not // currently exported @@ -24,17 +29,26 @@ export interface FallbackProviderConfig { weight?: number } -export const FallbackProvider = (config: string | FallbackProviderConfig[]) => { +export const FallbackProvider = ( + config: string | FallbackProviderConfig[], + headers?: HttpHeaders +) => { const configs = [] + // Handle the case of a string of comma delimited urls if (typeof config === 'string') { const urls = config.split(',') for (const [i, url] of urls.entries()) { + const connectionInfo: ConnectionInfo = { url } + if (typeof headers === 'object') { + connectionInfo.headers = headers + } configs.push({ priority: i, - provider: new ethers.providers.StaticJsonRpcProvider(url), + provider: new ethers.providers.StaticJsonRpcProvider(connectionInfo), }) } return new ethers.providers.FallbackProvider(configs) } + return new ethers.providers.FallbackProvider(config) } 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 633192a36183..c4f739ea1f44 100644 --- a/packages/data-transport-layer/src/services/l1-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l1-ingestion/service.ts @@ -1,9 +1,9 @@ /* Imports: External */ import { fromHexString, FallbackProvider } from '@eth-optimism/core-utils' import { BaseService, Metrics } from '@eth-optimism/common-ts' -import { StaticJsonRpcProvider, BaseProvider } from '@ethersproject/providers' +import { BaseProvider } from '@ethersproject/providers' import { LevelUp } from 'levelup' -import { ethers, constants } from 'ethers' +import { constants } from 'ethers' import { Gauge, Counter } from 'prom-client' /* Imports: Internal */ @@ -20,7 +20,7 @@ import { handleEventsTransactionEnqueued } from './handlers/transaction-enqueued import { handleEventsSequencerBatchAppended } from './handlers/sequencer-batch-appended' import { handleEventsStateBatchAppended } from './handlers/state-batch-appended' import { L1DataTransportServiceOptions } from '../main/service' -import { MissingElementError, EventName } from './handlers/errors' +import { MissingElementError } from './handlers/errors' interface L1IngestionMetrics { highestSyncedL1Block: Gauge @@ -108,7 +108,9 @@ export class L1IngestionService extends BaseService { this.l1IngestionMetrics = registerMetrics(this.metrics) if (typeof this.options.l1RpcProvider === 'string') { - this.state.l1RpcProvider = FallbackProvider(this.options.l1RpcProvider) + this.state.l1RpcProvider = FallbackProvider(this.options.l1RpcProvider, { + '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 2cade95a77ef..536a085fcb36 100644 --- a/packages/data-transport-layer/src/services/l2-ingestion/service.ts +++ b/packages/data-transport-layer/src/services/l2-ingestion/service.ts @@ -88,7 +88,10 @@ export class L2IngestionService extends BaseService { this.state.l2RpcProvider = typeof this.options.l2RpcProvider === 'string' - ? new StaticJsonRpcProvider(this.options.l2RpcProvider) + ? new StaticJsonRpcProvider({ + url: this.options.l2RpcProvider, + headers: { 'User-Agent': 'data-transport-layer' }, + }) : this.options.l2RpcProvider } diff --git a/packages/message-relayer/src/exec/run.ts b/packages/message-relayer/src/exec/run.ts index f5dbfc7c04dc..13e4ab66428d 100644 --- a/packages/message-relayer/src/exec/run.ts +++ b/packages/message-relayer/src/exec/run.ts @@ -81,8 +81,14 @@ const main = async () => { throw new Error('Must pass L2_NODE_WEB3_URL') } - const l2Provider = new providers.StaticJsonRpcProvider(L2_NODE_WEB3_URL) - const l1Provider = new providers.StaticJsonRpcProvider(L1_NODE_WEB3_URL) + const l2Provider = new providers.StaticJsonRpcProvider({ + url: L2_NODE_WEB3_URL, + headers: { 'User-Agent': 'message-relayer' }, + }) + const l1Provider = new providers.StaticJsonRpcProvider({ + url: L1_NODE_WEB3_URL, + headers: { 'User-Agent': 'message-relayer' }, + }) let wallet: Wallet if (L1_WALLET_KEY) { diff --git a/packages/replica-healthcheck/src/healthcheck-server.ts b/packages/replica-healthcheck/src/healthcheck-server.ts index 9da1aacff121..fc39a4811fbb 100644 --- a/packages/replica-healthcheck/src/healthcheck-server.ts +++ b/packages/replica-healthcheck/src/healthcheck-server.ts @@ -49,7 +49,10 @@ export class HealthcheckServer { this.metrics = this.initMetrics() this.server = this.initServer() this.replicaProvider = injectL2Context( - new providers.StaticJsonRpcProvider(this.options.replicaRpcProvider) + new providers.StaticJsonRpcProvider({ + url: this.options.replicaRpcProvider, + headers: { 'User-Agent': 'replica-healthcheck' }, + }) ) if (this.options.checkTxWriteLatency) { this.initTxLatencyCheck() @@ -177,7 +180,10 @@ export class HealthcheckServer { runSyncCheck = async () => { const sequencerProvider = injectL2Context( - new providers.StaticJsonRpcProvider(this.options.sequencerRpcProvider) + new providers.StaticJsonRpcProvider({ + url: this.options.sequencerRpcProvider, + headers: { 'User-Agent': 'replica-healthcheck' }, + }) ) // Continuously loop while replica runs