From 757139c3ca45e4955182c86920bed3713d975d9b Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 10 Mar 2026 10:48:50 +0100 Subject: [PATCH] check version of gradido node, fix lint --- dlt-connector/src/bootstrap/init.ts | 20 +++++-- .../src/bootstrap/initGradidoNode.ts | 17 +++++- .../client/GradidoNode/GradidoNodeProcess.ts | 7 ++- dlt-connector/src/config/schema.ts | 4 +- dlt-connector/src/index.ts | 3 + .../data/Balance.ts | 16 ++++-- .../CreationsSync.role.ts | 4 +- .../DeletedTransactionLinksSync.role.ts | 2 +- .../LocalTransactionsSync.role.ts | 2 +- .../RedeemTransactionLinksSync.role.ts | 2 +- .../RemoteTransactionsSync.role.ts | 4 +- .../TransactionLinkFundingsSync.role.ts | 5 +- .../syncDbWithBlockchain/UsersSync.role.ts | 2 +- .../syncDbWithBlockchain.context.ts | 57 +++++++++++++------ dlt-connector/src/utils/network.ts | 2 +- 15 files changed, 100 insertions(+), 47 deletions(-) diff --git a/dlt-connector/src/bootstrap/init.ts b/dlt-connector/src/bootstrap/init.ts index f428b4218..cc8d1ac69 100644 --- a/dlt-connector/src/bootstrap/init.ts +++ b/dlt-connector/src/bootstrap/init.ts @@ -35,11 +35,18 @@ export async function checkHieroAccount(logger: Logger, clients: AppContextClien export async function checkHomeCommunity( appContext: AppContext, logger: Logger, -): Promise { +): Promise { const { backend, hiero } = appContext.clients // wait for backend server - await isPortOpenRetry(backend.url) + try { + logger.info(`Waiting for backend server to become available at ${backend.url}`) + await isPortOpenRetry(backend.url) + } catch (e) { + logger.error(`Backend server at ${backend.url} is not reachable`) + return + } + // ask backend for home community let homeCommunity = await backend.getHomeCommunityDraft() // on missing topicId, create one @@ -58,7 +65,7 @@ export async function checkHomeCommunity( await hiero.updateTopic(homeCommunity.hieroTopicId) topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) logger.info( - `updated topic info, new expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, + `Topic expiration extended. New expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, ) } } @@ -66,9 +73,10 @@ export async function checkHomeCommunity( throw new Error('still no topic id, after creating topic and update community in backend.') } appContext.cache.setHomeCommunityTopicId(homeCommunity.hieroTopicId) - logger.info(`home community topic: ${homeCommunity.hieroTopicId}`) - logger.info(`gradido node server: ${appContext.clients.gradidoNode.url}`) - logger.info(`gradido backend server: ${appContext.clients.backend.url}`) + logger.info(`Home community topic id: ${homeCommunity.hieroTopicId}`) + logger.info(`Gradido node server: ${appContext.clients.gradidoNode.url}`) + logger.info(`Gradido backend server: ${appContext.clients.backend.url}`) + await ResolveKeyPair( new KeyPairIdentifierLogic({ communityTopicId: homeCommunity.hieroTopicId, diff --git a/dlt-connector/src/bootstrap/initGradidoNode.ts b/dlt-connector/src/bootstrap/initGradidoNode.ts index e0d1a047d..395bec16a 100644 --- a/dlt-connector/src/bootstrap/initGradidoNode.ts +++ b/dlt-connector/src/bootstrap/initGradidoNode.ts @@ -53,11 +53,24 @@ async function exportHederaAddressbooks( async function ensureGradidoNodeRuntimeAvailable(runtimeFileName: string): Promise { const runtimeFolder = path.dirname(runtimeFileName) + const wantedVersion = `v${CONFIG.DLT_GRADIDO_NODE_SERVER_VERSION}` checkPathExist(runtimeFolder, true) - if (!checkFileExist(runtimeFileName)) { + let versionMatch = false + const isFileExist = checkFileExist(runtimeFileName) + if (isFileExist) { + const foundVersion = await GradidoNodeProcess.checkRuntimeVersion() + if (wantedVersion !== foundVersion) { + logger.info( + `GradidoNode version detected: ${foundVersion}, required: ${wantedVersion}` + ) + } else { + versionMatch = true + } + } + if (!isFileExist || !versionMatch) { const runtimeArchiveFilename = createGradidoNodeRuntimeArchiveFilename() const downloadUrl = new URL( - `https://github.com/gradido/gradido_node/releases/download/v${CONFIG.DLT_GRADIDO_NODE_SERVER_VERSION}/${runtimeArchiveFilename}`, + `https://github.com/gradido/gradido_node/releases/download/${wantedVersion}/${runtimeArchiveFilename}`, ) logger.debug(`download GradidoNode Runtime from ${downloadUrl}`) const archive = await fetch(downloadUrl) diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts index 09c9b13ab..35c56f4b1 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts @@ -1,13 +1,12 @@ import path from 'node:path' import { Mutex } from 'async-mutex' -import { Subprocess, spawn } from 'bun' +import { $, Subprocess, spawn } from 'bun' import { getLogger, Logger } from 'log4js' import { CONFIG } from '../../config' import { GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS, GRADIDO_NODE_MIN_RUNTIME_BEFORE_EXIT_MILLISECONDS, GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS, - GRADIDO_NODE_RUNTIME_PATH, LOG4JS_BASE_CATEGORY, } from '../../config/const' import { delay } from '../../utils/time' @@ -51,6 +50,10 @@ export class GradidoNodeProcess { return path.join(CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER, 'bin', binaryName) } + public static async checkRuntimeVersion(): Promise { + return (await $`${GradidoNodeProcess.getRuntimePathFileName()} --version`.text()).trim() + } + public start() { if (this.proc) { this.logger.warn('GradidoNodeProcess already running.') diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index fcb1452de..c89db3cc3 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -82,9 +82,9 @@ export const configSchema = v.object({ DLT_GRADIDO_NODE_SERVER_VERSION: v.optional( v.pipe( v.string('The version of the DLT node server, for example: 0.9.0'), - v.regex(/^\d+\.\d+\.\d+$/), + v.regex(/^\d+\.\d+\.\d+(.\d+)?$/), ), - '0.9.4', + '0.9.6.10', ), DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: v.optional( v.string('The home folder for the gradido dlt node server'), diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 1d4513e83..3f0081ffb 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -21,6 +21,9 @@ async function main() { // get home community, create topic if not exist, or check topic expiration and update it if needed const homeCommunity = await checkHomeCommunity(appContext, logger) + if (!homeCommunity) { + process.exit(1) + } // ask gradido node if community blockchain was created // if not exist, create community root transaction diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/data/Balance.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/data/Balance.ts index 7f96b1d16..d140f1c93 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/data/Balance.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/data/Balance.ts @@ -103,11 +103,15 @@ export class Balance { } toString(): string { - return JSON.stringify({ - balance: this.balance.toString(), - date: this.date, - publicKey: this.publicKey.convertToHex(), - communityId: this.communityId - }, null, 2) + return JSON.stringify( + { + balance: this.balance.toString(), + date: this.date, + publicKey: this.publicKey.convertToHex(), + communityId: this.communityId, + }, + null, + 2, + ) } } diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/CreationsSync.role.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/CreationsSync.role.ts index 9ffa11231..683953a06 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/CreationsSync.role.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/CreationsSync.role.ts @@ -14,6 +14,7 @@ import { TransferAmount, } from 'gradido-blockchain-js' import * as v from 'valibot' +import { Uuidv4 } from '../../../../schemas/typeGuard.schema' import { addToBlockchain } from '../../blockchain' import { Context } from '../../Context' import { ContributionStatus } from '../../data/ContributionStatus' @@ -26,7 +27,6 @@ import { creationTransactionDbSchema, } from '../../valibot.schema' import { AbstractSyncRole, IndexType } from './AbstractSync.role' -import { Uuidv4 } from '../../../../schemas/typeGuard.schema' export class CreationsSyncRole extends AbstractSyncRole { constructor(context: Context) { @@ -38,7 +38,7 @@ export class CreationsSyncRole extends AbstractSyncRole { return this.peek().confirmedAt } getCommunityUuids(): Uuidv4[] { - return [ this.peek().user.communityUuid ] + return [this.peek().user.communityUuid] } getLastIndex(): IndexType { diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/DeletedTransactionLinksSync.role.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/DeletedTransactionLinksSync.role.ts index 3ce1bcef4..05aeaa5a8 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/DeletedTransactionLinksSync.role.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/DeletedTransactionLinksSync.role.ts @@ -14,6 +14,7 @@ import { } from 'gradido-blockchain-js' import * as v from 'valibot' import { deriveFromCode } from '../../../../data/deriveKeyPair' +import { Uuidv4 } from '../../../../schemas/typeGuard.schema' import { addToBlockchain } from '../../blockchain' import { Context } from '../../Context' import { Balance } from '../../data/Balance' @@ -26,7 +27,6 @@ import { deletedTransactionLinKDbSchema, } from '../../valibot.schema' import { AbstractSyncRole, IndexType } from './AbstractSync.role' -import { Uuidv4 } from '../../../../schemas/typeGuard.schema' export class DeletedTransactionLinksSyncRole extends AbstractSyncRole { constructor(context: Context) { diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/LocalTransactionsSync.role.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/LocalTransactionsSync.role.ts index 4092b41d5..d85921a4b 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/LocalTransactionsSync.role.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/LocalTransactionsSync.role.ts @@ -11,6 +11,7 @@ import { TransferAmount, } from 'gradido-blockchain-js' import * as v from 'valibot' +import { Uuidv4 } from '../../../../schemas/typeGuard.schema' import { addToBlockchain } from '../../blockchain' import { Context } from '../../Context' import { TransactionTypeId } from '../../data/TransactionTypeId' @@ -24,7 +25,6 @@ import { import { toMysqlDateTime } from '../../utils' import { CommunityContext, TransactionDb, transactionDbSchema } from '../../valibot.schema' import { AbstractSyncRole, IndexType } from './AbstractSync.role' -import { Uuidv4 } from '../../../../schemas/typeGuard.schema' export class LocalTransactionsSyncRole extends AbstractSyncRole { constructor(context: Context) { diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RedeemTransactionLinksSync.role.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RedeemTransactionLinksSync.role.ts index ffdb84d04..012a07b08 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RedeemTransactionLinksSync.role.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RedeemTransactionLinksSync.role.ts @@ -17,6 +17,7 @@ import { } from 'gradido-blockchain-js' import * as v from 'valibot' import { deriveFromCode } from '../../../../data/deriveKeyPair' +import { Uuidv4 } from '../../../../schemas/typeGuard.schema' import { addToBlockchain } from '../../blockchain' import { Context } from '../../Context' import { transactionLinksTable, usersTable } from '../../drizzle.schema' @@ -28,7 +29,6 @@ import { redeemedTransactionLinkDbSchema, } from '../../valibot.schema' import { AbstractSyncRole, IndexType } from './AbstractSync.role' -import { Uuidv4 } from '../../../../schemas/typeGuard.schema' export class RedeemTransactionLinksSyncRole extends AbstractSyncRole { constructor(context: Context) { diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RemoteTransactionsSync.role.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RemoteTransactionsSync.role.ts index da9ef8a70..b951641ab 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RemoteTransactionsSync.role.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/RemoteTransactionsSync.role.ts @@ -14,6 +14,7 @@ import { TransferAmount, } from 'gradido-blockchain-js' import * as v from 'valibot' +import { Uuidv4 } from '../../../../schemas/typeGuard.schema' import { addToBlockchain } from '../../blockchain' import { Context } from '../../Context' import { TransactionTypeId } from '../../data/TransactionTypeId' @@ -27,7 +28,6 @@ import { import { toMysqlDateTime } from '../../utils' import { CommunityContext, TransactionDb, transactionDbSchema, UserDb } from '../../valibot.schema' import { AbstractSyncRole, IndexType } from './AbstractSync.role' -import { Uuidv4 } from '../../../../schemas/typeGuard.schema' export class RemoteTransactionsSyncRole extends AbstractSyncRole { constructor(context: Context) { @@ -41,7 +41,7 @@ export class RemoteTransactionsSyncRole extends AbstractSyncRole getCommunityUuids(): Uuidv4[] { const currentItem = this.peek() - return [ currentItem.user.communityUuid, currentItem.linkedUser.communityUuid ] + return [currentItem.user.communityUuid, currentItem.linkedUser.communityUuid] } getLastIndex(): IndexType { diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/TransactionLinkFundingsSync.role.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/TransactionLinkFundingsSync.role.ts index 7d93d6921..5364a2bdf 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/TransactionLinkFundingsSync.role.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/TransactionLinkFundingsSync.role.ts @@ -14,11 +14,12 @@ import { LedgerAnchor, MemoryBlockPtr, SearchDirection_DESC, - transactionTypeToString, TransferAmount, + transactionTypeToString, } from 'gradido-blockchain-js' import * as v from 'valibot' import { deriveFromCode } from '../../../../data/deriveKeyPair' +import { Uuidv4 } from '../../../../schemas/typeGuard.schema' import { addToBlockchain } from '../../blockchain' import { Context } from '../../Context' import { transactionLinksTable, usersTable } from '../../drizzle.schema' @@ -26,7 +27,6 @@ import { BlockchainError, DatabaseError, NegativeBalanceError } from '../../erro import { reverseLegacyDecay, toMysqlDateTime } from '../../utils' import { CommunityContext, TransactionLinkDb, transactionLinkDbSchema } from '../../valibot.schema' import { AbstractSyncRole, IndexType } from './AbstractSync.role' -import { Uuidv4 } from '../../../../schemas/typeGuard.schema' export class TransactionLinkFundingsSyncRole extends AbstractSyncRole { constructor(context: Context) { @@ -119,7 +119,6 @@ export class TransactionLinkFundingsSyncRole extends AbstractSyncRole { constructor(context: Context) { diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/syncDbWithBlockchain.context.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/syncDbWithBlockchain.context.ts index 93deba85f..3824e9b8d 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/syncDbWithBlockchain.context.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/interaction/syncDbWithBlockchain/syncDbWithBlockchain.context.ts @@ -1,6 +1,15 @@ -import { Filter, Profiler, Timestamp, InteractionCreateTransactionByEvent, LedgerAnchor, Abstract } from 'gradido-blockchain-js' +import { + Abstract, + Filter, + InteractionCreateTransactionByEvent, + LedgerAnchor, + Profiler, + Timestamp, +} from 'gradido-blockchain-js' +import { Logger } from 'log4js' import { callTime } from '../../blockchain' import { Context } from '../../Context' +import { CommunityContext } from '../../valibot.schema' import { nanosBalanceForUser } from './AbstractSync.role' import { ContributionLinkTransactionSyncRole } from './ContributionLinkTransactionSync.role' import { CreationsSyncRole } from './CreationsSync.role' @@ -10,24 +19,25 @@ import { RedeemTransactionLinksSyncRole } from './RedeemTransactionLinksSync.rol import { RemoteTransactionsSyncRole } from './RemoteTransactionsSync.role' import { TransactionLinkFundingsSyncRole } from './TransactionLinkFundingsSync.role' import { UsersSyncRole } from './UsersSync.role' -import { CommunityContext } from '../../valibot.schema' -import { Logger } from 'log4js' function processTransactionTrigger(context: CommunityContext, endDate: Date, logger: Logger) { - while(true) { + while (true) { const lastTx = context.blockchain.findOne(Filter.LAST_TRANSACTION) - let confirmedAt: Timestamp | undefined = undefined + let confirmedAt: Timestamp | undefined if (!lastTx) { // no transaction, no triggers return } else { const confirmedTx = lastTx.getConfirmedTransaction() if (!confirmedTx) { - throw new Error("missing confirmed tx in transaction entry") + throw new Error('missing confirmed tx in transaction entry') } confirmedAt = confirmedTx.getConfirmedAt() } - const triggerEvent = context.blockchain.findNextTransactionTriggerEventInRange(confirmedAt, new Timestamp(endDate)) + const triggerEvent = context.blockchain.findNextTransactionTriggerEventInRange( + confirmedAt, + new Timestamp(endDate), + ) if (!triggerEvent) { // no trigger, we can exit here return @@ -35,17 +45,26 @@ function processTransactionTrigger(context: CommunityContext, endDate: Date, log context.blockchain.removeTransactionTriggerEvent(triggerEvent) try { // InMemoryBlockchain extend Abstract, but between C++ -> Swig -> TypeScript it seems the info is gone, so I need to cheat a bit here - const createTransactionByEvent = new InteractionCreateTransactionByEvent(context.blockchain as unknown as Abstract) - if (!context.blockchain.createAndAddConfirmedTransaction( - createTransactionByEvent.run(triggerEvent), - new LedgerAnchor(triggerEvent.getLinkedTransactionId(), LedgerAnchor.Type_NODE_TRIGGER_TRANSACTION_ID), - triggerEvent.getTargetDate() - )) { + const createTransactionByEvent = new InteractionCreateTransactionByEvent( + context.blockchain as unknown as Abstract, + ) + if ( + !context.blockchain.createAndAddConfirmedTransaction( + createTransactionByEvent.run(triggerEvent), + new LedgerAnchor( + triggerEvent.getLinkedTransactionId(), + LedgerAnchor.Type_NODE_TRIGGER_TRANSACTION_ID, + ), + triggerEvent.getTargetDate(), + ) + ) { throw new Error('Adding trigger created Transaction Failed') } - } catch(e) { + } catch (e) { context.blockchain.addTransactionTriggerEvent(triggerEvent) - logger.error(`Error processing transaction trigger event for transaction: ${triggerEvent.getLinkedTransactionId()}`) + logger.error( + `Error processing transaction trigger event for transaction: ${triggerEvent.getLinkedTransactionId()}`, + ) throw e } } @@ -95,9 +114,13 @@ export async function syncDbWithBlockchainContext(context: Context, batchSize: n } const communityUuids = available[0].getCommunityUuids() for (let i = 0; i < communityUuids.length; ++i) { - processTransactionTrigger(context.getCommunityContextByUuid(communityUuids[i]), available[0].getDate(), context.logger) + processTransactionTrigger( + context.getCommunityContextByUuid(communityUuids[i]), + available[0].getDate(), + context.logger, + ) } - + available[0].toBlockchain() transactionsCount++ if (isDebug) { diff --git a/dlt-connector/src/utils/network.ts b/dlt-connector/src/utils/network.ts index 5f348c640..954cbfd76 100644 --- a/dlt-connector/src/utils/network.ts +++ b/dlt-connector/src/utils/network.ts @@ -29,7 +29,7 @@ export async function isPortOpen( socket.destroy() const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.network.isPortOpen`) logger.addContext('url', url) - logger.error(`${err.message}: ${err.code}`) + logger.debug(`${err.message}: ${err.code}`) resolve(false) }) })