find transactions which spend from the address

This commit is contained in:
Patrick Nagurny 2015-07-24 12:34:33 -06:00
parent d5801c9172
commit ac774ba9e8
1 changed files with 52 additions and 43 deletions

View File

@ -5,6 +5,7 @@ var inherits = require('util').inherits;
var async = require('async'); var async = require('async');
var chainlib = require('chainlib'); var chainlib = require('chainlib');
var log = chainlib.log; var log = chainlib.log;
var levelup = chainlib.deps.levelup;
var errors = chainlib.errors; var errors = chainlib.errors;
var bitcore = require('bitcore'); var bitcore = require('bitcore');
var $ = bitcore.util.preconditions; var $ = bitcore.util.preconditions;
@ -23,7 +24,8 @@ var AddressModule = function(options) {
inherits(AddressModule, BaseModule); inherits(AddressModule, BaseModule);
AddressModule.PREFIXES = { AddressModule.PREFIXES = {
OUTPUTS: 'outs' OUTPUTS: 'outs',
SPENTS: 'sp'
}; };
AddressModule.prototype.getAPIMethods = function() { AddressModule.prototype.getAPIMethods = function() {
@ -117,6 +119,13 @@ AddressModule.prototype.blockHandler = function(block, addOutput, callback) {
continue; continue;
} }
for(var j = 0; j < inputs.length; j++) {
operations.push({
type: action,
key: [AddressModule.PREFIXES.SPENTS, inputs[j].prevTxId, inputs[j].outputIndex].join('-'),
value: txid
});
}
} }
setImmediate(function() { setImmediate(function() {
@ -282,55 +291,55 @@ AddressModule.prototype.isSpent = function(output, queryMempool, callback) {
}); });
}; };
AddressModule.prototype.getSpendTxForOutput = function(txid, outputIndex, queryMempool, callback) {
var self = this;
var key = [AddressModule.PREFIXES.SPENTS, txid, outputIndex].join('-');
this.db.store.get(key, function(err, spentTxId) {
if(err) {
return callback(err);
}
self.db.getTransaction(spentTxId, queryMempool, callback);
});
};
AddressModule.prototype.getTransactionsForAddress = function(address, queryMempool, callback) { AddressModule.prototype.getTransactionsForAddress = function(address, queryMempool, callback) {
var self = this; var self = this;
var txids = []; this.getOutputs(address, queryMempool, function(err, outputs) {
var key = [AddressModule.PREFIXES.OUTPUTS, address].join('-'); if(err) {
return callback(err);
var stream = this.db.store.createReadStream({
start: key,
end: key + '~'
});
stream.on('data', function(data) {
var key = data.key.split('-');
txids.push(key[3]);
});
var error;
stream.on('error', function(streamError) {
if (streamError) {
error = streamError;
}
});
stream.on('close', function() {
if (error) {
return callback(error);
} }
async.map( var transactions = [];
txids,
function(txid, next) { async.eachSeries(
self.db.getTransaction(txid, next); outputs,
function(output, next) {
self.db.getTransaction(output.txid, queryMempool, function(err, tx) {
if(err) {
return next(err);
}
transactions.push(tx);
self.db.getSpendTxForOutput(output.txid, output.outputIndex, queryMempool, function(err, tx) {
if(err instanceof levelup.errors.NotFoundError) {
return next();
} else if(err) {
return next(err);
}
transactions.push(tx);
next();
});
});
}, },
function(err, transactions) { function(err) {
if(err) { callback(err, transactions);
return callback(err); });
}
if(queryMempool) {
// TODO
}
callback(null, transactions);
});
}); });
return stream;
}; };
module.exports = AddressModule; module.exports = AddressModule;