bitcoind: update unspentoutputs with mempool
This commit is contained in:
parent
d1cf9deef0
commit
b901e10c9d
@ -822,22 +822,81 @@ Bitcoin.prototype.getAddressBalance = function(addressArg, options, callback) {
|
|||||||
*/
|
*/
|
||||||
Bitcoin.prototype.getAddressUnspentOutputs = function(addressArg, options, callback) {
|
Bitcoin.prototype.getAddressUnspentOutputs = function(addressArg, options, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
var queryMempool = _.isUndefined(options.queryMempool) ? true : options.queryMempool;
|
||||||
var addresses = self._normalizeAddressArg(addressArg);
|
var addresses = self._normalizeAddressArg(addressArg);
|
||||||
var cacheKey = addresses.join('');
|
var cacheKey = addresses.join('');
|
||||||
var utxos = self.utxosCache.get(cacheKey);
|
var utxos = self.utxosCache.get(cacheKey);
|
||||||
if (utxos) {
|
|
||||||
return setImmediate(function() {
|
function transformUnspentOutput(delta) {
|
||||||
callback(null, utxos);
|
var script = bitcore.Script.fromAddress(delta.address);
|
||||||
});
|
return {
|
||||||
} else {
|
address: delta.address,
|
||||||
self.client.getAddressUtxos({addresses: addresses}, function(err, response) {
|
txid: delta.txid,
|
||||||
|
height: -1, // unconfirmed
|
||||||
|
outputIndex: delta.index,
|
||||||
|
script: script.toHex(),
|
||||||
|
satoshis: delta.satoshis
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateWithMempool(utxos, mempoolDeltas) {
|
||||||
|
if (!mempoolDeltas || !mempoolDeltas.length) {
|
||||||
|
return utxos;
|
||||||
|
}
|
||||||
|
var isSpentOutputs = false;
|
||||||
|
var spentOutputs = [];
|
||||||
|
for (var i = 0; i < mempoolDeltas.length; i++) {
|
||||||
|
var delta = mempoolDeltas[i];
|
||||||
|
if (delta.satoshis > 0) {
|
||||||
|
utxos.push(transformUnspentOutput(delta));
|
||||||
|
} else if (delta.satoshis < 0) {
|
||||||
|
if (!spentOutputs[delta.prevtxid]) {
|
||||||
|
spentOutputs[delta.prevtxid] = [delta.prevout];
|
||||||
|
} else {
|
||||||
|
spentOutputs[delta.prevtxid].push(delta.prevout);
|
||||||
|
}
|
||||||
|
isSpentOutputs = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isSpentOutputs) {
|
||||||
|
return utxos.filter(function(utxo) {
|
||||||
|
if (!spentOutputs[utxo.txid]) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return (spentOutputs[utxo.txid].indexOf(utxo.outputIndex) === -1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return utxos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function finish(mempoolDeltas) {
|
||||||
|
if (utxos) {
|
||||||
|
return setImmediate(function() {
|
||||||
|
callback(null, updateWithMempool(utxos, mempoolDeltas).reverse());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.client.getAddressUtxos({addresses: addresses}, function(err, response) {
|
||||||
|
if (err) {
|
||||||
|
return callback(self._wrapRPCError(err));
|
||||||
|
}
|
||||||
|
self.utxosCache.set(cacheKey, response.result);
|
||||||
|
callback(null, updateWithMempool(response.result, mempoolDeltas).reverse());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queryMempool) {
|
||||||
|
self.client.getAddressMempool({addresses: addresses}, function(err, response) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback(self._wrapRPCError(err));
|
return callback(self._wrapRPCError(err));
|
||||||
}
|
}
|
||||||
self.utxosCache.set(cacheKey, response.result);
|
finish(response.result);
|
||||||
callback(null, response.result);
|
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Bitcoin.prototype._getBalanceFromMempool = function(deltas) {
|
Bitcoin.prototype._getBalanceFromMempool = function(deltas) {
|
||||||
|
|||||||
@ -5,7 +5,7 @@ platform=`uname -a | awk '{print tolower($1)}'`
|
|||||||
arch=`uname -m`
|
arch=`uname -m`
|
||||||
version="0.12.0"
|
version="0.12.0"
|
||||||
url="https://github.com/braydonf/bitcoin/releases/download"
|
url="https://github.com/braydonf/bitcoin/releases/download"
|
||||||
tag="v0.12.0-bitcore-beta3"
|
tag="v0.12.0-bitcore-beta4"
|
||||||
|
|
||||||
cd "${root_dir}/bin"
|
cd "${root_dir}/bin"
|
||||||
|
|
||||||
|
|||||||
@ -1381,7 +1381,9 @@ describe('Bitcoin Service', function() {
|
|||||||
getAddressUtxos: sinon.stub().callsArgWith(1, {code: -1, message: 'Test error'})
|
getAddressUtxos: sinon.stub().callsArgWith(1, {code: -1, message: 'Test error'})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var options = {};
|
var options = {
|
||||||
|
queryMempool: false
|
||||||
|
};
|
||||||
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
bitcoind.getAddressUnspentOutputs(address, options, function(err) {
|
bitcoind.getAddressUnspentOutputs(address, options, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
@ -1408,7 +1410,9 @@ describe('Bitcoin Service', function() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var options = {};
|
var options = {
|
||||||
|
queryMempool: false
|
||||||
|
};
|
||||||
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -1439,7 +1443,9 @@ describe('Bitcoin Service', function() {
|
|||||||
getAddressUtxos: getAddressUtxos
|
getAddressUtxos: getAddressUtxos
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var options = {};
|
var options = {
|
||||||
|
queryMempool: false
|
||||||
|
};
|
||||||
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
var address = '1Cj4UZWnGWAJH1CweTMgPLQMn26WRMfXmo';
|
||||||
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
bitcoind.getAddressUnspentOutputs(address, options, function(err, utxos) {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user