Added tests for _syncBitcoindRewind
This commit is contained in:
parent
93ed8bfd8d
commit
9890a4f0da
23
lib/node.js
23
lib/node.js
@ -144,39 +144,40 @@ Node.prototype._syncBitcoindRewind = function(block, done) {
|
|||||||
self._syncBitcoindAncestor(block, function(err, ancestorHash) {
|
self._syncBitcoindAncestor(block, function(err, ancestorHash) {
|
||||||
|
|
||||||
// Rewind the chain to the common ancestor
|
// Rewind the chain to the common ancestor
|
||||||
async.doWhilst(
|
async.whilst(
|
||||||
|
function() {
|
||||||
|
// Wait until the tip equals the ancestor hash
|
||||||
|
return self.chain.tip.hash !== ancestorHash;
|
||||||
|
},
|
||||||
function(removeDone) {
|
function(removeDone) {
|
||||||
|
|
||||||
var block = self.chain.tip;
|
var tip = self.chain.tip;
|
||||||
|
|
||||||
self.getBlock(block.prevHash, function(err, previousTip) {
|
self.getBlock(tip.prevHash, function(err, previousTip) {
|
||||||
if (err) {
|
if (err) {
|
||||||
removeDone(err);
|
removeDone(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.db._onChainRemoveBlock(block, function(err) {
|
// Undo the related indexes for this block
|
||||||
|
self.db._onChainRemoveBlock(tip, function(err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return removeDone(err);
|
return removeDone(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the new tip
|
||||||
delete self.chain.tip.__transactions;
|
delete self.chain.tip.__transactions;
|
||||||
var previousHeight = self.chain.tip.__height - 1;
|
previousTip.__height = self.chain.tip.__height - 1;
|
||||||
previousTip.__height = previousHeight;
|
|
||||||
self.chain.tip = previousTip;
|
self.chain.tip = previousTip;
|
||||||
self.chain.saveMetadata();
|
self.chain.saveMetadata();
|
||||||
self.chain.emit('removeblock', block);
|
self.chain.emit('removeblock', tip);
|
||||||
removeDone();
|
removeDone();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}, function() {
|
|
||||||
return self.chain.tip.hash !== ancestorHash;
|
|
||||||
}, done
|
}, done
|
||||||
);
|
);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -116,6 +116,51 @@ describe('Bitcoind Node', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('#_syncBitcoindRewind', function() {
|
||||||
|
it('will undo blocks 6 deep', function() {
|
||||||
|
var node = new Node({});
|
||||||
|
var ancestorHash = chainHashes[chainHashes.length - 6];
|
||||||
|
node.chain = {
|
||||||
|
tip: {
|
||||||
|
__height: 10,
|
||||||
|
hash: chainHashes[chainHashes.length],
|
||||||
|
prevHash: chainHashes[chainHashes.length - 1]
|
||||||
|
},
|
||||||
|
saveMetadata: sinon.stub(),
|
||||||
|
emit: sinon.stub()
|
||||||
|
};
|
||||||
|
node.getBlock = function(hash, callback) {
|
||||||
|
setImmediate(function() {
|
||||||
|
for(var i = chainHashes.length; i > 0; i--) {
|
||||||
|
if (chainHashes[i] === hash) {
|
||||||
|
callback(null, {
|
||||||
|
hash: chainHashes[i],
|
||||||
|
prevHash: chainHashes[i - 1]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
node.db = {
|
||||||
|
_onChainRemoveBlock: function(block, callback) {
|
||||||
|
setImmediate(callback);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
node._syncBitcoindAncestor = function(block, callback) {
|
||||||
|
setImmediate(function() {
|
||||||
|
callback(null, ancestorHash);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var forkedBlock = {};
|
||||||
|
node._syncBitcoindRewind(forkedBlock, function(err) {
|
||||||
|
if (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
node.chain.tip.__height.should.equal(4);
|
||||||
|
node.chain.tip.hash.should.equal(ancestorHash);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
describe('#_syncBitcoind', function() {
|
describe('#_syncBitcoind', function() {
|
||||||
it('will get and add block up to the tip height', function(done) {
|
it('will get and add block up to the tip height', function(done) {
|
||||||
var node = new Node({});
|
var node = new Node({});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user