fix block sync. improve announce vs. sendInv.
This commit is contained in:
parent
cd4f6a71ae
commit
ed08f36e07
@ -41,7 +41,7 @@ var constants = bcoin.protocol.constants;
|
||||
* @property {Boolean} ack - Whether verack has been received.
|
||||
* @property {Boolean} connected
|
||||
* @property {Number} ts
|
||||
* @property {Boolean} sendHeaders - Whether the peer has
|
||||
* @property {Boolean} preferHeaders - Whether the peer has
|
||||
* requested getheaders.
|
||||
* @property {Boolean} haveWitness - Whether the peer supports segwit,
|
||||
* either notified via service bits or deprecated `havewitness` packet.
|
||||
@ -90,7 +90,7 @@ function Peer(pool, options) {
|
||||
this.ack = false;
|
||||
this.connected = false;
|
||||
this.ts = this.options.ts || 0;
|
||||
this.sendHeaders = false;
|
||||
this.preferHeaders = false;
|
||||
this.haveWitness = false;
|
||||
this.hashContinue = null;
|
||||
this.spvFilter = null;
|
||||
@ -229,7 +229,7 @@ Peer.prototype._init = function init() {
|
||||
self.updateWatch();
|
||||
|
||||
// Announce our currently broadcasted items.
|
||||
self.sendInv(self.pool.inv.items);
|
||||
self.announce(self.pool.inv.items);
|
||||
|
||||
// Set a fee rate filter.
|
||||
if (self.pool.feeRate !== -1)
|
||||
@ -295,20 +295,15 @@ Peer.prototype.createSocket = function createSocket(port, host) {
|
||||
* @param {Block[]|TX[]|InvItem[]|BroadcastEntry[]} items
|
||||
*/
|
||||
|
||||
Peer.prototype.sendInv = function sendInv(items) {
|
||||
Peer.prototype.announce = function announce(items) {
|
||||
var self = this;
|
||||
var inv = [];
|
||||
var i, item, chunk;
|
||||
var headers = [];
|
||||
var i, item;
|
||||
|
||||
if (this.destroyed)
|
||||
return;
|
||||
|
||||
if (!this.relay)
|
||||
return;
|
||||
|
||||
if (!items)
|
||||
return;
|
||||
|
||||
if (!Array.isArray(items))
|
||||
items = [items];
|
||||
|
||||
@ -318,21 +313,89 @@ Peer.prototype.sendInv = function sendInv(items) {
|
||||
if (!this.isWatched(item))
|
||||
continue;
|
||||
|
||||
if (this.preferHeaders) {
|
||||
if (item instanceof bcoin.abstractblock) {
|
||||
headers.push(item);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (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;
|
||||
|
||||
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) {
|
||||
chunk = inv.slice(i, i + 50000);
|
||||
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.
|
||||
*/
|
||||
@ -615,7 +678,7 @@ Peer.prototype._onPacket = function onPacket(packet) {
|
||||
this.fire(cmd, payload);
|
||||
break;
|
||||
case 'sendheaders':
|
||||
this.sendHeaders = true;
|
||||
this.preferHeaders = true;
|
||||
this.fire(cmd, payload);
|
||||
break;
|
||||
case 'havewitness':
|
||||
@ -903,7 +966,7 @@ Peer.prototype._handleGetHeaders = function _handleGetHeaders(payload) {
|
||||
if (err)
|
||||
return self.emit('error', err);
|
||||
|
||||
self.write(self.framer.headers(headers));
|
||||
self.sendHeaders(headers);
|
||||
}
|
||||
|
||||
if (!payload.locator)
|
||||
|
||||
@ -1735,10 +1735,10 @@ Pool.prototype.announce = function announce(msg) {
|
||||
var i;
|
||||
|
||||
if (this.peers.load)
|
||||
this.peers.load.sendInv(msg);
|
||||
this.peers.load.announce(msg);
|
||||
|
||||
for (i = 0; i < this.peers.regular.length; i++)
|
||||
this.peers.regular[i].sendInv(msg);
|
||||
this.peers.regular[i].announce(msg);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user