Added gettransactions.
This commit is contained in:
parent
7862481df5
commit
1ccf4e9741
@ -5,11 +5,6 @@ var BaseService = require('../../service');
|
|||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var index = require('../../');
|
var index = require('../../');
|
||||||
var log = index.log;
|
var log = index.log;
|
||||||
var errors = index.errors;
|
|
||||||
var bitcore = require('bitcore-lib');
|
|
||||||
var Networks = bitcore.Networks;
|
|
||||||
var levelup = require('levelup');
|
|
||||||
var leveldown = require('leveldown');
|
|
||||||
var multer = require('multer');
|
var multer = require('multer');
|
||||||
var storage = multer.memoryStorage();
|
var storage = multer.memoryStorage();
|
||||||
var upload = multer({ storage: storage });
|
var upload = multer({ storage: storage });
|
||||||
@ -20,13 +15,12 @@ var bodyParser = require('body-parser');
|
|||||||
var LRU = require('lru-cache');
|
var LRU = require('lru-cache');
|
||||||
var Encoding = require('../../encoding'); // TODO this needs to be split out by service
|
var Encoding = require('../../encoding'); // TODO this needs to be split out by service
|
||||||
|
|
||||||
|
|
||||||
var WalletService = function(options) {
|
var WalletService = function(options) {
|
||||||
BaseService.call(this, options);
|
BaseService.call(this, options);
|
||||||
|
|
||||||
this._cache = LRU({
|
this._cache = LRU({
|
||||||
max: 500 * 1024 * 1024,
|
max: 500 * 1024 * 1024,
|
||||||
length: function(n, key) {
|
length: function(n) {
|
||||||
return Buffer.byteLength(n, 'utf8');
|
return Buffer.byteLength(n, 'utf8');
|
||||||
},
|
},
|
||||||
maxAge: 30 * 60 * 1000
|
maxAge: 30 * 60 * 1000
|
||||||
@ -210,7 +204,6 @@ WalletService.prototype.concurrentBlockHandler = function(block, connectBlock, c
|
|||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var txs = block.transactions;
|
var txs = block.transactions;
|
||||||
var height = block.__height;
|
|
||||||
|
|
||||||
var action = 'put';
|
var action = 'put';
|
||||||
if (!connectBlock) {
|
if (!connectBlock) {
|
||||||
@ -247,7 +240,7 @@ WalletService.prototype.concurrentBlockHandler = function(block, connectBlock, c
|
|||||||
type: action,
|
type: action,
|
||||||
key: self._encoding.encodeWalletTransactionKey(walletId, block.__height),
|
key: self._encoding.encodeWalletTransactionKey(walletId, block.__height),
|
||||||
value: self._encoding.encodeWalletTransactionValue(tx.id)
|
value: self._encoding.encodeWalletTransactionValue(tx.id)
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,9 +263,9 @@ WalletService.prototype.concurrentBlockHandler = function(block, connectBlock, c
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var walletIds = self._addressMap[inputAddress];
|
var inputWalletIds = self._addressMap[inputAddress];
|
||||||
|
|
||||||
walletIds.forEach(function(walletId) {
|
inputWalletIds.forEach(function(walletId) {
|
||||||
operations.push({
|
operations.push({
|
||||||
type: action,
|
type: action,
|
||||||
key: self._encoding.encodeWalletTransactionKey(walletId, block.__height),
|
key: self._encoding.encodeWalletTransactionKey(walletId, block.__height),
|
||||||
@ -433,8 +426,12 @@ WalletService.prototype._endpointPostAddresses = function() {
|
|||||||
var self = this;
|
var self = this;
|
||||||
return function(req, res) {
|
return function(req, res) {
|
||||||
var addresses = req.addresses;
|
var addresses = req.addresses;
|
||||||
|
if (!addresses || !addresses.length) {
|
||||||
|
return utils.sendError(new Error('addresses are required when creating a wallet.'));
|
||||||
|
}
|
||||||
var walletId = utils.getWalletId();
|
var walletId = utils.getWalletId();
|
||||||
|
|
||||||
|
// TODO make imdempotent
|
||||||
self._importAddresses(walletId, addresses, function(err) {
|
self._importAddresses(walletId, addresses, function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return utils.sendError(err, res);
|
return utils.sendError(err, res);
|
||||||
@ -492,6 +489,7 @@ WalletService.prototype._endpointPutAddresses = function() {
|
|||||||
var addAddresses = _.without(newAddresses, oldAddresses);
|
var addAddresses = _.without(newAddresses, oldAddresses);
|
||||||
var amountAdded = addAddresses.length;
|
var amountAdded = addAddresses.length;
|
||||||
|
|
||||||
|
//TODO this may take too long
|
||||||
self._importAddresses(walletId, addAddresses, function(err) {
|
self._importAddresses(walletId, addAddresses, function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return utils.sendError(err, res);
|
return utils.sendError(err, res);
|
||||||
@ -565,54 +563,90 @@ WalletService.prototype._chunkAdresses = function(addresses) {
|
|||||||
|
|
||||||
WalletService.prototype._getTransactions = function(walletId, options, callback) {
|
WalletService.prototype._getTransactions = function(walletId, options, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var transactions = [];
|
var txids = [];
|
||||||
var opts = {
|
var opts = {
|
||||||
start: options.start,
|
start: options.start || 0,
|
||||||
end: options.end
|
end: options.end || Math.pow(2, 32) - 1
|
||||||
};
|
};
|
||||||
var key = walletId + opts.start + opts.end;
|
var key = walletId + opts.start + opts.end;
|
||||||
|
function finish(transactions) {
|
||||||
|
var from = options.from || 0;
|
||||||
|
var to = options.to || transactions.length;
|
||||||
|
callback(null, transactions.slice(from, to), transactions.length);
|
||||||
|
}
|
||||||
|
|
||||||
if (!self._cache.peek(key)) {
|
if (!self._cache.peek(key)) {
|
||||||
self._getAddresses(walletId, function(err, addresses) {
|
var stream = self.store.createReadStream({
|
||||||
if(err) {
|
gte: self._encoding.encodeWalletTransactionKey(walletId, opts.start),
|
||||||
return callback(err);
|
lt: self._encoding.encodeWalletTransactionKey(walletId, opts.end)
|
||||||
}
|
});
|
||||||
if (!addresses) {
|
|
||||||
return callback(new Error('wallet not found'));
|
var streamErr;
|
||||||
}
|
stream.on('error', function(err) {
|
||||||
var addressGroups = self._chunkAdresses(addresses);
|
streamErr = err;
|
||||||
async.eachSeries(addressGroups, function(addresses, next) {
|
});
|
||||||
self.node.services.bitcoind.getAddressHistory(addresses, opts, function(err, history) {
|
|
||||||
if(err) {
|
stream.on('data', function(data) {
|
||||||
return next(err);
|
txids.push(self._encoding.decodeWalletTransactionValue(data.value));
|
||||||
}
|
});
|
||||||
var groupTransactions = history.items.map(function(item) {
|
|
||||||
return item.tx;
|
stream.on('end', function() {
|
||||||
});
|
async.mapLimit(txids, function(txid, next) {
|
||||||
transactions = _.union(transactions, groupTransactions);
|
self.node.services.transaction.getTransaction(txid, options, next);
|
||||||
next();
|
}, function(err, transactions) {
|
||||||
});
|
|
||||||
}, function(err) {
|
|
||||||
if(err) {
|
if(err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
self._cache.set(key, JSON.stringify(transactions));
|
self._cache.set(key, JSON.stringify(transactions));
|
||||||
finish();
|
finish(transactions);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
transactions = JSON.parse(self._cache.get(key));
|
transactions = JSON.parse(self._cache.get(key));
|
||||||
finish();
|
finish(transactions);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
self._cache.del(key);
|
self._cache.del(key);
|
||||||
return callback(e);
|
return callback(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function finish() {
|
//if (!self._cache.peek(key)) {
|
||||||
var from = options.from || 0;
|
// self._getAddresses(walletId, function(err, addresses) {
|
||||||
var to = options.to || transactions.length;
|
// if(err) {
|
||||||
callback(null, transactions.slice(from, to), transactions.length);
|
// return callback(err);
|
||||||
}
|
// }
|
||||||
|
// if (!addresses) {
|
||||||
|
// return callback(new Error('wallet not found'));
|
||||||
|
// }
|
||||||
|
// var addressGroups = self._chunkAdresses(addresses);
|
||||||
|
// async.eachSeries(addressGroups, function(addresses, next) {
|
||||||
|
// self.node.services.bitcoind.getAddressHistory(addresses, opts, function(err, history) {
|
||||||
|
// if(err) {
|
||||||
|
// return next(err);
|
||||||
|
// }
|
||||||
|
// var groupTransactions = history.items.map(function(item) {
|
||||||
|
// return item.tx;
|
||||||
|
// });
|
||||||
|
// transactions = _.union(transactions, groupTransactions);
|
||||||
|
// next();
|
||||||
|
// });
|
||||||
|
// }, function(err) {
|
||||||
|
// if(err) {
|
||||||
|
// return callback(err);
|
||||||
|
// }
|
||||||
|
// self._cache.set(key, JSON.stringify(transactions));
|
||||||
|
// finish();
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
//} else {
|
||||||
|
// try {
|
||||||
|
// transactions = JSON.parse(self._cache.get(key));
|
||||||
|
// finish();
|
||||||
|
// } catch(e) {
|
||||||
|
// self._cache.del(key);
|
||||||
|
// return callback(e);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
};
|
};
|
||||||
|
|
||||||
WalletService.prototype._getAddresses = function(walletId, callback) {
|
WalletService.prototype._getAddresses = function(walletId, callback) {
|
||||||
@ -738,7 +772,7 @@ WalletService.prototype._getTxidIndexOperations = function(walletId, addresses,
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
operations = Object.keys(txids).map(function(txid) {
|
var operations = Object.keys(txids).map(function(txid) {
|
||||||
return {
|
return {
|
||||||
type: 'put',
|
type: 'put',
|
||||||
key: self._encoding.encodeWalletTransactionKey(walletId, txids[txid]),
|
key: self._encoding.encodeWalletTransactionKey(walletId, txids[txid]),
|
||||||
@ -767,7 +801,8 @@ WalletService.prototype._endpointGetInfo = function() {
|
|||||||
res.jsonp({result: 'ok'});
|
res.jsonp({result: 'ok'});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
WalletService.prototype.setupRoutes = function(app, express) {
|
|
||||||
|
WalletService.prototype.setupRoutes = function(app) {
|
||||||
var s = this;
|
var s = this;
|
||||||
var v = validators;
|
var v = validators;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user