diff --git a/docs/bitcoin.md b/docs/bitcoin.md index b27a87182..1c241e7f2 100644 --- a/docs/bitcoin.md +++ b/docs/bitcoin.md @@ -28,3 +28,25 @@ The fund allocated for transaction fees for subsequent re-locking of the initial > Developer's note: This allotted amount is locked together with value time lock for simplicity of re-lock implementation. If this allotted amount is depleted due to subsequent re-locks, the remaining locked amount will be released back to wallet, and a new lock will be created with this allotted amount added to it again. + +## Events + +### `bitcoin_processor_databases_revert` +Occurs every time the databases are reverted due to a bitcoin reorg. + +Event data: +```json +{ + "blockHeight": "The block height that the databases are reverted to.", +} +``` + +### `bitcoin_processor_observing_loop_failed` +Occurs every time the bitcoin processor fails an observing loop. + +Event data: none + +### `bitcoin_processor_observing_loop_success` +Occurs every time the bitcoin processor successfully completes a processing loop. + +Event data: none \ No newline at end of file diff --git a/lib/bitcoin/BitcoinProcessor.ts b/lib/bitcoin/BitcoinProcessor.ts index 8b3ec9386..baf218eee 100644 --- a/lib/bitcoin/BitcoinProcessor.ts +++ b/lib/bitcoin/BitcoinProcessor.ts @@ -1,4 +1,5 @@ import * as timeSpan from 'time-span'; +import { ISidetreeEventEmitter, ISidetreeLogger } from '..'; import BitcoinBlockDataIterator from './BitcoinBlockDataIterator'; import BitcoinBlockModel from './models/BitcoinBlockModel'; import BitcoinClient from './BitcoinClient'; @@ -8,8 +9,9 @@ import BitcoinVersionModel from './models/BitcoinVersionModel'; import BlockMetadata from './models/BlockMetadata'; import BlockMetadataWithoutNormalizedFee from './models/BlockMetadataWithoutNormalizedFee'; import ErrorCode from './ErrorCode'; +import EventCode from './EventCode'; +import EventEmitter from '../common/EventEmitter'; import IBitcoinConfig from './IBitcoinConfig'; -import { ISidetreeLogger } from '..'; import LockMonitor from './lock/LockMonitor'; import LockResolver from './lock/LockResolver'; import LogColor from '../common/LogColor'; @@ -153,8 +155,9 @@ export default class BitcoinProcessor { /** * Initializes the Bitcoin processor */ - public async initialize (versionModels: BitcoinVersionModel[], customLogger?: ISidetreeLogger) { + public async initialize (versionModels: BitcoinVersionModel[], customLogger?: ISidetreeLogger, customEventEmitter?: ISidetreeEventEmitter) { Logger.initialize(customLogger); + EventEmitter.initialize(customEventEmitter); await this.versionManager.initialize(versionModels, this.config, this.blockMetadataStore); await this.serviceStateStore.initialize(); @@ -671,7 +674,10 @@ export default class BitcoinProcessor { } else { await this.processTransactions(startingBlock); } + + EventEmitter.emit(EventCode.BitcoinProcessorObservingLoopSuccessful); } catch (error) { + EventEmitter.emit(EventCode.BitcoinProcessorObservingLoopFailed); Logger.error(error); } finally { this.pollTimeoutId = setTimeout(this.periodicPoll.bind(this), 1000 * interval, interval); @@ -752,11 +758,15 @@ export default class BitcoinProcessor { * @returns A known valid block before the fork. `undefined` if no known valid block can be found. */ private async revertDatabases (): Promise { + Logger.info(`Reverting databases...`); const exponentiallySpacedBlocks = await this.blockMetadataStore.lookBackExponentially(); const lastKnownValidBlock = await this.firstValidBlock(exponentiallySpacedBlocks); + const lastKnownValidBlockHeight = lastKnownValidBlock ? lastKnownValidBlock.height : undefined; - await this.trimDatabasesToBlock(lastKnownValidBlock ? lastKnownValidBlock.height : undefined); + Logger.info(LogColor.lightBlue(`Reverting database to ${LogColor.green(lastKnownValidBlockHeight || 'genesis')} block...`)); + await this.trimDatabasesToBlock(lastKnownValidBlockHeight); + EventEmitter.emit(EventCode.BitcoinProcessorDatabasesRevert, { blockHeight: lastKnownValidBlockHeight }); return lastKnownValidBlock; } diff --git a/lib/bitcoin/EventCode.ts b/lib/bitcoin/EventCode.ts new file mode 100644 index 000000000..37b5b4a7b --- /dev/null +++ b/lib/bitcoin/EventCode.ts @@ -0,0 +1,8 @@ +/** + * Event codes used by Bitcoin Processor. + */ +export default { + BitcoinProcessorDatabasesRevert: 'bitcoin_processor_databases_revert', + BitcoinProcessorObservingLoopFailed: 'bitcoin_processor_observing_loop_failed', + BitcoinProcessorObservingLoopSuccessful: `bitcoin_processor_observing_loop_successful` +};