wip on timestamp test.

This commit is contained in:
Chris Kleeschulte 2017-04-27 15:52:46 -04:00
parent 5dfadf9d2b
commit ebe37222f5
4 changed files with 39 additions and 45 deletions

View File

@ -163,6 +163,10 @@ DB.prototype.start = function(callback) {
self._sync.on('synced', function() {
self.syncing = false;
self.node.services.bitcoind.on('tip', function(height) {
log.info('New tip at height: ' + height + ' hash: ' + self.node.services.bitcoind.tiphash);
self._sync.sync();
});
log.info('Initial sync complete');
});
@ -171,34 +175,21 @@ DB.prototype.start = function(callback) {
});
self.node.once('ready', function() {
self._sync.initialSync();
self.node.services.bitcoind.on('tip', function(height) {
log.info('New tip at height: ' + height + ' hash: ' + self.node.services.bitcoind.tiphash);
self._sync.sync();
});
});
async.series([
function(next) {
self._checkVersion(next);
},
function(next) {
self._setVersion(next);
}
], function(err) {
if (err) {
return callback(err);
}
self.loadTip(function(err) {
if (err) {
return callback(err);
function finish(err) {
if(err) {
throw err;
}
self.loadConcurrentTip(callback);
});
self._sync.initialSync();
}
self.loadTip(self.loadConcurrentTip.bind(self, finish));
});
//TODO remove!
setImmediate(function() {
self._checkVersion(self._setVersion.bind(self, callback));
});
};
DB.prototype.stop = function(callback) {
@ -227,6 +218,8 @@ DB.prototype.loadTip = function(callback) {
if(err && err instanceof levelup.errors.NotFoundError) {
self.tip = self.genesis;
self.tip.__height = 0;
// we need to wait for all the services to become ready,
// then we can proceed with connecting blocks here
self.connectBlock(self.genesis, function(err) {
if(err) {
return callback(err);
@ -276,11 +269,12 @@ DB.prototype.loadConcurrentTip = function(callback) {
var self = this;
self.store.get(self.dbPrefix + 'concurrentTip', self.dbOptions, function(err, tipData) {
if(err && err instanceof levelup.errors.NotFoundError) {
if (err instanceof levelup.errors.NotFoundError) {
self.concurrentTip = self.genesis;
self.concurrentTip.__height = 0;
return;
} else if(err) {
return callback();
} else if (err) {
return callback(err);
}

View File

@ -2,6 +2,7 @@
var Encoding = require('./encoding');
var BaseService = require('../../service');
var inherits = require('util').inherits;
var MAINNET_BITCOIN_GENESIS_TIME = 1296688602;
function TimestampService(options) {
BaseService.call(this, options);
@ -44,12 +45,8 @@ TimestampService.prototype.blockHandler = function(block, connectBlock, callback
var operations = [];
function getLastTimestamp(next) {
if(!block.header.prevHash) {
// Genesis block
return next(null, 0);
} else if(block.__height === 1) {
// TODO fix bug where genesis block doesn't get indexed
return next(null, 0);
if(block.__height === 0) {
return next(null, (block.header.timestamp - 1));
}
self.getTimestamp(block.header.prevHash.reverse().toString('hex'), next);
@ -109,9 +106,16 @@ TimestampService.prototype.getTimestamp = function(hash, callback) {
TimestampService.prototype.getBlockHeights = function(timestamps, callback) {
var self = this;
timestamps.sort();
//due to a bug in the encoding routines, thers is a minimum timestamp that
//can be searched for, which is 1296688602 (the bitcoin mainnet genesis block
timestamps = timestamps.map(function(timestamp) {
return timestamp >= MAINNET_BITCOIN_GENESIS_TIME ? timestamp : MAINNET_BITCOIN_GENESIS_TIME;
});
var start = self.encoding.encodeTimestampBlockKey(timestamps[0]);
var end = self.encoding.encodeTimestampBlockKey(timestamps[1]);
var stream = self.store.createReadStream({
gte: self.encoding.encodeTimestampBlockKey(timestamps[0]),
lte: self.encoding.encodeTimestampBlockKey(timestamps[1])
gte: start,
lte: end
});
var hashes = [];

View File

@ -20,11 +20,6 @@ var Readable = require('stream').Readable;
var WalletService = function(options) {
BaseService.call(this, options);
//TODO: what to do if we overflow jobs for which we never reported on
//jobs are agnostic to the amount of work in each job. Additionally,
//each job in the cache is already running immediately after setting
//the job. This means that a large job can be started before smaller
//jobs and this can lead to slower processing of all jobs over time.
this._MAX_QUEUE = 20;
this._jobs = LRU({
max: this._MAX_QUEUE,
@ -616,6 +611,7 @@ WalletService.prototype._endpointGetTransactions = function() {
from: req.query.from,
to: req.query.to
};
self._getTransactions(walletId, options, function(err, transactions) {
if(err) {
@ -1120,7 +1116,7 @@ WalletService.prototype._storeBalance = function(walletId, balance, callback) {
WalletService.prototype._processStartEndOptions = function(req, callback) {
var self = this;
if (req.query.start && req.query.end) {
if (req.query.start >= 0 && req.query.end >= 0) {
var heights = [];
self.node.services.timestamp.getBlockHeights([
@ -1129,7 +1125,6 @@ WalletService.prototype._processStartEndOptions = function(req, callback) {
],
function(err, hashTuple) {
if(err) {
return callback(err);
}

View File

@ -17,7 +17,7 @@ var fs = require('fs');
var http = require('http');
var crypto = require('crypto');
var debug = false;
var debug = true;
var bitcoreDataDir = '/tmp/bitcore';
var bitcoinDataDir = '/tmp/bitcoin';
@ -181,7 +181,8 @@ describe('Wallet Operations', function() {
});
it('should get a list of transactions', function(done) {
var httpOpts = getHttpOpts({ path: '/wallet-api/wallets/' + walletId + '/transactions' });
var end = Date.now() + 86400000;
var httpOpts = getHttpOpts({ path: '/wallet-api/wallets/' + walletId + '/transactions?start=0&end=' + end });
queryBitcoreNode(httpOpts, function(err, res) {
if(err) {
return done(err);