From 0b43b3b85ceeb910e7b028ed2d67e20dcacaec2d Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Wed, 28 Oct 2015 13:23:13 -0300 Subject: [PATCH] cache address activity --- lib/model/address.js | 2 ++ lib/server.js | 25 +++++++++++++++++++++++-- lib/storage.js | 11 +++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/model/address.js b/lib/model/address.js index a286187..c6af424 100644 --- a/lib/model/address.js +++ b/lib/model/address.js @@ -19,6 +19,7 @@ Address.create = function(opts) { x.publicKeys = opts.publicKeys; x.network = Bitcore.Address(x.address).toObject().network; x.type = opts.type || WalletUtils.SCRIPT_TYPES.P2SH; + x.hasActivity = undefined; return x; }; @@ -34,6 +35,7 @@ Address.fromObj = function(obj) { x.path = obj.path; x.publicKeys = obj.publicKeys; x.type = obj.type || WalletUtils.SCRIPT_TYPES.P2SH; + x.hasActivity = obj.hasActivity; return x; }; diff --git a/lib/server.js b/lib/server.js index b4a9bc7..1350148 100644 --- a/lib/server.js +++ b/lib/server.js @@ -702,10 +702,31 @@ WalletService.prototype._canCreateAddress = function(ignoreMaxGap, cb) { var latestAddresses = _.takeRight(_.reject(addresses, { isChange: true }), WalletService.MAX_MAIN_ADDRESS_GAP); - if (latestAddresses.length < WalletService.MAX_MAIN_ADDRESS_GAP) return cb(null, true); + if (latestAddresses.length < WalletService.MAX_MAIN_ADDRESS_GAP || _.any(latestAddresses, { + hasActivity: true + })) return cb(null, true); var bc = self._getBlockchainExplorer(latestAddresses[0].network); - bc.getAddressActivity(_.pluck(latestAddresses, 'address'), cb); + var activityFound = false; + var i = latestAddresses.length; + async.whilst(function() { + return i > 0 && !activityFound; + }, function(next) { + bc.getAddressActivity(latestAddresses[--i].address, function(err, res) { + if (err) return next(err); + activityFound = !!res; + return next(); + }); + }, function(err) { + if (err) return cb(err); + if (!activityFound) return cb(null, false); + + var address = latestAddresses[i]; + address.hasActivity = true; + self.storage.storeAddress(self.walletId, address, function(err) { + return cb(err, true); + }); + }); }); }; diff --git a/lib/storage.js b/lib/storage.js index 983737f..e525615 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -383,6 +383,17 @@ Storage.prototype.fetchAddresses = function(walletId, cb) { }); }; +Storage.prototype.storeAddress = function(walletId, address, cb) { + var self = this; + + self.db.collection(collections.ADDRESSES).update({ + address: address.address + }, address, { + w: 1, + upsert: false, + }, cb); +}; + Storage.prototype.storeAddressAndWallet = function(wallet, addresses, cb) { var self = this;