From f9f34c6067a1e260ac8cd761c1f98bf2d6836b02 Mon Sep 17 00:00:00 2001 From: Maciej Hirsz <1096222+maciejhirsz@users.noreply.github.com> Date: Thu, 21 Feb 2019 16:20:52 +0100 Subject: [PATCH] Downgrade block on disconnect (#114) --- packages/backend/src/Chain.ts | 39 ++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/Chain.ts b/packages/backend/src/Chain.ts index d46c0d3..1701868 100644 --- a/packages/backend/src/Chain.ts +++ b/packages/backend/src/Chain.ts @@ -35,14 +35,7 @@ export default class Chain { this.nodes.add(node); this.feeds.broadcast(Feed.addedNode(node)); - node.events.once('disconnect', () => { - node.events.removeAllListeners(); - - this.nodes.delete(node); - this.feeds.broadcast(Feed.removedNode(node)); - - this.events.emit('disconnect', this.nodeCount); - }); + node.events.once('disconnect', () => this.removeNode(node)); node.events.on('block', () => this.updateBlock(node)); node.events.on('finalized', () => this.updateFinalized(node)); @@ -54,6 +47,19 @@ export default class Chain { this.updateFinalized(node); } + public removeNode(node: Node) { + node.events.removeAllListeners(); + + this.nodes.delete(node); + this.feeds.broadcast(Feed.removedNode(node)); + + this.events.emit('disconnect', this.nodeCount); + + if (this.height === node.best.number) { + this.downgradeBlock(); + } + } + public addFeed(feed: Feed) { this.feeds.add(feed); @@ -118,6 +124,23 @@ export default class Chain { console.log(`[${this.label}] ${node.name} imported ${height}, block time: ${node.blockTime / 1000}s, average: ${node.average / 1000}s | latency ${node.latency}`); } + private downgradeBlock() { + let height = 0 as Types.BlockNumber; + + for (const node of this.nodes) { + if (this.height === node.best.number) { + return; + } + + if (node.best.number > height) { + height = node.best.number; + } + } + + this.height = height; + this.feeds.broadcast(Feed.bestBlock(this.height, this.blockTimestamp, this.averageBlockTime)); + } + private updateFinalized(node: Node) { if (node.finalized.gt(this.finalized)) { this.finalized = node.finalized;