diff --git a/src/connection-manager/agreement.ts b/src/connection-manager/agreement.ts index d4c2f65c..38277acb 100644 --- a/src/connection-manager/agreement.ts +++ b/src/connection-manager/agreement.ts @@ -17,7 +17,9 @@ import { ValidationRaw, ValidatorKeys, Ballot, + Chain, } from '../shared/types' +import { getLists, overlaps } from '../shared/utils' import logger from '../shared/utils/logger' import chains from './chains' @@ -120,6 +122,30 @@ function isPreceedingFlagLedger(ledger_index: string): boolean { return parseInt(ledger_index, 10) % 256 === 255 } +/** + * Finds network name from chain id. + * + * @param chain - A chain object. + * @returns String. + */ +async function getNetworkNameFromChainId(chain: Chain): Promise { + let id = chain.id + const lists = await getLists().catch((err) => { + log.error('Error getting validator lists', err) + return undefined + }) + + if (lists != null) { + Object.entries(lists).forEach(([network, set]) => { + if (overlaps(chain.validators, set)) { + id = network + } + }) + } + + return id +} + /** * */ @@ -153,6 +179,14 @@ class Agreement { for (const chain of agreementChains) { const ledger_hashes = chain.ledgers + const networkName = await getNetworkNameFromChainId(chain) + + log.info( + `Agreement: ${chain.id}:${networkName}:${Array.from( + chain.validators, + ).join(',')}`, + ) + for (const signing_key of chain.validators) { promises.push( this.calculateValidatorAgreement( diff --git a/src/connection-manager/connections.ts b/src/connection-manager/connections.ts index 7ed4e571..ec283b8d 100644 --- a/src/connection-manager/connections.ts +++ b/src/connection-manager/connections.ts @@ -27,6 +27,7 @@ const ports = [443, 80, 6005, 6006, 51233, 51234] const protocols = ['wss://', 'ws://'] const connections: Map = new Map() const networkFee: Map = new Map() +const validationNetworkDb: Map = new Map() const CM_INTERVAL = 60 * 60 * 1000 const WS_TIMEOUT = 10000 const REPORTING_INTERVAL = 15 * 60 * 1000 @@ -60,12 +61,6 @@ async function setHandlers( isInitialNode = false, retryCount = 0, ): Promise { - log.info( - `Initiated Websocket connection for: ${ws_url} on ${ - networks ?? 'unknown network' - }`, - ) - const ledger_hashes: string[] = [] return new Promise(function setHandlersPromise(resolve, _reject) { ws.on('open', () => { @@ -119,6 +114,7 @@ async function setHandlers( networks, networkFee, ws, + validationNetworkDb, ) } }) @@ -230,6 +226,14 @@ async function findConnection(node: WsNode): Promise { return Promise.resolve() } +async function getValidationNetworkDb(): Promise { + const validatorNetwork: Array<{ signing_key: string; networks: string }> = + await query('validators').select('signing_key', 'networks') + for (const entry of validatorNetwork) { + validationNetworkDb.set(entry.signing_key, entry.networks) + } +} + /** * Creates connections to nodes found in the database. * @@ -237,6 +241,8 @@ async function findConnection(node: WsNode): Promise { */ async function createConnections(): Promise { log.info('Finding Connections...') + validationNetworkDb.clear() + await getValidationNetworkDb() const tenMinutesAgo = new Date() tenMinutesAgo.setMinutes(tenMinutesAgo.getMinutes() - 10) diff --git a/src/connection-manager/wsHandling.ts b/src/connection-manager/wsHandling.ts index 86fb4506..31c0066e 100644 --- a/src/connection-manager/wsHandling.ts +++ b/src/connection-manager/wsHandling.ts @@ -9,18 +9,13 @@ import { import { AMENDMENTS_ID } from 'xrpl/dist/npm/models/ledger' import { LedgerResponseExpanded } from 'xrpl/dist/npm/models/methods/ledger' -import { - query, - saveAmendmentStatus, - saveAmendmentsStatus, -} from '../shared/database' +import { saveAmendmentStatus, saveAmendmentsStatus } from '../shared/database' import { NETWORKS_HOSTS, deleteAmendmentStatus, } from '../shared/database/amendments' import { AmendmentStatus, - DatabaseValidator, FeeVote, StreamLedger, StreamManifest, @@ -106,6 +101,7 @@ function isFlagLedgerPlusOne(ledger_index: number): boolean { * @param networks - The networks of subscribed node. * @param network_fee - The map of default fee for the network to be used in case the validator does not vote for a new fee. * @param ws - The WebSocket message received from. + * @param validationNetworkDb -- A map of validator signing_keys to their corresponding networks. * @returns Void. */ // eslint-disable-next-line max-params -- Disabled for this function. @@ -115,6 +111,7 @@ export async function handleWsMessageSubscribeTypes( networks: string | undefined, network_fee: Map, ws: WebSocket, + validationNetworkDb: Map, ): Promise { if (data.type === 'validationReceived') { const validationData = data as ValidationRaw @@ -122,15 +119,9 @@ export async function handleWsMessageSubscribeTypes( validationData.networks = networks } - // Get network of the validation if ledger_hash is not in cache. - const validationNetworkDb: DatabaseValidator | undefined = await query( - 'validators', - ) - .select('*') - .where('signing_key', validationData.validation_public_key) - .first() const validationNetwork = - validationNetworkDb?.networks ?? validationData.networks + validationNetworkDb.get(validationData.validation_public_key) ?? + validationData.networks // Get the fee for the network to be used in case the validator does not vote for a new fee. if (validationNetwork) {