diff --git a/lib/wallet/layout-browser.js b/lib/wallet/layout-browser.js index f92d6128..b932df39 100644 --- a/lib/wallet/layout-browser.js +++ b/lib/wallet/layout-browser.js @@ -88,9 +88,7 @@ layouts.walletdb = { }, Tt: function Tt(key) { return [key.slice(1, 65)]; - }, - t: 't', - u: 'u' + } }; layouts.txdb = { diff --git a/lib/wallet/layout.js b/lib/wallet/layout.js index 8ad047e2..05ec3169 100644 --- a/lib/wallet/layout.js +++ b/lib/wallet/layout.js @@ -176,9 +176,7 @@ layouts.walletdb = { assert(Buffer.isBuffer(key)); assert(key.length === 33); return key.toString('hex', 1, 33); - }, - t: Buffer.from([0x74]), - u: Buffer.from([0x75]) + } }; /* diff --git a/lib/wallet/masterkey.js b/lib/wallet/masterkey.js index 1d18a96e..1ed64d42 100644 --- a/lib/wallet/masterkey.js +++ b/lib/wallet/masterkey.js @@ -577,7 +577,7 @@ class MasterKey { this.alg = br.readU8(); - assert(MasterKey.algByVal[this.alg]); + assert(this.alg < MasterKey.algByVal.length); this.n = br.readU32(); this.r = br.readU32(); diff --git a/lib/wallet/walletdb.js b/lib/wallet/walletdb.js index 022a3303..d7ab1cec 100644 --- a/lib/wallet/walletdb.js +++ b/lib/wallet/walletdb.js @@ -356,6 +356,9 @@ class WalletDB extends EventEmitter { async migrateState(state) { const b = this.db.batch(); + + this.logger.info('Migrating to new sync state.'); + const hashes = await this.client.getHashes(0, state.height); for (let height = 0; height < hashes.length; height++) { @@ -816,12 +819,15 @@ class WalletDB extends EventEmitter { if (!wid) return false; + // Grab all locks. const unlock1 = await this.readLock.lock(wid); - const unlock2 = await this.txLock.lock(); + const unlock2 = await this.writeLock.lock(); + const unlock3 = await this.txLock.lock(); try { return await this._remove(wid); } finally { + unlock3(); unlock2(); unlock1(); } @@ -835,6 +841,11 @@ class WalletDB extends EventEmitter { */ async _remove(wid) { + const tlayout = layouts.txdb; + + if (wid === 1) + throw new Error('Cannot remove primary wallet.'); + const data = await this.db.get(layout.w(wid)); if (!data) @@ -847,19 +858,18 @@ class WalletDB extends EventEmitter { b.del(layout.w(wid)); b.del(layout.l(id)); - const pathIter = this.db.iterator({ + const piter = this.db.iterator({ gte: layout.P(wid, encoding.NULL_HASH), - lte: layout.P(wid, encoding.HIGH_HASH), - keys: true + lte: layout.P(wid, encoding.HIGH_HASH) }); - await pathIter.each(async (key, value) => { + await piter.each((key, value) => { const hash = layout.Pp(key); b.del(key); return this.removePathMap(b, hash, wid); }); - const removeRange = async (opt) => { + const removeRange = (opt) => { return this.db.iterator(opt).each(key => b.del(key)); }; @@ -884,21 +894,18 @@ class WalletDB extends EventEmitter { }); await removeRange({ - gte: layout.t, - lt: layout.u + gte: tlayout.prefix(wid), + lt: tlayout.prefix(wid + 1) }); - const tlayout = layouts.txdb; - const prefix = tlayout.prefix(wid); - const bucket = this.db.bucket(prefix); + const bucket = this.db.bucket(tlayout.prefix(wid)); const biter = bucket.iterator({ gte: tlayout.b(0x00000000), - lte: tlayout.b(0xffffffff), - keys: true + lte: tlayout.b(0xffffffff) }); - await biter.each(async (key, value) => { + await biter.each((key, value) => { const height = layout.bb(key); return this.removeBlockMap(b, height, wid); }); @@ -909,25 +916,28 @@ class WalletDB extends EventEmitter { keys: true }); - await siter.each(async (key, value) => { + await siter.each((key, value) => { const [hash, index] = layout.ss(key); return this.removeOutpointMap(b, hash, index, wid); }); - const piter = bucket.iterator({ + const uiter = bucket.iterator({ gte: tlayout.p(encoding.NULL_HASH), lte: tlayout.p(encoding.HIGH_HASH), keys: true }); - await piter.each(async (key, value) => { + await uiter.each((key, value) => { const hash = layout.pp(key); return this.removeTXMap(b, hash, wid); }); - const w = await this._get(wid); - await w.destroy(); - this.unregister(w); + const wallet = this.wallets.get(wid); + + if (wallet) { + await wallet.destroy(); + this.unregister(wallet); + } await b.write(); diff --git a/migrate/walletdb6to7.js b/migrate/walletdb6to7.js index 2ee65af7..3257bd53 100644 --- a/migrate/walletdb6to7.js +++ b/migrate/walletdb6to7.js @@ -456,7 +456,6 @@ async function updateAccount(wid, acct) { }; const count = br.readU8(); - const keys = []; for (let i = 0; i < count; i++) {