fix block sync. improve announce vs. sendInv.

This commit is contained in:
Christopher Jeffrey 2016-05-23 03:11:31 -07:00
parent cd4f6a71ae
commit ed08f36e07
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
2 changed files with 79 additions and 16 deletions

View File

@ -41,7 +41,7 @@ var constants = bcoin.protocol.constants;
* @property {Boolean} ack - Whether verack has been received. * @property {Boolean} ack - Whether verack has been received.
* @property {Boolean} connected * @property {Boolean} connected
* @property {Number} ts * @property {Number} ts
* @property {Boolean} sendHeaders - Whether the peer has * @property {Boolean} preferHeaders - Whether the peer has
* requested getheaders. * requested getheaders.
* @property {Boolean} haveWitness - Whether the peer supports segwit, * @property {Boolean} haveWitness - Whether the peer supports segwit,
* either notified via service bits or deprecated `havewitness` packet. * either notified via service bits or deprecated `havewitness` packet.
@ -90,7 +90,7 @@ function Peer(pool, options) {
this.ack = false; this.ack = false;
this.connected = false; this.connected = false;
this.ts = this.options.ts || 0; this.ts = this.options.ts || 0;
this.sendHeaders = false; this.preferHeaders = false;
this.haveWitness = false; this.haveWitness = false;
this.hashContinue = null; this.hashContinue = null;
this.spvFilter = null; this.spvFilter = null;
@ -229,7 +229,7 @@ Peer.prototype._init = function init() {
self.updateWatch(); self.updateWatch();
// Announce our currently broadcasted items. // Announce our currently broadcasted items.
self.sendInv(self.pool.inv.items); self.announce(self.pool.inv.items);
// Set a fee rate filter. // Set a fee rate filter.
if (self.pool.feeRate !== -1) if (self.pool.feeRate !== -1)
@ -295,20 +295,15 @@ Peer.prototype.createSocket = function createSocket(port, host) {
* @param {Block[]|TX[]|InvItem[]|BroadcastEntry[]} items * @param {Block[]|TX[]|InvItem[]|BroadcastEntry[]} items
*/ */
Peer.prototype.sendInv = function sendInv(items) { Peer.prototype.announce = function announce(items) {
var self = this; var self = this;
var inv = []; var inv = [];
var i, item, chunk; var headers = [];
var i, item;
if (this.destroyed) if (this.destroyed)
return; return;
if (!this.relay)
return;
if (!items)
return;
if (!Array.isArray(items)) if (!Array.isArray(items))
items = [items]; items = [items];
@ -318,21 +313,89 @@ Peer.prototype.sendInv = function sendInv(items) {
if (!this.isWatched(item)) if (!this.isWatched(item))
continue; continue;
if (this.preferHeaders) {
if (item instanceof bcoin.abstractblock) {
headers.push(item);
continue;
}
}
if (item.toInv) if (item.toInv)
item = item.toInv(); item = item.toInv();
if (!this.invFilter.added(item.hash, 'hex')) if (!this.relay) {
if (item.type === constants.inv.TX)
continue;
}
if (this.invFilter.test(item.hash, 'hex'))
continue; continue;
inv.push(item); inv.push(item);
} }
this.sendInv(inv);
if (headers.length > 0)
this.sendHeaders(headers);
};
/**
* Send inv to a peer.
* @param {InvItem[]} items
*/
Peer.prototype.sendInv = function sendInv(items) {
var self = this;
var inv = [];
var i, item, chunk;
if (this.destroyed)
return;
if (!Array.isArray(items))
items = [items];
for (i = 0; i < items.length; i++) {
item = items[i];
this.invFilter.add(item.hash, 'hex');
inv.push(item);
}
for (i = 0; i < inv.length; i += 50000) { for (i = 0; i < inv.length; i += 50000) {
chunk = inv.slice(i, i + 50000); chunk = inv.slice(i, i + 50000);
this.write(this.framer.inv(chunk)); this.write(this.framer.inv(chunk));
} }
}; };
/**
* Send headers to a peer.
* @param {Headers[]} items
*/
Peer.prototype.sendHeaders = function sendHeaders(items) {
var self = this;
var headers = [];
var i, item, chunk;
if (this.destroyed)
return;
if (!Array.isArray(items))
items = [items];
for (i = 0; i < items.length; i++) {
item = items[i];
this.invFilter.add(item.hash());
headers.push(item);
}
for (i = 0; i < headers.length; i += 2000) {
chunk = headers.slice(i, i + 2000);
this.write(this.framer.headers(chunk));
}
};
/** /**
* Send a `ping` packet. * Send a `ping` packet.
*/ */
@ -615,7 +678,7 @@ Peer.prototype._onPacket = function onPacket(packet) {
this.fire(cmd, payload); this.fire(cmd, payload);
break; break;
case 'sendheaders': case 'sendheaders':
this.sendHeaders = true; this.preferHeaders = true;
this.fire(cmd, payload); this.fire(cmd, payload);
break; break;
case 'havewitness': case 'havewitness':
@ -903,7 +966,7 @@ Peer.prototype._handleGetHeaders = function _handleGetHeaders(payload) {
if (err) if (err)
return self.emit('error', err); return self.emit('error', err);
self.write(self.framer.headers(headers)); self.sendHeaders(headers);
} }
if (!payload.locator) if (!payload.locator)

View File

@ -1735,10 +1735,10 @@ Pool.prototype.announce = function announce(msg) {
var i; var i;
if (this.peers.load) if (this.peers.load)
this.peers.load.sendInv(msg); this.peers.load.announce(msg);
for (i = 0; i < this.peers.regular.length; i++) for (i = 0; i < this.peers.regular.length; i++)
this.peers.regular[i].sendInv(msg); this.peers.regular[i].announce(msg);
}; };
/** /**