From 271ca1aa52ca4198a64a4a71c3f7e702350cbf94 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 20 Jan 2016 12:44:36 -0800 Subject: [PATCH] better fork handling for peers. --- lib/bcoin/chain.js | 4 ++-- lib/bcoin/pool.js | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/bcoin/chain.js b/lib/bcoin/chain.js index 8ec39958..74d2f87f 100644 --- a/lib/bcoin/chain.js +++ b/lib/bcoin/chain.js @@ -324,7 +324,7 @@ Chain.prototype.add = function add(block, peer) { height: -1, expected: this.orphan.map[prevHash].hash('hex'), received: hash, - checkpoint: null + checkpoint: false }, peer); code = Chain.codes.forked; break; @@ -384,7 +384,7 @@ Chain.prototype.add = function add(block, peer) { height: prevHeight + 1, expected: tip.hash, received: hash, - checkpoint: null + checkpoint: false }, peer); code = Chain.codes.forked; break; diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index fb1111bf..d890402b 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -193,10 +193,25 @@ Pool.prototype._init = function _init() { peer ? peer.host : '' ); + self.emit('reorg', [data.expected, data.received]); + if (!peer) return; - self.misbehaving(peer, 100); + // If we failed a checkpoint, peer is misbehaving. + if (data.checkpoint) { + self.misbehaving(peer, 100); + return; + } + + // Only destroy peer here. Wait for higher chain. + peer.destroy(); + + // Remove the peers from the tried list after 5 seconds. + setTimeout(function() { + delete self.peers.tries.priority[peer.host]; + delete self.peers.tries.regular[peer.host]; + }, 5 * 1000); }); this.chain.on('invalid', function(data, peer) {