Adding in spent status.
This commit is contained in:
parent
880f98e669
commit
5a5dbb624c
1
addresses.txt
Normal file
1
addresses.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
mtLDA41NWe9rLm7nuMvAnTs2SbP49cz1ZR
|
||||||
@ -16,7 +16,6 @@ var utils = require('../../utils');
|
|||||||
var AddressService = function(options) {
|
var AddressService = function(options) {
|
||||||
|
|
||||||
BaseService.call(this, options);
|
BaseService.call(this, options);
|
||||||
this._tx = this.node.services.transaction;
|
|
||||||
this._header = this.node.services.header;
|
this._header = this.node.services.header;
|
||||||
this._block = this.node.services.block;
|
this._block = this.node.services.block;
|
||||||
this._timestamp = this.node.services.timestamp;
|
this._timestamp = this.node.services.timestamp;
|
||||||
@ -32,7 +31,6 @@ var AddressService = function(options) {
|
|||||||
this._network = 'testnet';
|
this._network = 'testnet';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inherits(AddressService, BaseService);
|
inherits(AddressService, BaseService);
|
||||||
@ -46,8 +44,80 @@ AddressService.dependencies = [
|
|||||||
'mempool'
|
'mempool'
|
||||||
];
|
];
|
||||||
|
|
||||||
// ---- public function prototypes
|
AddressService.prototype._applySpendingTxsToOutputs = function(tx, options, callback) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
async.eachOfLimit(tx.outputs, 4, function(output, index, next) {
|
||||||
|
|
||||||
|
var address = utils.getAddress(output, self._network);
|
||||||
|
|
||||||
|
if (!address || !tx.__height) {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
self.getAddressHistory(address, { start: tx.__height }, function(err, history) {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
// there should be zero or one tx count, if there are more, then this output was double spent
|
||||||
|
if (history.totalCount === 1) {
|
||||||
|
var spentTx = history.items[0];
|
||||||
|
|
||||||
|
tx.outputs[index].spentTxId = spentTx.txid();
|
||||||
|
|
||||||
|
for(var i = 0; i < spentTx.inputs.length; i++) {
|
||||||
|
var input = spentTx.inputs[i];
|
||||||
|
if (input.prevout.txid() === tx.txid()) {
|
||||||
|
output.spentIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(output.spentIndex >= 0, 'Transaction Service: found spending tx, but could not find index.');
|
||||||
|
|
||||||
|
output.spentHeight = tx.__height || 0;
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}, function(err) {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(tx.outputs[0].spentTxId);
|
||||||
|
callback(null, tx);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
AddressService.prototype.getTransactionWithAddressInfo = function(txid, options, callback) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
self._transaction.getTransaction(txid, options, function(err, tx) {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tx) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
// locate any tx that spent this tx's outputs
|
||||||
|
self._applySpendingTxsToOutputs(tx, options, callback);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
AddressService.prototype.getAddressHistory = function(addresses, options, callback) {
|
AddressService.prototype.getAddressHistory = function(addresses, options, callback) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
options = options || {};
|
options = options || {};
|
||||||
@ -73,7 +143,7 @@ AddressService.prototype.getAddressHistory = function(addresses, options, callba
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: these should already be ordered correctly, please check
|
// TODO: these should already be ordered correctly, please check
|
||||||
txList = utils.dedupByTxid(txList);
|
txList = utils.dedupByTxid(txList);
|
||||||
txList = utils.orderByConfirmations(txList);
|
txList = utils.orderByConfirmations(txList);
|
||||||
|
|
||||||
var results = {
|
var results = {
|
||||||
@ -369,7 +439,7 @@ AddressService.prototype._transformTxForAddressHistory = function(opts, chunk, e
|
|||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
self._tx.getTransaction(txid, opts, function(err, tx) {
|
self._transaction.getTransaction(txid, opts, function(err, tx) {
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
log.error('Address Service: gettransaction ' + err);
|
log.error('Address Service: gettransaction ' + err);
|
||||||
|
|||||||
@ -51,64 +51,6 @@ TransactionService.prototype.getAPIMethods = function() {
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
TransactionService.prototype._getDoubleSpentTxID = function(tx, callback) {
|
|
||||||
// for there to be a tx in our mempool that is double spending this tx,
|
|
||||||
// then at least one other tx in the mempool must be spending at least one of the
|
|
||||||
// outputs that this tx is spending
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
// we don't index the mempool to easily handle this because we would have to exhaustively
|
|
||||||
// search through all of the mempool txs
|
|
||||||
|
|
||||||
// we should probably have an index whose key is prevtxid + output index + spendingtxid and no value
|
|
||||||
// then we could quickly loop over all inputs and get their spending txids in a list.
|
|
||||||
// then subtract the list and this will be your double spending txids.
|
|
||||||
|
|
||||||
// when a new block comes in, it may confirm up to one of those tx's. It should be very easily to
|
|
||||||
// delete the correct one because we have the block and the tx.
|
|
||||||
return callback();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
TransactionService.prototype._getConfirmationsForInputs = function(tx, callback) {
|
|
||||||
// for every input, check to see if its referenced input is confirmed.
|
|
||||||
return callback();
|
|
||||||
};
|
|
||||||
|
|
||||||
TransactionService.prototype._getSpentInformationForOutputs = function(tx, callback) {
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
async.mapLimit(tx.outputs, 4, function(output, next) {
|
|
||||||
|
|
||||||
var address = output.getAddress();
|
|
||||||
|
|
||||||
if (!address) {
|
|
||||||
return next();
|
|
||||||
}
|
|
||||||
|
|
||||||
address.network = self._network;
|
|
||||||
address = address.toString();
|
|
||||||
|
|
||||||
self._address._getInputInfoForAddress(address, next);
|
|
||||||
|
|
||||||
}, function(err) {
|
|
||||||
|
|
||||||
if(err) {
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// we have an array for every output representing all the input info for the address
|
|
||||||
// we need to take each txid in the input info and get the tx but only if the height is greater this
|
|
||||||
// tx's height
|
|
||||||
|
|
||||||
callback();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
TransactionService.prototype.getDetailedTransaction =
|
|
||||||
TransactionService.prototype.getTransaction = function(txid, options, callback) {
|
TransactionService.prototype.getTransaction = function(txid, options, callback) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user