check current bc tip
This commit is contained in:
parent
2cff530072
commit
61ed4c803a
|
@ -181,16 +181,13 @@ BlockchainMonitor.prototype._handleTxOuts = function(data) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockchainMonitor.prototype._processBlock = function(network, hash, cb) {
|
|
||||||
|
BlockchainMonitor.prototype._processBlockData = function(network, data, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
//1. check block is not reorg
|
|
||||||
//2. doProcessBlock
|
|
||||||
this.explorers[network].getBlock(hash, function(err, data) {
|
|
||||||
if (err) return cb(err);
|
|
||||||
|
|
||||||
log.debug('Processing block ' + network + ' ' + hash);
|
|
||||||
var block = new Bitcore.Block(new Buffer(data.rawblock, 'hex'));
|
var block = new Bitcore.Block(new Buffer(data.rawblock, 'hex'));
|
||||||
|
log.debug('Processing block ' + network + ' ' + block.hash);
|
||||||
|
|
||||||
var txs = block.toObject().transactions;
|
var txs = block.toObject().transactions;
|
||||||
|
|
||||||
var allAddresses = {};
|
var allAddresses = {};
|
||||||
|
@ -209,10 +206,62 @@ BlockchainMonitor.prototype._processBlock = function(network, hash, cb) {
|
||||||
|
|
||||||
async.eachLimit(allAddresses, 10, function(address, i_cb) {
|
async.eachLimit(allAddresses, 10, function(address, i_cb) {
|
||||||
self.storage.updateLastUsedOn(address, i_cb);
|
self.storage.updateLastUsedOn(address, i_cb);
|
||||||
}, cb);
|
}, function(err) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
return cb(null, block);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BlockchainMonitor.prototype._fetchAndProcessBlock = function(network, hash, cb) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
this.explorers[network].getBlock(hash, function(err, data) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
self._processBlockData(network, data, cb);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
BlockchainMonitor.prototype._processBlockchainSince = function(network, hash, cb) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.storage.getTip(network, function(err, data) {
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
log.error('No Tip recorded for ' + network);
|
||||||
|
return cb('No Tip recorded');
|
||||||
|
}
|
||||||
|
|
||||||
|
var tip = data.hash;
|
||||||
|
|
||||||
|
log.debug('', 'Last processed tip for %s was: %s on ', network, tip, (new Date(1000*data.updateOn)).toString() );
|
||||||
|
|
||||||
|
self._fetchAndProcessBlock(network, hash, function(err, block){
|
||||||
|
if (err) return cb(err);
|
||||||
|
|
||||||
|
// TODO CRITICAL
|
||||||
|
if (!block) {
|
||||||
|
log.error('', 'Block from notification no found! %s %s', network, hash);
|
||||||
|
return cb('Block not found!');
|
||||||
|
};
|
||||||
|
|
||||||
|
var header = block.header.toObject();
|
||||||
|
|
||||||
|
if (header.prevHash != tip) {
|
||||||
|
log.info ('', 'Notified block\'s prevhash does not match stored hash... Processing');
|
||||||
|
} else {
|
||||||
|
self.storage.updateTip(network, hash, cb);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
BlockchainMonitor.prototype._handleIncomingTx = function(data) {
|
BlockchainMonitor.prototype._handleIncomingTx = function(data) {
|
||||||
this._handleTxId(data);
|
this._handleTxId(data);
|
||||||
this._handleTxOuts(data);
|
this._handleTxOuts(data);
|
||||||
|
@ -231,14 +280,12 @@ BlockchainMonitor.prototype._handleNewBlock = function(network, hash) {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
self._processBlock(network, hash, function() {
|
self._processBlockchainSince(network, hash, function() {
|
||||||
self.storage.updateTip(function() {
|
|
||||||
self.storage.softResetAllTxHistoryCache(function() {
|
self.storage.softResetAllTxHistoryCache(function() {
|
||||||
self._storeAndBroadcastNotification(notification, function(err) {
|
self._storeAndBroadcastNotification(notification, function(err) {
|
||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -624,19 +624,29 @@ Storage.prototype.getTxHistoryCache = function(walletId, from, to, cb) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Storage.prototype.updateTip = function(hash, cb) {
|
Storage.prototype.updateTip = function(network, hash, cb) {
|
||||||
this.db.collection(collections.CACHE).update({
|
this.db.collection(collections.CACHE).update({
|
||||||
type: 'blochainTip',
|
type: 'tip',
|
||||||
|
key: network,
|
||||||
}, {
|
}, {
|
||||||
$set: {
|
$set: {
|
||||||
hash:hash,
|
hash: hash,
|
||||||
|
updatedOn: Math.floor(Date.now() / 1000),
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
upsert: true,
|
upsert: true,
|
||||||
}, cb);
|
}, cb);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Storage.prototype.getTip = function(network,cb) {
|
||||||
|
this.db.collection(collections.CACHE).findOne({
|
||||||
|
type: 'tip',
|
||||||
|
key: network,
|
||||||
|
}, cb);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Storage.prototype.softResetAllTxHistoryCache = function(cb) {
|
Storage.prototype.softResetAllTxHistoryCache = function(cb) {
|
||||||
this.db.collection(collections.CACHE).remove({
|
this.db.collection(collections.CACHE).remove({
|
||||||
type: 'historyCacheStatus',
|
type: 'historyCacheStatus',
|
||||||
|
|
|
@ -144,17 +144,30 @@ describe('Blockchain monitor', function() {
|
||||||
rawblock: TestData.block.rawblock
|
rawblock: TestData.block.rawblock
|
||||||
});
|
});
|
||||||
|
|
||||||
var fakeAddresses= TestData.block.addresses.splice(0, 3);
|
|
||||||
|
server.storage.getTip = sinon.stub().yields(null, {
|
||||||
|
hash: TestData.block.prev,
|
||||||
|
updatedOn: Date.now(),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var fakeAddresses = TestData.block.addresses.splice(0, 3);
|
||||||
|
|
||||||
server.getWallet({}, function(err, wallet) {
|
server.getWallet({}, function(err, wallet) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
|
|
||||||
|
var aLongTimeAgo = Date.now() - (1000 * 10 * 86400);
|
||||||
|
var clock = sinon.useFakeTimers(aLongTimeAgo, 'Date');
|
||||||
|
|
||||||
|
|
||||||
helpers.insertFakeAddresses(server, wallet, fakeAddresses, function(err) {
|
helpers.insertFakeAddresses(server, wallet, fakeAddresses, function(err) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
|
|
||||||
|
clock.restore();
|
||||||
socket.handlers['block'](incoming);
|
socket.handlers['block'](incoming);
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
storage.fetchRecentAddresses(wallet.id, (Date.now() / 1000) - 100, function(err, addr) {
|
storage.fetchRecentAddresses(wallet.id, (Date.now() / 1000) - 100, function(err, addr) {
|
||||||
_.pluck(addr,'address').should.be.deep.equal(fakeAddresses);
|
_.pluck(addr, 'address').should.be.deep.equal(fakeAddresses);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
}, 50);
|
}, 50);
|
||||||
|
|
|
@ -296,4 +296,4 @@ var addresses = [ 'mzrj4QmPhk98vc2yQw42uCsgwfBjVzPPLM',
|
||||||
module.exports.keyPair = keyPair;
|
module.exports.keyPair = keyPair;
|
||||||
module.exports.copayers = copayers;
|
module.exports.copayers = copayers;
|
||||||
module.exports.history = history;
|
module.exports.history = history;
|
||||||
module.exports.block = { rawblock: rawblock, addresses: addresses};
|
module.exports.block = { rawblock: rawblock, addresses: addresses, prev: '0000000000001e5b4b49aef6109a1ceeee9d4f628882bce97e06aa0f2889aee1'};
|
||||||
|
|
Loading…
Reference in New Issue