From 3a1ea074b0d8be8fe9a2e6f6777baec55c27c28b Mon Sep 17 00:00:00 2001 From: Rhys Bartels-Waller Date: Tue, 4 Feb 2025 02:10:28 +0000 Subject: [PATCH 1/2] feature(cardano-services): support Blockfrost NetworkInfoProvider in PgBossWorker --- .../deployments/pg-boss-worker-deployment.nix | 2 +- .../src/PgBoss/stakePoolRewardsHandler.ts | 16 ++++++++++++---- .../src/Program/options/providers.ts | 2 +- .../src/Program/programs/pgBossWorker.ts | 2 ++ .../src/Program/services/pgboss.ts | 3 ++- packages/cardano-services/src/cli.ts | 14 ++++++++++++-- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/nix/cardano-services/deployments/pg-boss-worker-deployment.nix b/nix/cardano-services/deployments/pg-boss-worker-deployment.nix index 786dc936e19..9287e2791a6 100644 --- a/nix/cardano-services/deployments/pg-boss-worker-deployment.nix +++ b/nix/cardano-services/deployments/pg-boss-worker-deployment.nix @@ -48,7 +48,7 @@ METADATA_FETCH_MODE = values.pg-boss-worker.metadata-fetch-mode; STAKE_POOL_PROVIDER_URL = "http://${config.name}-backend.${config.namespace}.svc.cluster.local"; - NETWORK_INFO_PROVIDER_URL = "http://${config.name}-backend.${config.namespace}.svc.cluster.local"; + NETWORK_INFO_PROVIDER = "blockfrost"; POSTGRES_POOL_MAX_STAKE_POOL = "5"; POSTGRES_HOST_STAKE_POOL = values.postgresName; diff --git a/packages/cardano-services/src/PgBoss/stakePoolRewardsHandler.ts b/packages/cardano-services/src/PgBoss/stakePoolRewardsHandler.ts index 23c75f26c0a..63339a274db 100644 --- a/packages/cardano-services/src/PgBoss/stakePoolRewardsHandler.ts +++ b/packages/cardano-services/src/PgBoss/stakePoolRewardsHandler.ts @@ -15,7 +15,9 @@ import { ServiceNames } from '../Program/programs/types'; import { accountActiveStake, poolDelegators, poolRewards } from './stakePoolRewardsQueries'; import { computeROS } from '../StakePool/TypeormStakePoolProvider/util'; import { missingProviderUrlOption } from '../Program/options/common'; -import { networkInfoHttpProvider } from '@cardano-sdk/cardano-services-client'; +import { BlockfrostNetworkInfoProvider, networkInfoHttpProvider } from '@cardano-sdk/cardano-services-client'; +import { getBlockfrostClient } from '../util'; +import { ProviderImplementation } from '../Program'; /** The version of the algorithm to compute rewards. */ export const REWARDS_COMPUTE_VERSION = 1; @@ -211,16 +213,22 @@ const getLastSlot = async (provider: NetworkInfoProvider, epochNo: Cardano.Epoch /** Creates a `stakePoolRewardsHandler`. */ export const stakePoolRewardsHandlerFactory: WorkerHandlerFactory = (options) => { - const { dataSource, db, lastRosEpochs, logger, networkInfoProviderUrl } = options; + const { dataSource, db, lastRosEpochs, logger, networkInfoProvider, networkInfoProviderUrl } = options; // Introduced following code repetition as the correct form is source of a circular-deps:check failure. // Solving it would require an invasive refactoring action, probably better to defer it. // if (!lastRosEpochs) throw new MissingProgramOption(STAKE_POOL_REWARDS, Descriptions.LastRosEpochs); if (!lastRosEpochs) throw new MissingProgramOption(STAKE_POOL_REWARDS, 'Number of epochs over which lastRos is computed'); - if (!networkInfoProviderUrl) throw missingProviderUrlOption(STAKE_POOL_REWARDS, ServiceNames.NetworkInfo); - const provider = networkInfoHttpProvider({ baseUrl: networkInfoProviderUrl, logger }); + let provider: NetworkInfoProvider; + if (networkInfoProvider === ProviderImplementation.BLOCKFROST) { + provider = new BlockfrostNetworkInfoProvider(getBlockfrostClient(), logger); + } else if (networkInfoProviderUrl) { + provider = networkInfoHttpProvider({ baseUrl: networkInfoProviderUrl, logger }); + } else { + throw missingProviderUrlOption(STAKE_POOL_REWARDS, ServiceNames.NetworkInfo); + } return async (data: StakePoolRewardsJob) => { const { epochNo } = data; diff --git a/packages/cardano-services/src/Program/options/providers.ts b/packages/cardano-services/src/Program/options/providers.ts index b56757d9a69..5de88418f74 100644 --- a/packages/cardano-services/src/Program/options/providers.ts +++ b/packages/cardano-services/src/Program/options/providers.ts @@ -19,7 +19,7 @@ export type ProviderImplementations = { stakePoolProvider?: ProviderImplementation; }; export const ProviderImplementationDescription = 'Select one of the available provider implementations'; -const argParser = (impl: string) => ProviderImplementation[impl.toUpperCase() as keyof typeof ProviderImplementation]; +export const argParser = (impl: string) => ProviderImplementation[impl.toUpperCase() as keyof typeof ProviderImplementation]; export const providerSelectionOptions = [ newOption( '--asset-provider ', diff --git a/packages/cardano-services/src/Program/programs/pgBossWorker.ts b/packages/cardano-services/src/Program/programs/pgBossWorker.ts index a3ffef4c021..6a17997f35b 100644 --- a/packages/cardano-services/src/Program/programs/pgBossWorker.ts +++ b/packages/cardano-services/src/Program/programs/pgBossWorker.ts @@ -13,6 +13,7 @@ export const PARALLEL_JOBS_DEFAULT = 10; export const PG_BOSS_WORKER_API_URL_DEFAULT = new URL('http://localhost:3003'); export enum PgBossWorkerOptionDescriptions { + NetworkInfoProvider = 'Select one of the available provider implementations', ParallelJobs = 'Parallel jobs to run', Queues = 'Comma separated queue names', Schedules = 'File path for schedules configurations' @@ -21,6 +22,7 @@ export enum PgBossWorkerOptionDescriptions { export interface LoadPgBossWorkerDependencies { dnsResolver?: (serviceName: string) => Promise; logger?: Logger; + networkInfoProvider?: string; } const pgBossWorker = 'pg-boss-worker'; diff --git a/packages/cardano-services/src/Program/services/pgboss.ts b/packages/cardano-services/src/Program/services/pgboss.ts index a1fcdf834ce..a4da5e82488 100644 --- a/packages/cardano-services/src/Program/services/pgboss.ts +++ b/packages/cardano-services/src/Program/services/pgboss.ts @@ -12,7 +12,7 @@ import { createPgBoss, isRecoverableTypeormError } from '@cardano-sdk/projection-typeorm'; -import { CommonProgramOptions, PosgresProgramOptions } from '../options'; +import { CommonProgramOptions, PosgresProgramOptions, ProviderImplementation } from '../options'; import { DataSource } from 'typeorm'; import { HealthCheckResponse } from '@cardano-sdk/core'; import { HttpService } from '../../Http/HttpService'; @@ -88,6 +88,7 @@ export type PgBossWorkerArgs = CommonProgramOptions & StakePoolMetadataProgramOptions & PosgresProgramOptions<'DbSync'> & PosgresProgramOptions<'StakePool'> & { + networkInfoProvider?: ProviderImplementation; parallelJobs: number; queues: PgBossQueue[]; schedules: Array; diff --git a/packages/cardano-services/src/cli.ts b/packages/cardano-services/src/cli.ts index fd765862792..38af56e006f 100755 --- a/packages/cardano-services/src/cli.ts +++ b/packages/cardano-services/src/cli.ts @@ -50,7 +50,10 @@ import { withHandlePolicyIdsOptions, withOgmiosOptions, withPostgresOptions, - withStakePoolMetadataOptions + withStakePoolMetadataOptions, + ProviderImplementationDescription, + ProviderImplementation, + argParser as providerImplArgParser, } from './Program'; import { Command } from 'commander'; import { DB_CACHE_TTL_DEFAULT } from './InMemoryCache'; @@ -491,7 +494,14 @@ addOptions( return readScheduleConfig(schedules); }, [] - ) + ), + newOption( + '--network-info-provider ', + ProviderImplementationDescription, + 'NETWORK_INFO_PROVIDER', + providerImplArgParser, + ProviderImplementation.DBSYNC + ).choices([ProviderImplementation.BLOCKFROST, ProviderImplementation.DBSYNC]), ] ).action(async (args: PgBossWorkerArgs) => runServer('pg-boss worker', { args }, () => From e587f7f0aa5c09aa02c70d34e5962de603c6b719 Mon Sep 17 00:00:00 2001 From: bernokl Date: Wed, 5 Feb 2025 16:17:06 +0000 Subject: [PATCH 2/2] chore: update NETWORK_INFO url --- nix/cardano-services/deployments/default.nix | 7 ++++--- .../deployments/pg-boss-worker-deployment.nix | 8 +++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/nix/cardano-services/deployments/default.nix b/nix/cardano-services/deployments/default.nix index a77a59f509e..a47925bb89d 100644 --- a/nix/cardano-services/deployments/default.nix +++ b/nix/cardano-services/deployments/default.nix @@ -662,21 +662,22 @@ in region = "us-east-1"; providers = { - backend.enabled = true; + backend.enabled = false; handle-provider.enabled = true; - chain-history-provider.enabled = true; + chain-history-provider.enabled = false; stake-pool-provider.enabled = true; }; projectors = { handle.enabled = true; stake-pool.enabled = true; - wallet-api.enabled = true; + wallet-api.enabled = false; }; values = { pg-boss-worker.enabled = true; pg-boss-worker.queues = "pool-delist-schedule,pool-metadata,pool-metrics,pool-rewards"; + ws-server.enabled = false; cardano-services = { ingresOrder = 99; }; diff --git a/nix/cardano-services/deployments/pg-boss-worker-deployment.nix b/nix/cardano-services/deployments/pg-boss-worker-deployment.nix index 9287e2791a6..855408cd65d 100644 --- a/nix/cardano-services/deployments/pg-boss-worker-deployment.nix +++ b/nix/cardano-services/deployments/pg-boss-worker-deployment.nix @@ -46,8 +46,14 @@ NODE_ENV = values.cardano-services.nodeEnv; METADATA_FETCH_MODE = values.pg-boss-worker.metadata-fetch-mode; + BLOCKFROST_API_KEY = { + valueFrom.secretKeyRef = { + name = "blockfrost"; + key = "api-key"; + }; + }; - STAKE_POOL_PROVIDER_URL = "http://${config.name}-backend.${config.namespace}.svc.cluster.local"; + STAKE_POOL_PROVIDER_URL = "blockfrost"; NETWORK_INFO_PROVIDER = "blockfrost"; POSTGRES_POOL_MAX_STAKE_POOL = "5";