From 9950e23489e0db277479f13c442d24e7482e71cb Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Thu, 10 Aug 2017 09:00:09 +0200
Subject: [PATCH] [fix] #1062 Proof-of-work was always restarting during a sync

---
 app/modules/crawler/index.ts       |  3 +--
 app/modules/crawler/lib/crawler.ts | 11 ++++++++---
 package.json                       |  1 +
 server.ts                          | 24 ++++++++++++++++--------
 yarn.lock                          | 18 +++++++++---------
 5 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/app/modules/crawler/index.ts b/app/modules/crawler/index.ts
index b51e0a52d..17af752a1 100644
--- a/app/modules/crawler/index.ts
+++ b/app/modules/crawler/index.ts
@@ -4,7 +4,6 @@ import {Contacter} from "./lib/contacter"
 import {Crawler} from "./lib/crawler"
 import {Synchroniser} from "./lib/sync"
 import {req2fwd} from "./lib/req2fwd"
-import {CrawlerConstants} from "./lib/constants"
 import {rawer} from "../../lib/common-libs/index"
 import {PeerDTO} from "../../lib/dto/PeerDTO"
 import {Buid} from "../../lib/common-libs/buid"
@@ -13,7 +12,7 @@ export const CrawlerDependency = {
   duniter: {
 
     service: {
-      input: (server:Server, conf:ConfDTO, logger:any) => new Crawler(server, conf, logger)
+      process: (server:Server, conf:ConfDTO, logger:any) => new Crawler(server, conf, logger)
     },
 
     methods: {
diff --git a/app/modules/crawler/lib/crawler.ts b/app/modules/crawler/lib/crawler.ts
index 370ce2451..55735ea2f 100644
--- a/app/modules/crawler/lib/crawler.ts
+++ b/app/modules/crawler/lib/crawler.ts
@@ -360,6 +360,7 @@ export class BlockCrawler {
           this.logger && this.logger.trace("Try with %s %s", p.getURL(), p.pubkey.substr(0, 6));
           try {
             let node:any = await connect(p);
+            let nodeCurrent:BlockDTO|null = null
             node.pubkey = p.pubkey;
             await checkPeerValidity(server, p, node);
 
@@ -375,7 +376,8 @@ export class BlockCrawler {
                 return server.dal.getCurrentBlockOrNull()
               }
               async remoteCurrent(source?: any): Promise<BlockDTO | null> {
-                return source.getCurrent()
+                nodeCurrent = await source.getCurrent()
+                return nodeCurrent
               }
               async remotePeers(source?: any): Promise<PeerDTO[]> {
                 return Promise.resolve([node])
@@ -396,14 +398,17 @@ export class BlockCrawler {
                 return block;
               }
               async applyMainBranch(block: BlockDTO): Promise<boolean> {
-                let addedBlock = await server.BlockchainService.submitBlock(block, true, CrawlerConstants.FORK_ALLOWED);
+                let addedBlock = await server.writeBlock(block, false)
                 if (!this.lastDownloaded) {
                   this.lastDownloaded = await dao.remoteCurrent(node);
                 }
                 this.crawler.pullingEvent(server, 'applying', {number: block.number, last: this.lastDownloaded && this.lastDownloaded.number});
                 if (addedBlock) {
                   current = addedBlock;
-                  server.streamPush(addedBlock);
+                  // Emit block events (for sharing with the network) only in forkWindowSize
+                  if (nodeCurrent && nodeCurrent.number - addedBlock.number < server.conf.forksize) {
+                    server.streamPush(addedBlock);
+                  }
                 }
                 return true
               }
diff --git a/package.json b/package.json
index a40820a7e..356f32c33 100644
--- a/package.json
+++ b/package.json
@@ -74,6 +74,7 @@
     "heapdump": "^0.3.9",
     "inquirer": "3.0.6",
     "jison": "0.4.17",
+    "js-yaml": "3.8.2",
     "merkle": "0.5.1",
     "moment": "2.18.1",
     "morgan": "1.8.1",
diff --git a/server.ts b/server.ts
index f707d0211..2809e588f 100644
--- a/server.ts
+++ b/server.ts
@@ -192,9 +192,11 @@ export class Server extends stream.Duplex implements HookableServer {
     return await this.writeBlock(obj)
   }
 
-  async writeBlock(obj:any) {
+  async writeBlock(obj:any, notify = true) {
     const res = await this.BlockchainService.submitBlock(obj, true, CrawlerConstants.FORK_ALLOWED)
-    this.emitDocument(res, DuniterDocument.ENTITY_BLOCK)
+    if (notify) {
+      this.emitDocument(res, DuniterDocument.ENTITY_BLOCK)
+    }
     return res
   }
 
@@ -242,9 +244,11 @@ export class Server extends stream.Duplex implements HookableServer {
     return await this.writeRevocation(obj)
   }
 
-  async writeRevocation(obj:any) {
+  async writeRevocation(obj:any, notify = true) {
     const res = await this.IdentityService.submitRevocation(obj)
-    this.emitDocument(res, DuniterDocument.ENTITY_REVOCATION)
+    if (notify) {
+      this.emitDocument(res, DuniterDocument.ENTITY_REVOCATION)
+    }
     return res
   }
 
@@ -253,9 +257,11 @@ export class Server extends stream.Duplex implements HookableServer {
     return await this.writeTransaction(obj)
   }
 
-  async writeTransaction(obj:any) {
+  async writeTransaction(obj:any, notify = true) {
     const res = await this.TransactionsService.processTx(obj)
-    this.emitDocument(res, DuniterDocument.ENTITY_TRANSACTION)
+    if (notify) {
+      this.emitDocument(res, DuniterDocument.ENTITY_TRANSACTION)
+    }
     return res
   }
 
@@ -264,9 +270,11 @@ export class Server extends stream.Duplex implements HookableServer {
     return await this.writePeer(obj)
   }
 
-  async writePeer(obj:any) {
+  async writePeer(obj:any, notify = true) {
     const res = await this.PeeringService.submitP(obj)
-    this.emitDocument(res, DuniterDocument.ENTITY_PEER)
+    if (notify) {
+      this.emitDocument(res, DuniterDocument.ENTITY_PEER)
+    }
     return res
   }
 
diff --git a/yarn.lock b/yarn.lock
index 9ce11698d..1eb4771b3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -803,13 +803,13 @@ debug-log@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
 
-debug@2.6.1:
+debug@2.6.1, debug@^2.1.1:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
   dependencies:
     ms "0.7.2"
 
-debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.6.3:
+debug@2.6.8, debug@^2.2.0, debug@^2.6.3:
   version "2.6.8"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
   dependencies:
@@ -1108,9 +1108,9 @@ esprima@1.1.x, esprima@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549"
 
-esprima@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+esprima@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
 
 "esprima@~ 1.0.2":
   version "1.0.4"
@@ -2008,12 +2008,12 @@ js-yaml@3.0.1:
     argparse "~ 0.1.11"
     esprima "~ 1.0.2"
 
-js-yaml@^3.2.5, js-yaml@^3.5.1:
-  version "3.9.1"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0"
+js-yaml@3.8.2, js-yaml@^3.2.5, js-yaml@^3.5.1:
+  version "3.8.2"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721"
   dependencies:
     argparse "^1.0.7"
-    esprima "^4.0.0"
+    esprima "^3.1.1"
 
 jsbn@~0.1.0:
   version "0.1.1"
-- 
GitLab