use faster getAddressSummary()

This commit is contained in:
Patrick Nagurny 2015-09-17 10:41:35 -04:00
parent 83c8f9c5ac
commit 2ec8d1f447
2 changed files with 44 additions and 59 deletions

View File

@ -10,7 +10,11 @@ function AddressController(node) {
} }
AddressController.prototype.show = function(req, res) { AddressController.prototype.show = function(req, res) {
this.getAddressHistory(req.addr, function(err, data) { var options = {
noTxList: parseInt(req.query.noTxList)
};
this.getAddressSummary(req.addr, options, function(err, data) {
if(err) { if(err) {
return common.handleErrors(err, res); return common.handleErrors(err, res);
} }
@ -20,23 +24,23 @@ AddressController.prototype.show = function(req, res) {
}; };
AddressController.prototype.balance = function(req, res) { AddressController.prototype.balance = function(req, res) {
this.addressHistorySubQuery(req, res, 'balanceSat'); this.addressSummarySubQuery(req, res, 'balanceSat');
}; };
AddressController.prototype.totalReceived = function(req, res) { AddressController.prototype.totalReceived = function(req, res) {
this.addressHistorySubQuery(req, res, 'totalReceivedSat'); this.addressSummarySubQuery(req, res, 'totalReceivedSat');
}; };
AddressController.prototype.totalSent = function(req, res) { AddressController.prototype.totalSent = function(req, res) {
this.addressHistorySubQuery(req, res, 'totalSentSat'); this.addressSummarySubQuery(req, res, 'totalSentSat');
}; };
AddressController.prototype.unconfirmedBalance = function(req, res) { AddressController.prototype.unconfirmedBalance = function(req, res) {
this.addressHistorySubQuery(req, res, 'unconfirmedBalanceSat'); this.addressSummarySubQuery(req, res, 'unconfirmedBalanceSat');
}; };
AddressController.prototype.addressHistorySubQuery = function(req, res, param) { AddressController.prototype.addressSummarySubQuery = function(req, res, param) {
this.getAddressHistory(req.addr, function(err, data) { this.getAddressSummary(req.addr, {}, function(err, data) {
if(err) { if(err) {
return common.handleErrors(err, res); return common.handleErrors(err, res);
} }
@ -45,15 +49,30 @@ AddressController.prototype.addressHistorySubQuery = function(req, res, param) {
}); });
}; };
AddressController.prototype.getAddressHistory = function(address, callback) { AddressController.prototype.getAddressSummary = function(address, options, callback) {
var self = this; var self = this;
this.node.getAddressHistory(address, {}, function(err, result) { this.node.getAddressSummary(address, options, function(err, summary) {
if(err) { if(err) {
return callback(err); return callback(err);
} }
callback(null, self.transformAddressHistory(result.items, address)); var transformed = {
addrStr: address,
balance: summary.balance / 1e8,
balanceSat: summary.balance,
totalReceived: summary.totalReceived / 1e8,
totalReceivedSat: summary.totalReceived,
totalSent: summary.totalSpent / 1e8,
totalSentSat: summary.totalSpent,
unconfirmedBalance: summary.unconfirmedBalance / 1e8,
unconfirmedBalanceSat: summary.unconfirmedBalance,
unconfirmedTxApperances: summary.unconfirmedAppearances, // misspelling - ew
txApperances: summary.appearances, // yuck
transactions: summary.txids
};
callback(null, transformed);
}); });
}; };
@ -94,53 +113,6 @@ AddressController.prototype.check = function(req, res, next, addresses) {
next(); next();
}; };
AddressController.prototype.transformAddressHistory = function(txinfos, address) {
var transactions = txinfos.map(function(info) {
return info.tx.hash;
}).filter(function(value, index, self) {
return self.indexOf(value) === index;
});
var balance = 0;
var appearances = 0;
var totalReceived = 0;
var totalSent = 0;
var unconfirmedBalance = 0;
var unconfirmedAppearances = 0;
for(var i = 0; i < txinfos.length; i++) {
if(txinfos[i].satoshis > 0) {
totalReceived += txinfos[i].satoshis;
} else {
totalSent += -txinfos[i].satoshis;
}
if(txinfos[i].confirmations) {
balance += txinfos[i].satoshis;
unconfirmedBalance += txinfos[i].satoshis;
appearances++;
} else {
unconfirmedBalance += txinfos[i].satoshis;
unconfirmedAppearances++;
}
}
return {
addrStr: address,
balance: balance / 1e8,
balanceSat: balance,
totalReceived: totalReceived / 1e8,
totalReceivedSat: totalReceived,
totalSent: totalSent / 1e8,
totalSentSat: totalSent,
unconfirmedBalance: unconfirmedBalance / 1e8,
unconfirmedBalanceSat: unconfirmedBalance,
unconfirmedTxApperances: unconfirmedAppearances, // misspelling - ew
txApperances: appearances, // yuck
transactions: transactions
};
};
AddressController.prototype.utxo = function(req, res) { AddressController.prototype.utxo = function(req, res) {
var self = this; var self = this;

View File

@ -171,14 +171,27 @@ var utxos = [
]; ];
describe('Addresses', function() { describe('Addresses', function() {
var summary = {
balance: 0,
totalReceived: 2782729129,
totalSpent: 2782729129,
unconfirmedBalance: 0,
appearances: 2,
unconfirmedAppearances: 0,
txids: [
'bb0ec3b96209fac9529570ea6f83a86af2cceedde4aaf2bfcc4796680d23f1c7',
'01f700df84c466f2a389440e5eeacdc47d04f380c39e5d19dce2ce91a11ecba3'
]
};
describe('/addr/:addr', function() { describe('/addr/:addr', function() {
var node = { var node = {
getAddressHistory: sinon.stub().callsArgWith(2, null, txinfos) getAddressSummary: sinon.stub().callsArgWith(2, null, summary)
}; };
var addresses = new AddressController(node); var addresses = new AddressController(node);
var req = { var req = {
addr: 'mkPvAKZ2rar6qeG3KjBtJHHMSP1wFZH7Er' addr: 'mkPvAKZ2rar6qeG3KjBtJHHMSP1wFZH7Er',
query: {}
}; };
it('should have correct data', function(done) { it('should have correct data', function(done) {