diff --git a/lib/bcoin/chain.js b/lib/bcoin/chain.js index 6c5306ab..d40578b3 100644 --- a/lib/bcoin/chain.js +++ b/lib/bcoin/chain.js @@ -1021,8 +1021,7 @@ Chain.prototype.add = function add(initial, peer, callback, force) { seen: true }, peer); - if (self.options.headers) - self.emit('verify-error', block, 'bad-prevblk', 0, peer); + self.emit('verify-error', block, 'bad-prevblk', 0, peer); return done(); } @@ -1046,8 +1045,7 @@ Chain.prototype.add = function add(initial, peer, callback, force) { hash: hash, seen: false }, peer); - if (self.options.headers) - self.emit('verify-error', block, 'bad-prevblk', 0, peer); + self.emit('verify-error', block, 'bad-prevblk', 0, peer); return done(); } diff --git a/lib/bcoin/peer.js b/lib/bcoin/peer.js index 131fd97e..2dd78279 100644 --- a/lib/bcoin/peer.js +++ b/lib/bcoin/peer.js @@ -120,7 +120,7 @@ Peer.prototype._init = function init() { this.socket.once('error', function(err) { self._error(err); - self.pool.setMisbehavior(self, 100); + self.setMisbehavior(100); }); this.socket.once('close', function() { @@ -141,7 +141,7 @@ Peer.prototype._init = function init() { self._error(err); // Something is wrong here. // Ignore this peer. - self.pool.setMisbehavior(self, 100); + self.setMisbehavior(100); }); this.challenge = utils.nonce(); @@ -506,35 +506,25 @@ Peer.prototype._handleAddr = function handleAddr(addrs) { var now = utils.now(); addrs.forEach(function(addr) { - var ip, address4, address6; - - if (addr.ts <= 100000000 || addr.ts > now + 10 * 60) - addr.ts = now - 5 * 24 * 60 * 60; - - ip = addr.ipv4 !== '0.0.0.0' + var ts = addr.ts; + var host = addr.ipv4 !== '0.0.0.0' ? addr.ipv4 : addr.ipv6; - address4 = addr.ipv4 !== '0.0.0.0' - ? addr.ipv4 + ':' + addr.port - : null; - - address6 = '[' + addr.ipv6 + ']:' + addr.port; + if (ts <= 100000000 || ts > now + 10 * 60) + ts = now - 5 * 24 * 60 * 60; this.emit('addr', { - date: new Date(addr.ts * 1000), - ts: addr.ts, + ts: ts, services: addr.services, - ip: ip, - ipv4: addr.ipv4, - ipv6: addr.ipv6, - host: ip, - host4: addr.ipv4, - host6: addr.ipv6, + host: host, port: addr.port || network.port, - address: address4 || address6, - address4: address4, - address6: address6 + network: addr.network, + bloom: addr.bloom, + getutxo: addr.getutxo, + witness: addr.witness, + headers: addr.version >= 31800, + spv: addr.bloom && addr.version >= 70011 }); }, this); diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index 8e4d9beb..0e6db599 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -814,6 +814,15 @@ Pool.prototype._createPeer = function _createPeer(options) { if (self.options.discoverPeers === false) return; + if (!data.network) + return; + + if (self.options.spv && !data.spv) + return; + + if (self.options.witness && !data.witness) + return; + if (self.seeds.length > 300) self.setSeeds(self.seeds.slice(-150)); @@ -1805,6 +1814,71 @@ Pool.prototype.getSeed = function getSeed(priority) { } }; +Pool.prototype.getSeed = function getSeed(priority) { + var addr; + + if (priority) { + addr = this._getRandom(this.originalSeeds); + if (addr) + return addr; + + addr = this._getRandom(this.seeds); + if (addr) + return addr; + + addr = this.seeds[Math.random() * (this.seeds.length - 1) | 0]; + if (addr) + return addr; + + return this.originalSeeds[Math.random() * (this.originalSeeds.length - 1) | 0]; + } + + // Hang back if we don't have a loader peer yet. + if (!this.peers.load) + return; + + // Need at least one block peer. + if (this.originalSeeds.length + this.seeds.length === 1) { + assert(this.originalSeeds[0]); + return this.originalSeeds[0]; + } + + addr = this._getRandom(this.originalSeeds, true); + if (addr) + return addr; + + addr = this._getRandom(this.seeds, true); + if (addr) + return addr; +}; + +Pool.prototype._getRandom = function _getRandom(seeds, uniq) { + var tried = {}; + var tries = 0; + var index, addr; + + for (;;) { + if (tries === seeds.length) + return; + + index = Math.round(Math.random() * (seeds.length - 1)); + addr = seeds[index]; + + if (!tried[index]) { + tried[index] = true; + tries++; + } + + if (this.isMisbehaving(addr.host)) + continue; + + if (uniq && this.getPeer(addr.host)) + continue; + + return addr; + } +}; + Pool.prototype.setSeeds = function setSeeds(seeds) { this.seeds = []; this.hosts = {};