Fixes for missing transaction id.
This commit is contained in:
parent
ce09b816bb
commit
b4214e6ffc
@ -1,5 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var assert = require('assert');
|
||||||
var BaseService = require('../../service');
|
var BaseService = require('../../service');
|
||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
@ -277,7 +278,7 @@ AddressService.prototype.blockHandler = function(block, connectBlock, callback)
|
|||||||
});
|
});
|
||||||
next();
|
next();
|
||||||
} else { // uncommon and slower, this happens during a reorg
|
} else { // uncommon and slower, this happens during a reorg
|
||||||
self.node.services.transaction.getTransaction(input.prevTxId, {}, function(err, tx) {
|
self.node.services.transaction.getTransaction(input.prevTxId.toString('hex'), {}, function(err, tx) {
|
||||||
var utxo = tx.outputs[input.outputIndex];
|
var utxo = tx.outputs[input.outputIndex];
|
||||||
var inputValue = self._encoding.encodeUtxoIndexValue(tx.__height, utxo.satoshis, utxo._scriptBuffer);
|
var inputValue = self._encoding.encodeUtxoIndexValue(tx.__height, utxo.satoshis, utxo._scriptBuffer);
|
||||||
operations.push({
|
operations.push({
|
||||||
@ -1104,7 +1105,7 @@ AddressService.prototype.getAddressHistory = function(addresses, options, callba
|
|||||||
});
|
});
|
||||||
}, function() {
|
}, function() {
|
||||||
async.mapLimit(txids, self.concurrency, function(txid, next) {
|
async.mapLimit(txids, self.concurrency, function(txid, next) {
|
||||||
self.node.services.transaction.getTransaction(txid, options, function(err, tx) {
|
self.node.services.transaction.getTransaction(txid.toString('hex'), options, function(err, tx) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
@ -1170,6 +1171,7 @@ AddressService.prototype.getAddressTxidsWithHeights = function(address, options,
|
|||||||
|
|
||||||
stream.on('data', function(buffer) {
|
stream.on('data', function(buffer) {
|
||||||
var key = self._encoding.decodeAddressIndexKey(buffer);
|
var key = self._encoding.decodeAddressIndexKey(buffer);
|
||||||
|
assert(key.txid.length === 64, 'AddressService, Txid: ' + key.txid + ' with length: ' + key.txid.length + ' does not resemble a txid.');
|
||||||
txids[key.txid] = key.height;
|
txids[key.txid] = key.height;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -176,6 +176,7 @@ DB.prototype.start = function(callback) {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info('Bitcoin network tip is currently: ' + self.bitcoind.tiphash + ' at height: ' + self.bitcoind.height);
|
||||||
self._sync.sync();
|
self._sync.sync();
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -300,7 +301,6 @@ DB.prototype.loadTips = function(callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var hash;
|
var hash;
|
||||||
//genesis block, set to -1 because we have no yet processed the blocks
|
|
||||||
if (!tipData) {
|
if (!tipData) {
|
||||||
hash = new Array(65).join('0');
|
hash = new Array(65).join('0');
|
||||||
self[tip] = {
|
self[tip] = {
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var assert = require('assert');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var BaseService = require('../../service');
|
var BaseService = require('../../service');
|
||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var Encoding = require('./encoding');
|
var Encoding = require('./encoding');
|
||||||
var levelup = require('levelup');
|
var levelup = require('levelup');
|
||||||
|
var index = require('../../../');
|
||||||
|
var log = index.log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Transaction Service builds upon the Database Service and the Bitcoin Service to add additional
|
* The Transaction Service builds upon the Database Service and the Bitcoin Service to add additional
|
||||||
@ -154,13 +157,14 @@ TransactionService.prototype._getInputValues = function(tx, callback) {
|
|||||||
TransactionService.prototype.getTransaction = function(txid, options, callback) {
|
TransactionService.prototype.getTransaction = function(txid, options, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
|
assert(txid.length === 64, 'Transaction, Txid: ' + txid + ' with length: ' + txid.length + ' does not resemble a txid.');
|
||||||
|
|
||||||
if(self.currentTransactions[txid]) {
|
if(self.currentTransactions[txid]) {
|
||||||
return setImmediate(function() {
|
return setImmediate(function() {
|
||||||
callback(null, self.currentTransactions[txid]);
|
callback(null, self.currentTransactions[txid]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
txid = txid.toString('hex');
|
|
||||||
var key = self.encoding.encodeTransactionKey(txid);
|
var key = self.encoding.encodeTransactionKey(txid);
|
||||||
|
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
var assert = require('assert');
|
||||||
var BaseService = require('../../service');
|
var BaseService = require('../../service');
|
||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var index = require('../../');
|
var index = require('../../');
|
||||||
@ -522,7 +523,7 @@ WalletService.prototype._endpointGetAddresses = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
res.status(200).jsonp({
|
res.status(200).jsonp({
|
||||||
addresses: addresses
|
addresses: addresses.length
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -614,6 +615,53 @@ WalletService.prototype._endpointRegisterWallet = function() {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
WalletService.prototype._endpointResyncAddresses = function() {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
return function(req, res) {
|
||||||
|
var walletId = req.params.walletId;
|
||||||
|
|
||||||
|
|
||||||
|
if (!walletId) {
|
||||||
|
return utils.sendError(new Error('WalletId must be given.'), res);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!self._isJobQueueReady()) {
|
||||||
|
return utils.sendError(new Error('Job queue is currently overloaded, please try again later.'), res);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.db.pauseSync(function() {
|
||||||
|
|
||||||
|
self._getAddresses(walletId, function(err, oldAddresses) {
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
return utils.sendError(err, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!oldAddresses) {
|
||||||
|
return res.status(404).send('Not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
self._removeWallet(walletId, function(err) {
|
||||||
|
|
||||||
|
if(err) {
|
||||||
|
return utils.sendError(err, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
self._createWallet(walletId, function() {
|
||||||
|
|
||||||
|
var jobId = utils.generateJobId();
|
||||||
|
self._importAddresses(walletId, oldAddresses, jobId, self._jobCompletionCallback.bind(self));
|
||||||
|
res.status(200).jsonp({jobId: jobId});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
WalletService.prototype._endpointPostAddresses = function() {
|
WalletService.prototype._endpointPostAddresses = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
return function(req, res) {
|
return function(req, res) {
|
||||||
@ -668,6 +716,7 @@ WalletService.prototype._endpointGetTransactions = function() {
|
|||||||
transform._transform = function(chunk, enc, callback) {
|
transform._transform = function(chunk, enc, callback) {
|
||||||
|
|
||||||
var txid = self._encoding.decodeWalletTransactionKey(chunk).txid.toString('hex');
|
var txid = self._encoding.decodeWalletTransactionKey(chunk).txid.toString('hex');
|
||||||
|
assert(txid.length === 64, 'WalletService, Txid: ' + txid + ' with length: ' + txid.length + ' does not resemble a txid.');
|
||||||
|
|
||||||
self._getTransactionFromDb(options, txid, function(err, tx) {
|
self._getTransactionFromDb(options, txid, function(err, tx) {
|
||||||
|
|
||||||
@ -1023,6 +1072,7 @@ WalletService.prototype._importAddresses = function(walletId, addresses, jobId,
|
|||||||
return callback(err, jobResults);
|
return callback(err, jobResults);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info('loaded addresses, count: ', oldAddresses.length);
|
||||||
async.parallel(
|
async.parallel(
|
||||||
[
|
[
|
||||||
self._getUTXOIndexOperations.bind(self, walletId, addresses, jobId),
|
self._getUTXOIndexOperations.bind(self, walletId, addresses, jobId),
|
||||||
@ -1087,6 +1137,7 @@ WalletService.prototype._getUTXOIndexOperations = function(walletId, addresses,
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info('completed gathering utxos: ', utxos.length);
|
||||||
var operations = [];
|
var operations = [];
|
||||||
|
|
||||||
for(var i = 0; i < utxos.length; i++) {
|
for(var i = 0; i < utxos.length; i++) {
|
||||||
@ -1122,11 +1173,15 @@ WalletService.prototype._getTxidIndexOperations = function(walletId, addresses,
|
|||||||
var self = this;
|
var self = this;
|
||||||
var txids = {};
|
var txids = {};
|
||||||
|
|
||||||
|
var logCount = 0;
|
||||||
async.eachLimit(addresses, 10, function(address, next) {
|
async.eachLimit(addresses, 10, function(address, next) {
|
||||||
self.node.services.address.getAddressTxidsWithHeights(address, null, function(err, tmpTxids) {
|
self.node.services.address.getAddressTxidsWithHeights(address, null, function(err, tmpTxids) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
|
if (logCount++ % 1000 === 0) {
|
||||||
|
log.info('loaded 10 addresses, total count: ', Object.keys(txids).length);
|
||||||
|
}
|
||||||
txids = _.merge(txids, tmpTxids);
|
txids = _.merge(txids, tmpTxids);
|
||||||
return next();
|
return next();
|
||||||
});
|
});
|
||||||
@ -1135,7 +1190,6 @@ WalletService.prototype._getTxidIndexOperations = function(walletId, addresses,
|
|||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
//there is a big problem when we have multiple txs for our wallet for the same height!
|
|
||||||
|
|
||||||
var operations = Object.keys(txids).map(function(txid) {
|
var operations = Object.keys(txids).map(function(txid) {
|
||||||
return {
|
return {
|
||||||
@ -1304,6 +1358,9 @@ WalletService.prototype._setupWriteRoutes = function(app) {
|
|||||||
v.checkAddresses,
|
v.checkAddresses,
|
||||||
s._endpointPostAddresses()
|
s._endpointPostAddresses()
|
||||||
);
|
);
|
||||||
|
app.put('/wallets/:walletId/addresses/resync',
|
||||||
|
s._endpointResyncAddresses()
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user