Get transaction fixes.
This commit is contained in:
parent
f10dbaf047
commit
d7169ff639
@ -130,7 +130,23 @@ MempoolService.prototype._onTransaction = function(tx) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
MempoolService.prototype.getMempoolTransaction = function(txid, callback) {
|
MempoolService.prototype.getMempoolTransaction = function(txid, callback) {
|
||||||
this._db.get(this._encoding.encodeMempoolTransactionKey(txid), callback);
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self._db.get(self._encoding.encodeMempoolTransactionKey(txid), function(err, tx) {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tx) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, self._encoding.decodeMempoolTransactionValue(tx));
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MempoolService.prototype.stop = function(callback) {
|
MempoolService.prototype.stop = function(callback) {
|
||||||
|
|||||||
@ -36,7 +36,7 @@ TransactionService.prototype.getAPIMethods = function() {
|
|||||||
['getRawTransaction', this, this.getRawTransaction, 1],
|
['getRawTransaction', this, this.getRawTransaction, 1],
|
||||||
['getTransaction', this, this.getTransaction, 1],
|
['getTransaction', this, this.getTransaction, 1],
|
||||||
['getDetailedTransaction', this, this.getDetailedTransaction, 1],
|
['getDetailedTransaction', this, this.getDetailedTransaction, 1],
|
||||||
['getInputValues', this, this._addMissingInputValues, 1]
|
['getInputValues', this, this.getInputValues, 1]
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,7 +52,65 @@ TransactionService.prototype.getTransaction = function(txid, options, callback)
|
|||||||
callback = options;
|
callback = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
self._getTransaction(txid, options, function(err, tx) {
|
async.waterfall([
|
||||||
|
function(next) {
|
||||||
|
self._getTransaction(txid, options, next);
|
||||||
|
},
|
||||||
|
self._getMempoolTransaction.bind(self),
|
||||||
|
self.getInputValues.bind(self),
|
||||||
|
self._setMetaInfo.bind(self)
|
||||||
|
], callback);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
TransactionService.prototype._setMetaInfo = function(tx, options, callback) {
|
||||||
|
|
||||||
|
if (!tx) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
// output values
|
||||||
|
var outputSatoshis = 0;
|
||||||
|
|
||||||
|
tx.outputs.forEach(function(output) {
|
||||||
|
outputSatoshis += output.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
tx.outputSatoshis = outputSatoshis;
|
||||||
|
|
||||||
|
|
||||||
|
//input values
|
||||||
|
if (!tx.inputs[0].isCoinbase()) {
|
||||||
|
|
||||||
|
var inputSatoshis = 0;
|
||||||
|
|
||||||
|
tx.__inputValues.forEach(function(val) {
|
||||||
|
|
||||||
|
if (val >+ 0) {
|
||||||
|
inputSatoshis += val;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var feeSatoshis = inputSatoshis - outputSatoshis;
|
||||||
|
tx.inputSatosbis = inputSatoshis;
|
||||||
|
tx.feeSatosbis = feeSatoshis;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, tx);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
TransactionService.prototype._getMempoolTransaction = function(txid, tx, options, callback) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var queryMempool = _.isUndefined(options.queryMempool) ? true : options.queryMempool;
|
||||||
|
|
||||||
|
if (tx || !queryMempool) {
|
||||||
|
return callback(null, tx, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
self._mempool.getMempoolTransaction(txid, function(err, tx) {
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
@ -62,7 +120,8 @@ TransactionService.prototype.getTransaction = function(txid, options, callback)
|
|||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
self._addMissingInputValues(tx, options, callback);
|
tx.confirmations = 0;
|
||||||
|
callback(null, tx, options);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -72,113 +131,41 @@ TransactionService.prototype._getTransaction = function(txid, options, callback)
|
|||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var queryMempool = _.isUndefined(options.queryMempool) ? true : options.queryMempool;
|
|
||||||
|
|
||||||
var key = self._encoding.encodeTransactionKey(txid);
|
var key = self._encoding.encodeTransactionKey(txid);
|
||||||
|
|
||||||
async.waterfall([
|
self._db.get(key, function(err, tx) {
|
||||||
// main index?
|
|
||||||
function(next) {
|
|
||||||
self._db.get(key, function(err, tx) {
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tx) {
|
|
||||||
return next(null, tx);
|
|
||||||
}
|
|
||||||
|
|
||||||
tx = self._encoding.decodeTransactionValue(tx);
|
|
||||||
tx.confirmations = self._header.getBestHeight() - tx.__height;
|
|
||||||
|
|
||||||
self._header.getBlockHeader(tx.__height, function(err, header) {
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (header) {
|
|
||||||
tx.blockHash = header.hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
next(null, tx);
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
// mempool?
|
|
||||||
function(tx, next) {
|
|
||||||
|
|
||||||
if (queryMempool && !tx) {
|
|
||||||
|
|
||||||
return self._mempool.getMempoolTransaction(txid, function(err, memTx) {
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memTx) {
|
|
||||||
memTx = self._encoding.decodeTransactionValue(memTx);
|
|
||||||
memTx.confirmations = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
next(null, memTx);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
next(null, tx);
|
|
||||||
|
|
||||||
}
|
|
||||||
], function(err, tx) {
|
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tx) {
|
if (!tx) {
|
||||||
return callback();
|
return callback(null, tx, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
// output values
|
tx = self._encoding.decodeTransactionValue(tx);
|
||||||
var outputSatoshis = 0;
|
tx.confirmations = self._header.getBestHeight() - tx.__height;
|
||||||
|
|
||||||
|
self._header.getBlockHeader(tx.__height, function(err, header) {
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header) {
|
||||||
|
tx.blockHash = header.hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(null, txid, tx, options);
|
||||||
|
|
||||||
tx.outputs.forEach(function(output) {
|
|
||||||
outputSatoshis += output.value;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
tx.outputSatoshis = outputSatoshis;
|
|
||||||
|
|
||||||
|
|
||||||
//input values
|
|
||||||
if (!tx.inputs[0].isCoinbase()) {
|
|
||||||
|
|
||||||
var inputSatoshis = 0;
|
|
||||||
|
|
||||||
tx.__inputValues.forEach(function(val) {
|
|
||||||
|
|
||||||
if (val >- 0) {
|
|
||||||
inputSatoshis += val;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var feeSatoshis = inputSatoshis - outputSatoshis;
|
|
||||||
tx.inputSatosbis = inputSatoshis;
|
|
||||||
tx.feeSatosbis = feeSatoshis;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(null, tx);
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TransactionService.prototype._addMissingInputValues = function(tx, options, callback) {
|
TransactionService.prototype.getInputValues = function(tx, options, callback) {
|
||||||
|
|
||||||
// if we have cache misses from when we populated input values,
|
|
||||||
// then we must go and find them after the fact (lazy-load).
|
|
||||||
var self = this;
|
var self = this;
|
||||||
async.eachOfLimit(tx.inputs, 4, function(input, index, next) {
|
async.eachOfLimit(tx.inputs, 4, function(input, index, next) {
|
||||||
|
|
||||||
@ -190,7 +177,7 @@ TransactionService.prototype._addMissingInputValues = function(tx, options, call
|
|||||||
|
|
||||||
var outputIndex = input.prevout.index;
|
var outputIndex = input.prevout.index;
|
||||||
|
|
||||||
self._getTransaction(input.prevout.txid(), options, function(err, _tx) {
|
self._getTransaction(input.prevout.txid(), options, function(err, txid, _tx) {
|
||||||
|
|
||||||
if (err || !_tx) {
|
if (err || !_tx) {
|
||||||
return next(err || new Error('tx not found for tx id: ' + input.prevout.txid()));
|
return next(err || new Error('tx not found for tx id: ' + input.prevout.txid()));
|
||||||
@ -218,7 +205,7 @@ TransactionService.prototype._addMissingInputValues = function(tx, options, call
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
callback(null, tx);
|
callback(null, tx, options);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user