/// /// import { RemoveCertificate } from '@shardeum-foundation/lib-types/build/src/p2p/LostTypes'; import { EventEmitter } from 'events'; import { Handler } from 'express'; import Log4js from 'log4js'; import Crypto from '../crypto'; import Debug from '../debug'; import LoadDetection from '../load-detection'; import Logger, { LogFlags } from '../logger'; import * as Network from '../network'; import * as Archivers from '../p2p/Archivers'; import * as ServiceQueue from '../p2p/ServiceQueue'; import * as Wrapper from '../p2p/Wrapper'; import RateLimiting from '../rate-limiting'; import Reporter from '../reporter'; import * as ShardusTypes from '../shardus/shardus-types'; import { DevSecurityLevel } from '../shardus/shardus-types'; import StateManager from '../state-manager'; import { CachedAppData, QueueCountsResult } from '../state-manager/state-manager-types'; import { DebugComplete } from '../state-manager/TransactionQueue'; import Statistics from '../statistics'; import Storage from '../storage'; import MemoryReporting from '../utils/memoryReporting'; import NestedCounters from '../utils/nestedCounters'; import Profiler from '../utils/profiler'; import SocketIO from 'socket.io'; import { P2P } from '@shardeum-foundation/lib-types'; export declare let logDir_global: any; type RouteHandlerRegister = (route: string, authHandler: Handler, responseHandler?: Handler) => void; interface Shardus { io: SocketIO.Server; profiler: Profiler; nestedCounters: NestedCounters; memoryReporting: MemoryReporting; config: ShardusTypes.StrictServerConfiguration; logger: Logger; mainLogger: Log4js.Logger; seqLogger: Log4js.Logger; fatalLogger: Log4js.Logger; appLogger: Log4js.Logger; exitHandler: any; storage: Storage; crypto: Crypto; network: Network.NetworkClass; p2p: Wrapper.P2P; debug: Debug; appProvided: boolean; app: ShardusTypes.App; reporter: Reporter; stateManager: StateManager; statistics: Statistics; loadDetection: LoadDetection; rateLimiting: RateLimiting; heartbeatInterval: number; heartbeatTimer: NodeJS.Timeout; registerExternalGet: RouteHandlerRegister; registerExternalPost: RouteHandlerRegister; registerExternalPut: RouteHandlerRegister; registerExternalDelete: RouteHandlerRegister; registerExternalPatch: RouteHandlerRegister; serviceQueue: { registerBeforeAddVerifier: typeof ServiceQueue.registerBeforeAddVerifier; registerApplyVerifier: typeof ServiceQueue.registerApplyVerifier; registerShutdownHandler: typeof ServiceQueue.registerShutdownHandler; containsTxData: typeof ServiceQueue.containsTxData; containsTx: typeof ServiceQueue.containsTx; addNetworkTx: typeof ServiceQueue.addNetworkTx; getLatestNetworkTxEntryForSubqueueKey: typeof ServiceQueue.getLatestNetworkTxEntryForSubqueueKey; }; _listeners: any; appliedConfigChanges: Set; debugForeverLoopCounter: number; debugForeverLoopsEnabled: boolean; } /** * The main module that is used by the app developer to interact with the shardus api */ declare class Shardus extends EventEmitter { constructor({ server: config, logs: logsConfig, storage: storageConfig }: ShardusTypes.StrictShardusConfiguration); /** * This function is what the app developer uses to setup all the SDK functions used by shardus * @typedef {import('./index').App} App */ setup(app: ShardusTypes.App): this; /** * Calling this function will start the network * @param {*} exitProcOnFail Exit the process if an error occurs */ start(): Promise; /** * This function designed to help fetch the network account and * call updateConfigChangeQueue before our node has finished syncing * This is needed as a node will be sensitive to config changes * happening around the time it is syncing * @param {*} account * @param {*} lastCycle */ earlyConfigFetchAndPatch(lastCycle_counter: number): Promise; /** * Function used to register event listeners * @param {*} emitter Socket emitter to be called * @param {*} event Event name to be registered * @param {*} callback Callback function to be executed on event */ _registerListener(emitter: any, event: any, callback: any): void; /** * Function used to register event listeners * @param {*} event Name of the event to be unregistered */ _unregisterListener(event: any): void; /** * Function to unregister all event listeners */ _cleanupListeners(): void; _timestampAndQueueTransaction(tx: ShardusTypes.OpaqueTransaction, appData: any, global?: boolean, noConsensus?: boolean, loggingContext?: string): Promise<{ success: boolean; reason: string; status: number; } | { success: boolean; reason: string; status: number; txId: string; }>; /** * Function used to register listeners for transaction related events */ _attemptCreateAppliedListener(): void; /** * Function to unregister all transaction related events */ _attemptRemoveAppliedListener(): void; /** * function to unregister listener for the "accepted" event */ _unlinkStateManager(): void; /** * Creates an instance of the StateManager module and registers the "accepted" event listener for queueing transactions */ _createAndLinkStateManager(): void; /** * Function used to allow shardus to sync data specific to an app if it should be required */ syncAppData(): Promise; /** * Calls the "put" function with the "set" boolean parameter set to true * @param {*} tx The transaction data */ set(tx: any): Promise<{ success: boolean; reason: string; status: number; txId?: string; }>; /** * Allows the application to log specific data to an app.log file * @param {...any} data The data to be logged in app.log file */ log(...data: any[]): void; /** * Gets log flags. * use these for to cull out slow log lines with stringify * if you pass comma separated objects to dapp.log you do not need this. * Also good for controlling console logging */ getLogFlags(): LogFlags; /** * Submits a transaction to the network * Returns an object that tells whether a tx was successful or not and the reason why via the * validateTxnFields application SDK function. * Throws an error if an application was not provided to shardus. * * @param tx the TX format is not known to shardus core and can be any object * @param set this is an old feaure that can be used by the first node in the network to inject TXs early. candidate for deprecation * @param global this is used for injecting a tx that changes a global account completely different consensus is used for these. see src/p2p/GlobalAccounts.ts * @param inputAppData optional opaque app data that can be passed in. this is forwared to the dapp when precrack is called. * @returns * { * success: boolean, * reason: string, * staus: number * } */ put(tx: ShardusTypes.OpaqueTransaction | ShardusTypes.ReinjectedOpaqueTransaction, set?: boolean, global?: boolean, inputAppData?: any): Promise<{ success: boolean; reason: string; status: number; txId?: string; }>; forwardTransactionToLuckyNodes(senderAddress: string, tx: ShardusTypes.OpaqueTransaction, txId: string, message?: string, context?: string): Promise; /** * Returns the nodeId for this node */ getNodeId(): string; /** * Returns node info given a node id * @param {*} id The nodeId of this node */ getNode(id: string): ShardusTypes.Node | undefined; getRemovedNodePubKeyFromCache(id: string): ShardusTypes.Node['publicKey'] | undefined; getNodeByPubKey(id: string): ShardusTypes.Node; getNodeRotationIndex(id: string): { idx: number; total: number; }; isNodeInRotationBounds(nodeId: string): boolean; isNodeActiveByPubKey(pubKey: string): boolean; isNodeReadyByPubKey(pubKey: string): boolean; isNodeSyncingByPubKey(pubKey: string): boolean; isNodeSelectedByPubKey(pubKey: string): boolean; isNodeActive(id: string): boolean; /** * Returns an array of cycles in the cycleChain history starting from the current cycle * @param {*} amount The number cycles to fetch from the recent cycle history */ getLatestCycles(amount?: number): P2P.CycleCreatorTypes.CycleRecord[]; /** * This function return number of active in the latest cycle. */ getNumActiveNodes(): number; fastIsPicked(numberToPick: number): boolean; /** * * @returns {ShardusTypes.Cycle['mode']} returns the current network mode */ getNetworkMode(): ShardusTypes.Cycle['mode']; /** * @typedef {import('../shardus/index.js').Node} Node */ /** * getClosestNodes finds the closes nodes to a certain hash value * @param {string} hash any hash address (256bit 64 characters) * @param {number} count how many nodes to return * @param {boolean} selfExclude * @returns {string[]} returns a list of nodes ids that are closest. roughly in order of closeness */ getClosestNodes(hash: string, count?: number, selfExclude?: boolean): string[]; checkCycleShardData(tag: string): boolean; getClosestNodesGlobal(hash: any, count: any): string[]; removeNodeWithCertificiate(cert: RemoveCertificate): void; computeNodeRank(nodeId: string, txId: string, timestamp: number): bigint; getShardusProfiler(): Profiler; /** Get the time in MS a replacement for Date.Now(). If p2p.useNTPOffsets===true then adds the NPT offset */ shardusGetTime(): number; setDebugSetLastAppAwait(label: string, complete?: DebugComplete): void; addNetworkTx: typeof ServiceQueue.addNetworkTx; getLatestNetworkTxEntryForSubqueueKey: typeof ServiceQueue.getLatestNetworkTxEntryForSubqueueKey; validateClosestActiveNodeSignatures(signedAppData: any, signs: ShardusTypes.Sign[], minRequired: number, nodesToSign: number, allowedBackupNodes: number): { success: boolean; reason: string; }; /** * isNodeInDistance * @param {string} hash any hash address (256bit 64 characters) * @param {string} nodeId id of a node * @param {number} distance how far away can this node be to the home node of the hash * @returns {boolean} is the node in the distance to the target */ isNodeInDistance(hash: string, nodeId: string, distance: number): boolean; createApplyResponse(txId: any, txTimestamp: any): { stateTableResults: any[]; txId: any; txTimestamp: any; accountData: any[]; accountWrites: any[]; appDefinedData: {}; failed: boolean; failMessage: any; appReceiptData: any; appReceiptDataHash: any; }; shutdownFromDapp(tag: string, message: string, restart: boolean): Promise; applyResponseAddReceiptData(resultObject: ShardusTypes.ApplyResponse, appReceiptData: any, appReceiptDataHash: string): void; applyResponseSetFailed(resultObject: ShardusTypes.ApplyResponse, failMessage: string): void; applyResponseAddState(resultObject: ShardusTypes.ApplyResponse, //TODO define type! :{stateTableResults: ShardusTypes.StateTableObject[], accountData:ShardusTypes.WrappedResponse[] }, accountData: any, localCache: any, accountId: string, txId: string, txTimestamp: number, stateBefore: string, stateAfter: string, accountCreated: boolean): void; applyResponseAddChangedAccount(resultObject: ShardusTypes.ApplyResponse, //TODO define this type! accountId: string, account: ShardusTypes.WrappedResponse, txId: string, txTimestamp: number): void; useAccountWrites(): void; tryInvolveAccount(txId: string, address: string, isRead: boolean): boolean; signAsNode(obj: any): any; resetAppRelatedState(): Promise; getLocalOrRemoteAccount(address: any, opts?: { useRICache: boolean; canThrowException?: boolean; }): Promise; getLocalOrRemoteCachedAppData(topic: any, dataId: any): Promise; getLocalOrRemoteAccountQueueCount(address: any): Promise; registerCacheTopic(topic: string, maxCycleAge: number, maxCacheElements: number): Promise; sendCorrespondingCachedAppData(topic: string, dataID: string, appData: any, cycle: number, fromId: string, txId: string): Promise; /** * This function is used to query data from an account that is guaranteed to be in a remote shard * @param {*} address The address / publicKey of the account in which to query */ getRemoteAccount(address: any): Promise; getConsenusGroupForAccount(address: string): ShardusTypes.Node[]; getRandomConsensusNodeForAccount(address: string): ShardusTypes.Node; isAccountRemote(address: string): boolean; /** * test once at the given probability to fail. If it fails, log the message and return true. If it doesnt fail, return false. * @param failChance 0-1 * @param debugName * @param key * @param message * @param verboseRequired * @returns */ testFailChance(failChance: number, debugName: string, key: string, message: string, verboseRequired: boolean): boolean; debugForeverLoop(tag: string): Promise; setupDebugEndpoints(): void; /** * Creates a wrapped response for formatting required by shardus * @param {*} accountId * @param {*} accountCreated * @param {*} hash * @param {*} timestamp * @param {*} fullData */ createWrappedResponse(accountId: any, accountCreated: any, hash: any, timestamp: any, fullData: any): { accountId: any; accountCreated: any; isPartial: boolean; stateId: any; timestamp: any; data: any; }; /** * setPartialData * @param {Shardus.WrappedResponse} response * @param {any} partialData * @param {any} userTag */ setPartialData(response: any, partialData: any, userTag: any): void; genericApplyPartialUpate(fullObject: any, updatedPartialObject: any): void; /** * This is for a dapp to restore a bunch of account data in a debug situation. * This will call back into the dapp and instruct it to commit each account * This will also update shardus values. * There is a bug with re-updating the accounts copy db though. * @param accountCopies */ debugCommitAccountCopies(accountCopies: ShardusTypes.AccountsCopy[]): Promise; forwardAccounts(data: Archivers.InitialAccountsData): Promise; getDevPublicKeys(): Required<{ [x: string]: ShardusTypes.DevSecurityLevel; }>; getDevPublicKey(keyName?: string): string; getDevPublicKeyMaxLevel(clearance?: DevSecurityLevel): string; ensureKeySecurity(keyName: string, clearance: DevSecurityLevel): boolean; getMultisigPublicKeys(): Required<{ [x: string]: ShardusTypes.DevSecurityLevel; }>; getMultisigPublicKey(key: string): string; ensureMultisigKeySecurity(pubKey: string, level: DevSecurityLevel): boolean; /** * Shutdown this node in the network * @param {boolean} exitProcess Exit the process when shutting down */ shutdown(exitProcess?: boolean): Promise; /** * Grab the SDK interface provided by the application for shardus * @param {App} application * @returns {App} */ _getApplicationInterface(application: ShardusTypes.App): ShardusTypes.App; /** * Register the exit and config routes */ _registerRoutes(): void; /** * Registers exception handlers for "uncaughtException" and "unhandledRejection" */ registerExceptionHandler(): void; /** * Checks a transaction timestamp for expiration * deprecated * @param {number} timestamp */ updateConfigChangeQueue(account: ShardusTypes.WrappedData, lastCycle_counter: number, updateNetworkAccount: boolean): Promise; patchObject(existingObject: any, changeObj: any, appData: any): void; /** * Do some periodic debug logic work * @param lastCycle */ updateDebug(lastCycle: ShardusTypes.Cycle): void; /** * Sets a global account value using the GlobalAccont Class' setGlobal function. * * @param address - The address of the account. * @param addressHash - The hash of the address. * @param value - The value to set for the account. * @param when - The timestamp or condition when the value should be set. * @param source - The source of the value. * @param afterStateHash - The state hash after setting the value. */ setGlobal(address: any, addressHash: any, value: any, when: any, source: any, afterStateHash: any): void; getDebugModeMiddleware(): (_req: any, res: any, next: any) => void; getDebugModeMiddlewareLow(): (_req: any, res: any, next: any) => void; getDebugModeMiddlewareMedium(): (_req: any, res: any, next: any) => void; getDebugModeMiddlewareHigh(): (_req: any, res: any, next: any) => void; getDebugModeMiddlewareMultiSig(): (_req: any, res: any, next: any) => void; shardus_fatal(key: any, log: any, log2?: any): void; monitorEvent(category: string, name: string, count: number, message: string): void; setMemoryLimit(topic: string, cacheCountLimit: number): void; getAppDataSignatures(type: string, hash: string, nodesToSign: number, appData: any, allowedBackupNodes?: number): Promise; isOnStandbyList(publicKey: string): boolean; } export default Shardus; export * as ShardusTypes from '../shardus/shardus-types';