walletdb: increase lookahead.
This commit is contained in:
parent
4fcb07ff5f
commit
04596522ea
@ -67,7 +67,7 @@ function Account(db, options) {
|
|||||||
this.receiveDepth = 0;
|
this.receiveDepth = 0;
|
||||||
this.changeDepth = 0;
|
this.changeDepth = 0;
|
||||||
this.nestedDepth = 0;
|
this.nestedDepth = 0;
|
||||||
this.lookahead = 10;
|
this.lookahead = 20;
|
||||||
this.accountKey = null;
|
this.accountKey = null;
|
||||||
this.keys = [];
|
this.keys = [];
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ Account.fromOptions = function fromOptions(db, options) {
|
|||||||
* @const {Number}
|
* @const {Number}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Account.MAX_LOOKAHEAD = 20;
|
Account.MAX_LOOKAHEAD = 50;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attempt to intialize the account (generating
|
* Attempt to intialize the account (generating
|
||||||
@ -719,6 +719,52 @@ Account.prototype.syncDepth = co(function* syncDepth(receive, change, nested) {
|
|||||||
return result;
|
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.
|
* Convert the account to a more inspection-friendly object.
|
||||||
* @returns {Object}
|
* @returns {Object}
|
||||||
|
|||||||
@ -1794,6 +1794,58 @@ Wallet.prototype.getOutputPaths = co(function* getOutputPaths(tx) {
|
|||||||
return paths;
|
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.
|
* Sync address depths based on a transaction's outputs.
|
||||||
* This is used for deriving new addresses when
|
* This is used for deriving new addresses when
|
||||||
|
|||||||
@ -190,6 +190,7 @@ function WalletDB(options) {
|
|||||||
this.depth = 0;
|
this.depth = 0;
|
||||||
this.wallets = {};
|
this.wallets = {};
|
||||||
this.keepBlocks = this.network.block.keepBlocks;
|
this.keepBlocks = this.network.block.keepBlocks;
|
||||||
|
this.rescanning = false;
|
||||||
|
|
||||||
// We need one read lock for `get` and `create`.
|
// We need one read lock for `get` and `create`.
|
||||||
// It will hold locks specific to wallet ids.
|
// 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) {
|
WalletDB.prototype.scan = co(function* scan(height) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
var iter = this._addBlock.bind(this);
|
||||||
var tip;
|
var tip;
|
||||||
|
|
||||||
if (!this.client)
|
if (!this.client)
|
||||||
@ -405,9 +407,13 @@ WalletDB.prototype.scan = co(function* scan(height) {
|
|||||||
|
|
||||||
tip = yield this.getTip();
|
tip = yield this.getTip();
|
||||||
|
|
||||||
yield this.client.scan(tip.hash, this.filter, function(block, txs) {
|
this.rescanning = true;
|
||||||
return self._addBlock(block, txs);
|
|
||||||
});
|
try {
|
||||||
|
yield this.client.scan(tip.hash, this.filter, iter);
|
||||||
|
} finally {
|
||||||
|
this.rescanning = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -228,6 +228,42 @@ function r(wid, index, hash) {
|
|||||||
return key;
|
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* () {
|
co.spawn(function* () {
|
||||||
yield db.open();
|
yield db.open();
|
||||||
batch = db.batch();
|
batch = db.batch();
|
||||||
@ -239,6 +275,8 @@ co.spawn(function* () {
|
|||||||
yield patchPathMaps();
|
yield patchPathMaps();
|
||||||
yield batch.write();
|
yield batch.write();
|
||||||
yield db.close();
|
yield db.close();
|
||||||
|
yield updateLookahead();
|
||||||
|
yield unstate();
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
console.log('Migration complete.');
|
console.log('Migration complete.');
|
||||||
console.log('Rescan is required...');
|
console.log('Rescan is required...');
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user