walletdb: increase lookahead.

This commit is contained in:
Christopher Jeffrey 2016-11-07 18:32:19 -08:00
parent 4fcb07ff5f
commit 04596522ea
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
4 changed files with 147 additions and 5 deletions

View File

@ -67,7 +67,7 @@ function Account(db, options) {
this.receiveDepth = 0;
this.changeDepth = 0;
this.nestedDepth = 0;
this.lookahead = 10;
this.lookahead = 20;
this.accountKey = null;
this.keys = [];
@ -218,7 +218,7 @@ Account.fromOptions = function fromOptions(db, options) {
* @const {Number}
*/
Account.MAX_LOOKAHEAD = 20;
Account.MAX_LOOKAHEAD = 50;
/**
* Attempt to intialize the account (generating
@ -719,6 +719,52 @@ Account.prototype.syncDepth = co(function* syncDepth(receive, change, nested) {
return result;
});
/**
* Allocate new lookahead addresses.
* @param {Number} lookahead
* @returns {Promise}
*/
Account.prototype.setLookahead = co(function* setLookahead(lookahead) {
var i, key, depth, target;
if (lookahead <= this.lookahead) {
this.db.logger.warning(
'Lookahead is not increasing for: %s/%s.',
this.id, this.name);
return;
}
depth = this.receiveDepth + this.lookahead
target = this.receiveDepth + lookahead;
for (i = depth; i < target; i++) {
key = this.deriveReceive(i);
yield this.saveKey(key);
}
depth = this.changeDepth + this.lookahead
target = this.changeDepth + lookahead;
for (i = depth; i < target; i++) {
key = this.deriveChange(i);
yield this.saveKey(key);
}
if (this.witness) {
depth = this.nestedDepth + this.lookahead
target = this.nestedDepth + lookahead;
for (i = depth; i < target; i++) {
key = this.deriveNested(i);
yield this.saveKey(key);
}
}
this.lookahead = lookahead;
this.save();
});
/**
* Convert the account to a more inspection-friendly object.
* @returns {Object}

View File

@ -1794,6 +1794,58 @@ Wallet.prototype.getOutputPaths = co(function* getOutputPaths(tx) {
return paths;
});
/**
* Increase lookahead for account.
* @param {(Number|String)?} account
* @param {Number} lookahead
* @returns {Promise}
*/
Wallet.prototype.setLookahead = co(function* setLookahead(acct, lookahead) {
var unlock = yield this.writeLock.lock();
try {
return this._setLookahead(acct, lookahead);
} finally {
unlock();
}
});
/**
* Increase lookahead for account (without a lock).
* @private
* @param {(Number|String)?} account
* @param {Number} lookahead
* @returns {Promise}
*/
Wallet.prototype._setLookahead = co(function* setLookahead(acct, lookahead) {
var account;
if (lookahead == null) {
lookahead = acct;
acct = null;
}
if (acct == null)
acct = 0;
account = yield this.getAccount(acct);
if (!account)
throw new Error('Account not found.');
this.start();
try {
yield account.setLookahead(lookahead);
} catch (e) {
this.drop();
throw e;
}
yield this.commit();
});
/**
* Sync address depths based on a transaction's outputs.
* This is used for deriving new addresses when

View File

@ -190,6 +190,7 @@ function WalletDB(options) {
this.depth = 0;
this.wallets = {};
this.keepBlocks = this.network.block.keepBlocks;
this.rescanning = false;
// We need one read lock for `get` and `create`.
// It will hold locks specific to wallet ids.
@ -387,6 +388,7 @@ WalletDB.prototype._rescan = co(function* rescan(height) {
WalletDB.prototype.scan = co(function* scan(height) {
var self = this;
var iter = this._addBlock.bind(this);
var tip;
if (!this.client)
@ -405,9 +407,13 @@ WalletDB.prototype.scan = co(function* scan(height) {
tip = yield this.getTip();
yield this.client.scan(tip.hash, this.filter, function(block, txs) {
return self._addBlock(block, txs);
});
this.rescanning = true;
try {
yield this.client.scan(tip.hash, this.filter, iter);
} finally {
this.rescanning = false;
}
});
/**

View File

@ -228,6 +228,42 @@ function r(wid, index, hash) {
return key;
}
var updateLookahead = co(function* updateLookahead() {
var WalletDB = require('../lib/wallet/walletdb');
var i, j, db, wallet;
db = new WalletDB({
network: process.argv[3],
db: 'leveldb',
location: file,
witness: false,
useCheckpoints: false,
maxFiles: 64,
resolution: false,
verify: false
});
yield db.open();
for (i = 1; i < db.depth; i++) {
wallet = yield db.get(i);
assert(wallet);
console.log('Updating wallet lookahead: %s', wallet.id);
for (j = 0; j < wallet.accountDepth; j++)
yield wallet.setLookahead(j, 20);
}
yield db.close();
});
var unstate = co(function* unstate() {
yield db.open();
batch = db.batch();
yield wipeTXDB();
yield batch.write();
yield db.close();
});
co.spawn(function* () {
yield db.open();
batch = db.batch();
@ -239,6 +275,8 @@ co.spawn(function* () {
yield patchPathMaps();
yield batch.write();
yield db.close();
yield updateLookahead();
yield unstate();
}).then(function() {
console.log('Migration complete.');
console.log('Rescan is required...');