diff --git a/lib/blockchain/chaindb.js b/lib/blockchain/chaindb.js index d5c31dc8..d3538275 100644 --- a/lib/blockchain/chaindb.js +++ b/lib/blockchain/chaindb.js @@ -27,7 +27,6 @@ const ChainEntry = require('./chainentry'); const TXMeta = require('../primitives/txmeta'); const U8 = encoding.U8; const U32 = encoding.U32; -const DUMMY = Buffer.from([0]); /** * The database backend for the {@link Chain} object. @@ -1318,7 +1317,7 @@ ChainDB.prototype._save = async function save(entry, block, view) { // Tip index. this.del(layout.p(entry.prevBlock)); - this.put(layout.p(hash), DUMMY); + this.put(layout.p(hash), null); // Update state caches. this.saveUpdates(); @@ -1520,7 +1519,7 @@ ChainDB.prototype.reset = async function reset(block) { // Revert the tip index. this.del(layout.p(tip.hash)); - this.put(layout.p(tip.prevBlock), DUMMY); + this.put(layout.p(tip.prevBlock), null); // Remove all records (including // main-chain-only records). @@ -1859,7 +1858,7 @@ ChainDB.prototype.indexTX = function indexTX(tx, view, entry, index) { if (this.options.indexAddress) { let hashes = tx.getHashes(view); for (let addr of hashes) - this.put(layout.T(addr, hash), DUMMY); + this.put(layout.T(addr, hash), null); } } @@ -1885,7 +1884,7 @@ ChainDB.prototype.indexTX = function indexTX(tx, view, entry, index) { if (!addr) continue; - this.put(layout.C(addr, hash, i), DUMMY); + this.put(layout.C(addr, hash, i), null); } }; @@ -1919,7 +1918,7 @@ ChainDB.prototype.unindexTX = function unindexTX(tx, view) { if (!addr) continue; - this.put(layout.C(addr, prevout.hash, prevout.index), DUMMY); + this.put(layout.C(addr, prevout.hash, prevout.index), null); } } diff --git a/lib/db/lowlevelup.js b/lib/db/lowlevelup.js index 25299c0f..d1685f0c 100644 --- a/lib/db/lowlevelup.js +++ b/lib/db/lowlevelup.js @@ -10,12 +10,14 @@ const assert = require('assert'); const Lock = require('../utils/lock'); const co = require('../utils/co'); + +const LOW = Buffer.from([0x00]); +const HIGH = Buffer.from([0xff]); + let VERSION_ERROR; /** * Extremely low-level version of levelup. - * The only levelup feature it provides is - * error-wrapping. * * This avoids pulling in extra deps and * lowers memory usage. @@ -288,6 +290,9 @@ LowlevelUp.prototype.get = function get(key) { */ LowlevelUp.prototype.put = function put(key, value) { + if (!value) + value = LOW; + return new Promise((resolve, reject) => { if (!this.loaded) { reject(new Error('Database is closed.')); @@ -396,10 +401,10 @@ LowlevelUp.prototype.approximateSize = function approximateSize(start, end) { LowlevelUp.prototype.compactRange = function compactRange(start, end) { if (!start) - start = Buffer.from([0x00]); + start = LOW; if (!end) - end = Buffer.from([0xff]); + end = HIGH; return new Promise((resolve, reject) => { if (!this.loaded) { @@ -564,8 +569,8 @@ LowlevelUp.prototype.dump = async function dump() { let records = {}; let items = await this.range({ - gte: Buffer.from([0x00]), - lte: Buffer.from([0xff]) + gte: LOW, + lte: HIGH }); for (let i = 0; i < items.length; i++) { @@ -678,7 +683,11 @@ function Batch(db) { */ Batch.prototype.put = function put(key, value) { + if (!value) + value = LOW; + this.batch.put(key, value); + return this; }; diff --git a/lib/wallet/txdb.js b/lib/wallet/txdb.js index e913e6b9..8b15fbde 100644 --- a/lib/wallet/txdb.js +++ b/lib/wallet/txdb.js @@ -24,7 +24,6 @@ const Script = require('../script/script'); const BlockMapRecord = records.BlockMapRecord; const OutpointMapRecord = records.OutpointMapRecord; const TXRecord = records.TXRecord; -const DUMMY = Buffer.from([0]); /** * TXDB @@ -299,7 +298,7 @@ TXDB.prototype.saveCredit = async function saveCredit(credit, path) { await this.addOutpointMap(coin.hash, coin.index); this.put(layout.c(coin.hash, coin.index), raw); - this.put(layout.C(path.account, coin.hash, coin.index), DUMMY); + this.put(layout.C(path.account, coin.hash, coin.index), null); this.coinCache.push(key, raw); }; @@ -763,7 +762,7 @@ TXDB.prototype._add = async function add(tx, block) { // We need to index every spender // hash to detect "passive" // replace-by-fee. - this.put(layout.r(hash), DUMMY); + this.put(layout.r(hash), null); return; } @@ -919,24 +918,24 @@ TXDB.prototype.insert = async function insert(wtx, block) { // Save and index the transaction record. this.put(layout.t(hash), wtx.toRaw()); - this.put(layout.m(wtx.ps, hash), DUMMY); + this.put(layout.m(wtx.ps, hash), null); if (!block) - this.put(layout.p(hash), DUMMY); + this.put(layout.p(hash), null); else - this.put(layout.h(height, hash), DUMMY); + this.put(layout.h(height, hash), null); // Do some secondary indexing for account-based // queries. This saves us a lot of time for // queries later. for (let account of details.accounts) { - this.put(layout.T(account, hash), DUMMY); - this.put(layout.M(account, wtx.ps, hash), DUMMY); + this.put(layout.T(account, hash), null); + this.put(layout.M(account, wtx.ps, hash), null); if (!block) - this.put(layout.P(account, hash), DUMMY); + this.put(layout.P(account, hash), null); else - this.put(layout.H(account, height, hash), DUMMY); + this.put(layout.H(account, height, hash), null); } // Update block records. @@ -1105,12 +1104,12 @@ TXDB.prototype._confirm = async function confirm(wtx, block) { // updated. Also reindex for height. this.put(layout.t(hash), wtx.toRaw()); this.del(layout.p(hash)); - this.put(layout.h(height, hash), DUMMY); + this.put(layout.h(height, hash), null); // Secondary indexing also needs to change. for (let account of details.accounts) { this.del(layout.P(account, hash)); - this.put(layout.H(account, height, hash), DUMMY); + this.put(layout.H(account, height, hash), null); } if (block) { @@ -1431,12 +1430,12 @@ TXDB.prototype.disconnect = async function disconnect(wtx, block) { // block properties and reindex due // to the height change. this.put(layout.t(hash), wtx.toRaw()); - this.put(layout.p(hash), DUMMY); + this.put(layout.p(hash), null); this.del(layout.h(height, hash)); // Secondary indexing also needs to change. for (let account of details.accounts) { - this.put(layout.P(account, hash), DUMMY); + this.put(layout.P(account, hash), null); this.del(layout.H(account, height, hash)); } diff --git a/lib/wallet/walletdb.js b/lib/wallet/walletdb.js index 1864ff71..7e637625 100644 --- a/lib/wallet/walletdb.js +++ b/lib/wallet/walletdb.js @@ -38,7 +38,6 @@ const PathMapRecord = records.PathMapRecord; const OutpointMapRecord = records.OutpointMapRecord; const TXRecord = records.TXRecord; const U32 = encoding.U32; -const DUMMY = Buffer.from([0]); /** * WalletDB @@ -1256,7 +1255,7 @@ WalletDB.prototype.savePath = async function savePath(wallet, path) { batch.put(layout.P(wid, hash), path.toRaw()); // Wallet ID + Account Index + Address Hash -> Dummy - batch.put(layout.r(wid, path.account, hash), DUMMY); + batch.put(layout.r(wid, path.account, hash), null); }; /**