diff --git a/lib/bcoin/chain.js b/lib/bcoin/chain.js index 5a42fd6e..058121ad 100644 --- a/lib/bcoin/chain.js +++ b/lib/bcoin/chain.js @@ -13,6 +13,10 @@ var network = bcoin.protocol.network; var utils = bcoin.utils; var assert = utils.assert; +/** + * Chain + */ + function Chain(options) { var preload = network.preload; diff --git a/lib/bcoin/peer.js b/lib/bcoin/peer.js index 8b82fd99..5730386d 100644 --- a/lib/bcoin/peer.js +++ b/lib/bcoin/peer.js @@ -332,19 +332,26 @@ Peer.prototype._onPacket = function onPacket(packet) { if (cmd === 'version') return this._handleVersion(payload); - else if (cmd === 'inv') + + if (cmd === 'inv') return this._handleInv(payload); - else if (cmd === 'headers') + + if (cmd === 'headers') return this._handleHeaders(payload); - else if (cmd === 'getdata') + + if (cmd === 'getdata') return this._handleGetData(payload); - else if (cmd === 'addr') + + if (cmd === 'addr') return this._handleAddr(payload); - else if (cmd === 'ping') + + if (cmd === 'ping') return this._handlePing(payload); - else if (cmd === 'pong') + + if (cmd === 'pong') return this._handlePong(payload); - else if (cmd === 'getaddr') + + if (cmd === 'getaddr') return this._handleGetAddr(); if (cmd === 'merkleblock' || cmd === 'block') { @@ -355,10 +362,11 @@ Peer.prototype._onPacket = function onPacket(packet) { payload._network = true; payload = bcoin.tx(payload, this.lastBlock); } + if (this._res(cmd, payload)) return; - else - this.emit(cmd, payload); + + this.emit(cmd, payload); }; Peer.prototype._handleVersion = function handleVersion(payload) { @@ -385,11 +393,11 @@ Peer.prototype._handleGetData = function handleGetData(items) { }; Peer.prototype._handleAddr = function handleAddr(addrs) { - var now = Date.now(); + var now = Date.now() / 1000 | 0; addrs.forEach(function(addr) { - // bitcoind does this for some reason: if (addr.ts <= 100000000 || addr.ts > now + 10 * 60) addr.ts = now - 5 * 24 * 60 * 60; + this.emit('addr', { date: new Date(addr.ts * 1000), ts: addr.ts, @@ -415,12 +423,13 @@ Peer.prototype._handlePong = function handlePong() { Peer.prototype._handleGetAddr = function handleGetAddr() { var used = []; - var peers = [].concat( + var peers, addrs; + + peers = [].concat( this.pool.peers.pending, this.pool.peers.block, this.pool.peers.load ).filter(Boolean); - var addrs; // NOTE: For IPv6 BTC uses: // '0000:0000:0000:0000:0000:xxxx:xxxx:ffff' @@ -471,6 +480,8 @@ Peer.prototype._handleGetAddr = function handleGetAddr() { }; Peer.prototype._handleInv = function handleInv(items) { + var req, i, block, hash; + // Always request advertised TXs var txs = items.filter(function(item) { return item.type === 'tx'; @@ -483,8 +494,6 @@ Peer.prototype._handleInv = function handleInv(items) { return item.hash; }); - var req, i, block, hash; - if (blocks.length === 1) this.bestBlock = utils.toHex(blocks[0]); diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index 048b282b..97983d7c 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -587,6 +587,7 @@ Pool.prototype.unwatch = function unwatch(id) { // Resend it to peers if (this.peers.load) this.peers.load.updateWatch(); + for (i = 0; i < this.peers.block.length; i++) this.peers.block[i].updateWatch(); }; @@ -618,6 +619,7 @@ Pool.prototype.addWallet = function addWallet(w, defaultTs) { // Search for last week by default if (!ts) ts = defaultTs || ((+new Date / 1000) - 7 * 24 * 3600); + self.search(false, ts, e); } @@ -760,12 +762,6 @@ Pool.prototype._request = function _request(type, hash, options, cb) { if (this.request.map[hash]) return this.request.map[hash].addCallback(cb); - // Block should be not in chain, or be requested - if (!options.force && type === 'block') - return this.chain.has(hash, true, next); - else - return next(false); - function next(has) { if (has) return; @@ -776,6 +772,12 @@ Pool.prototype._request = function _request(type, hash, options, cb) { var req = new LoadRequest(self, type, hash, cb); req.add(options.noQueue); } + + // Block should be not in chain, or be requested + if (!options.force && type === 'block') + return this.chain.has(hash, true, next); + + return next(false); }; Pool.prototype._response = function _response(entity) {