From de163ad4c94bc58f47538d0c4a47935a4c474610 Mon Sep 17 00:00:00 2001 From: Chris Kleeschulte Date: Thu, 14 Sep 2017 10:10:07 -0400 Subject: [PATCH] Fixed issues with reorg again. --- lib/node.js | 8 -- lib/services/block/index.js | 32 +++++--- lib/services/header/index.js | 3 +- lib/services/p2p/index.js | 2 +- package-lock.json | 98 +++++++++++++------------ package.json | 2 +- test/services/address/index.unit.js | 1 - test/services/block/index.unit.js | 1 - test/services/header/index.unit.js | 1 - test/services/mempool/index.unit.js | 1 - test/services/transaction/index.unit.js | 1 - 11 files changed, 78 insertions(+), 72 deletions(-) diff --git a/lib/node.js b/lib/node.js index 7825669d..3f90cfc9 100644 --- a/lib/node.js +++ b/lib/node.js @@ -201,14 +201,6 @@ Node.prototype.start = function(callback) { ); }; -Node.prototype.getNetworkName = function() { - var network = this.network.name; - if (this.network.regtestEnabled) { - network = 'regtest'; - } - return network; -}; - Node.prototype.stop = function(callback) { log.info('Beginning shutdown'); diff --git a/lib/services/block/index.js b/lib/services/block/index.js index f515df13..6be4d1bd 100644 --- a/lib/services/block/index.js +++ b/lib/services/block/index.js @@ -191,11 +191,12 @@ BlockService.prototype._checkTip = function(callback) { assert(self._reorgQueue.length === 0, 'Reorg Queue is not the expected length.'); + var hash = header.hash; if (self._reorgQueue.indexOf(hash) === -1) { self._reorgQueue.push(hash); } - self._handleReorg(headers, callback); + self._handleReorg(hash, headers, callback); }); @@ -397,13 +398,12 @@ BlockService.prototype._getHash = function(blockArg, callback) { }; -BlockService.prototype._handleReorg = function(allHeaders, callback) { +BlockService.prototype._handleReorg = function(reorgHash, allHeaders, callback) { var self = this; self._reorging = true; - var reorgHash = self._reorgQueue.shift(); var reorgHeader = allHeaders.get(reorgHash); assert(reorgHeader, 'We were asked to reorg to a non-existent hash.'); @@ -631,19 +631,33 @@ BlockService.prototype._setListeners = function() { self._header.once('headers', self._onAllHeaders.bind(self)); - self._header.on('reorg', function(hash, headers) { + self._header.on('reorg', function(block, headers) { log.debug('Block Service: detected a reorg from the header service.'); - if (self._reorgQueue.indexOf(hash) === -1) { - self._reorgQueue.push(hash); + if (self._reorgQueue.indexOf(block) === -1) { + self._reorgQueue.push(block); } + var _block; + async.whilst(function() { - return self._reorgQueue.length > 0; + _block = self._reorgQueue.shift(); + return _block; }, function(next) { - self._handleReorg(headers, next); - }, self._startSync.bind(self)); + self._handleReorg(_block.rhash(), headers, function(err) { + if (err) { + return next(err); + } + self._onBlock(_block); + next(); + }); + }, function(err) { + if (err) { + log.error(err); + self.nodes.stop(); + } + }); }); diff --git a/lib/services/header/index.js b/lib/services/header/index.js index a07deb58..9458f625 100644 --- a/lib/services/header/index.js +++ b/lib/services/header/index.js @@ -606,7 +606,7 @@ HeaderService.prototype._handleReorg = function(block, commonHeader, callback) { // emit the fact that there is a reorg even though the block // service may not have reached this point in its sync. // Let the block service sort that our - self.emit('reorg', hash, headers); + self.emit('reorg', block, headers); return callback(); }); @@ -635,6 +635,7 @@ HeaderService.prototype._onReorg = function(reorgHeader, headers, commonHeader, // setting our tip to the common ancestor this._tip.hash = commonHeader.hash; this._tip.height = commonHeader.height; + this._lastHeader = commonHeader; this._db.batch(ops, callback); }; diff --git a/lib/services/p2p/index.js b/lib/services/p2p/index.js index 5535d510..47fe7a58 100644 --- a/lib/services/p2p/index.js +++ b/lib/services/p2p/index.js @@ -344,7 +344,7 @@ P2P.prototype._onPeerReady = function(peer, addr) { if (this._currentRequest) { log.info('Restarting last query'); this.clearInventoryCache(); - this.getBlocks(this._currentRequest); + this.getP2PBlock(this._currentRequest); } if (bestHeight >= 0) { diff --git a/package-lock.json b/package-lock.json index 5367b49d..8656e367 100644 --- a/package-lock.json +++ b/package-lock.json @@ -194,68 +194,77 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" }, "bcoin": { - "version": "github:bcoin-org/bcoin#57b98b2368c8106a9c215d73e40e1a7ae39042f3", + "version": "github:bitpay/bcoin#46ecd2c4ed3b7fbcadd9cfe10b0f5d64e4c5088d", "requires": { "bcoin-native": "0.0.23", - "bn.js": "4.11.8", + "bn.js": "4.11.7", "elliptic": "6.4.0", "leveldown": "1.7.2", - "n64": "0.0.18", - "secp256k1": "3.3.0", - "socket.io": "2.0.3", - "socket.io-client": "2.0.3" + "n64": "0.0.12", + "secp256k1": "3.2.5", + "socket.io": "2.0.1", + "socket.io-client": "2.0.1" }, "dependencies": { - "secp256k1": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", - "integrity": "sha512-CbrQoeGG5V0kQ1ohEMGI+J7oKerapLTpivLICBaXR0R4HyQcN3kM9itLsV5fdpV1UR1bD14tOkJ1xughmlDIiQ==", - "optional": true, - "requires": { - "bindings": "1.2.1", - "bip66": "1.1.5", - "bn.js": "4.11.8", - "create-hash": "1.1.3", - "drbg.js": "1.0.1", - "elliptic": "6.4.0", - "nan": "2.6.2", - "prebuild-install": "2.2.0", - "safe-buffer": "5.1.1" - } + "bn.js": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==" + }, + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "optional": true + }, + "n64": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/n64/-/n64-0.0.12.tgz", + "integrity": "sha512-Apl4Wy7GeLySDv2974ajM80DTTuD/RHk59ORtkR/jsbt9hmPcKJYzUkjFIGOlUMA13nvx7sY2fet+Lb6KYQdWA==" }, "socket.io": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.3.tgz", - "integrity": "sha1-Q1nwaiSTOua9CHeYr3jGgOrjReM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.1.tgz", + "integrity": "sha1-BkwSUXhGLkd6bfI9L9rRjdHFkU8=", "optional": true, "requires": { "debug": "2.6.8", "engine.io": "3.1.0", "object-assign": "4.1.1", "socket.io-adapter": "1.1.0", - "socket.io-client": "2.0.3", + "socket.io-client": "2.0.1", "socket.io-parser": "3.1.2" } }, "socket.io-client": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz", - "integrity": "sha1-bK9K/5+FsZ/ZG2zhPWmttWT4hzs=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.1.tgz", + "integrity": "sha1-HVL4x0Zgxou2aVlT+hGZcRVfrZM=", "optional": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "2.6.8", + "debug": "2.6.4", "engine.io-client": "3.1.1", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", - "parseqs": "0.0.5", "parseuri": "0.0.5", "socket.io-parser": "3.1.2", "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", + "integrity": "sha1-dYaps8OXQcAoKuM0RcTorHRzT+A=", + "optional": true, + "requires": { + "ms": "0.7.3" + } + } } } } @@ -2906,9 +2915,9 @@ } }, "mocha": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.1.tgz", - "integrity": "sha512-2jD6NS4PNKVDpaICERx8vEkXaisx2MlRKxj5KuFJVZJdK1zRGs/HnS3OeH7zXhXAbGlzaMIan4Kwpm4O5hORnA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", "requires": { "browser-stdout": "1.3.0", "commander": "2.9.0", @@ -2979,11 +2988,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "n64": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/n64/-/n64-0.0.18.tgz", - "integrity": "sha512-z5gRoCNFTY5fderO8n5tt6p7+jZiivzN1LhuR4EqrTkciYDCpJy8xkwkd1YO5eyfimeLAjXy/6k3FLC+GQ6lLw==" - }, "nan": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", @@ -4229,6 +4233,14 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", @@ -4248,14 +4260,6 @@ "strip-ansi": "3.0.1" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", diff --git a/package.json b/package.json index d46b7ddb..36919af9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ ], "dependencies": { "async": "^2.5.0", - "bcoin": "1.0.0-beta.14", + "bcoin": "bitpay/bcoin#v1.0.0-beta.14+cash", "bitcoind-rpc": "^0.6.0", "bitcore-lib": "5.0.0-beta.1", "bitcore-p2p": "5.0.0-beta.1", diff --git a/test/services/address/index.unit.js b/test/services/address/index.unit.js index 54532204..f06dd9f7 100644 --- a/test/services/address/index.unit.js +++ b/test/services/address/index.unit.js @@ -20,7 +20,6 @@ describe('Address Service', function() { sandbox = sinon.sandbox.create(); addressService = new AddressService({ node: { - getNetworkName: function() { return 'regtest'; }, services: [] } }); diff --git a/test/services/block/index.unit.js b/test/services/block/index.unit.js index 21d66827..0a96bbc2 100644 --- a/test/services/block/index.unit.js +++ b/test/services/block/index.unit.js @@ -19,7 +19,6 @@ describe('Block Service', function() { sandbox = sinon.sandbox.create(); blockService = new BlockService({ node: { - getNetworkName: function() { return 'regtest'; }, services: [] } }); diff --git a/test/services/header/index.unit.js b/test/services/header/index.unit.js index b04976c8..374afbdc 100644 --- a/test/services/header/index.unit.js +++ b/test/services/header/index.unit.js @@ -22,7 +22,6 @@ describe('Header Service', function() { sandbox = sinon.sandbox.create(); headerService = new HeaderService({ node: { - getNetworkName: function() { return 'regtest'; }, services: [] } }); diff --git a/test/services/mempool/index.unit.js b/test/services/mempool/index.unit.js index fbf217a2..748197b3 100644 --- a/test/services/mempool/index.unit.js +++ b/test/services/mempool/index.unit.js @@ -18,7 +18,6 @@ describe('Mempool Service', function() { sandbox = sinon.sandbox.create(); mempoolService = new MempoolService({ node: { - getNetworkName: function() { return 'regtest'; }, services: [] } }); diff --git a/test/services/transaction/index.unit.js b/test/services/transaction/index.unit.js index 5eedd334..86aa1a80 100644 --- a/test/services/transaction/index.unit.js +++ b/test/services/transaction/index.unit.js @@ -18,7 +18,6 @@ describe('Transaction Service', function() { sandbox = sinon.sandbox.create(); txService = new TxService({ node: { - getNetworkName: function() { return 'regtest'; }, services: [] } });