chain: refactor reorgs.

This commit is contained in:
Christopher Jeffrey 2016-10-06 04:34:58 -07:00
parent b0d3ad8452
commit e2d51352a8
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -748,46 +748,48 @@ Chain.prototype.findFork = co(function* findFork(fork, longer) {
* Called when a competing chain with a higher chainwork
* is received.
* @private
* @param {ChainEntry} entry - The competing chain's tip.
* @param {ChainEntry} competitor - The competing chain's tip.
* @param {Block|MerkleBlock} block - The being being added.
* @returns {Promise}
*/
Chain.prototype.reorganize = co(function* reorganize(entry, block) {
Chain.prototype.reorganize = co(function* reorganize(competitor, block) {
var tip = this.tip;
var fork = yield this.findFork(tip, entry);
var fork = yield this.findFork(tip, competitor);
var disconnect = [];
var connect = [];
var i, e;
var i, entry;
assert(fork);
// Disconnect blocks/txs.
e = tip;
while (e.hash !== fork.hash) {
disconnect.push(e);
e = yield e.getPrevious();
assert(e);
// Blocks to disconnect.
entry = tip;
while (entry.hash !== fork.hash) {
disconnect.push(entry);
entry = yield entry.getPrevious();
assert(entry);
}
// Blocks to connect.
entry = competitor;
while (entry.hash !== fork.hash) {
connect.push(entry);
entry = yield entry.getPrevious();
assert(entry);
}
// Disconnect blocks/txs.
for (i = 0; i < disconnect.length; i++) {
e = disconnect[i];
yield this.disconnect(e);
}
// Disconnect blocks/txs.
e = entry;
while (e.hash !== fork.hash) {
connect.push(e);
e = yield e.getPrevious();
assert(e);
entry = disconnect[i];
yield this.disconnect(entry);
}
// Connect blocks/txs.
// We don't want to connect the new tip here.
// That will be done outside in setBestChain.
for (i = connect.length - 1; i >= 1; i--) {
e = connect[i];
yield this.reconnect(e);
entry = connect[i];
yield this.reconnect(entry);
}
this.emit('reorganize', block, tip.height, tip.hash);