diff --git a/lib/bcoin/chaindb.js b/lib/bcoin/chaindb.js index e6638b8a..cf04a80f 100644 --- a/lib/bcoin/chaindb.js +++ b/lib/bcoin/chaindb.js @@ -1121,20 +1121,19 @@ ChainDB.prototype.getCoins = function getCoins(hash, callback) { * @param {Function} callback */ -ChainDB.prototype.scan = function scan(start, hashes, iter, callback) { +ChainDB.prototype.scan = function scan(start, filter, iter, callback) { var self = this; - var hashMap = {}; var total = 0; - var i; + var i, j, hashes, address, tx, txs; if (!start) start = this.network.genesis.hash; - for (i = 0; i < hashes.length; i++) - hashMap[hashes[i]] = true; - this.logger.info('Scanning from block %s.', utils.revHex(start)); + if (Array.isArray(filter)) + filter = utils.toMap(filter); + (function next(err, hash) { if (err) return callback(err); @@ -1164,18 +1163,25 @@ ChainDB.prototype.scan = function scan(start, hashes, iter, callback) { utils.revHex(hash), block.height); - utils.forEachSerial(block.txs, function(tx, next) { - var hashes = tx.getHashes('hex'); - var i, hash; + txs = []; - for (i = 0; i < hashes.length; i++) { - hash = hashes[i]; - if (hashMap[hash]) - return iter(tx, entry, next); + for (i = 0; i < block.txs.length; i++) { + tx = block.txs[i]; + hashes = tx.getHashes('hex'); + + for (j = 0; j < hashes.length; j++) { + address = hashes[j]; + if (filter[address]) { + txs.push(tx); + break; + } } + } - next(); - }, function(err) { + if (txs.length === 0) + return self.getNextHash(hash, next); + + iter(txs, entry, function(err) { if (err) return next(err); self.getNextHash(hash, next); diff --git a/lib/bcoin/http/server.js b/lib/bcoin/http/server.js index 927726a2..ab9450f3 100644 --- a/lib/bcoin/http/server.js +++ b/lib/bcoin/http/server.js @@ -1349,12 +1349,15 @@ ClientSocket.prototype.testFilter = function testFilter(tx) { ClientSocket.prototype.scan = function scan(start, callback) { var self = this; - var hashes = Object.keys(this.filter); + var i; start = utils.revHex(start); - this.chain.db.scan(start, hashes, function(tx, entry, next) { - self.emit('block tx', [tx.toJSON()], entry.toJSON()); + this.chain.db.scan(start, this.filter, function(txs, entry, next) { + for (i = 0; i < txs.length; i++) + txs[i] = txs[i].toJSON(); + + self.emit('block tx', txs, entry.toJSON()); next(); }, function(err) { if (err) diff --git a/lib/bcoin/walletdb.js b/lib/bcoin/walletdb.js index ebd717cb..c8f0bdf0 100644 --- a/lib/bcoin/walletdb.js +++ b/lib/bcoin/walletdb.js @@ -921,27 +921,16 @@ WalletDB.prototype.getWallets = function getWallets(callback) { WalletDB.prototype.rescan = function rescan(chaindb, callback) { var self = this; - this.getTip(function(err, hash, height) { + + this.getAddresses(function(err, hashes) { if (err) return callback(err); - if (!hash) - return callback(new Error('Best hash not found.')); + self.logger.info('Scanning for %d addresses.', hashes.length); - self.getAddresses(function(err, hashes) { - if (err) - return callback(err); - - self.logger.info('Scanning for %d addresses.', hashes.length); - - chaindb.scan(hash, hashes, function(tx, block, next) { - self.addTX(tx, function(err) { - if (err) - return next(err); - self.setTip(block.hash, block.height, next); - }); - }, callback); - }); + chaindb.scan(self.tip, hashes, function(txs, block, next) { + self.addBlock(block, txs, next); + }, callback); }); };