diff --git a/lib/bcoin/address.js b/lib/bcoin/address.js index 25ad6d4a..5381279b 100644 --- a/lib/bcoin/address.js +++ b/lib/bcoin/address.js @@ -449,10 +449,15 @@ Address.validate = function validate(address, type) { * @returns {Hash|null} */ -Address.getHash = function getHash(data) { +Address.getHash = function getHash(data, enc) { var hash; - if (data instanceof Address) { + if (utils.isHex(data)) + return enc === 'hex' ? data : new Buffer(data, 'hex'); + + if (Buffer.isBuffer(data)) { + hash = data; + } else if (data instanceof Address) { hash = data.hash; } else { try { @@ -462,7 +467,9 @@ Address.getHash = function getHash(data) { } } - return hash.toString('hex'); + return enc === 'hex' + ? hash.toString('hex') + : hash; }; /* diff --git a/lib/bcoin/input.js b/lib/bcoin/input.js index 861e2edf..fafa8b99 100644 --- a/lib/bcoin/input.js +++ b/lib/bcoin/input.js @@ -178,14 +178,15 @@ Input.prototype.getAddress = function getAddress() { /** * Get the address hash. + * @param {String?} enc * @returns {Hash} hash */ -Input.prototype.getHash = function getHash() { +Input.prototype.getHash = function getHash(enc) { var address = this.getAddress(); if (!address) return; - return address.getHash('hex'); + return address.getHash(enc); }; /** diff --git a/lib/bcoin/mempool.js b/lib/bcoin/mempool.js index 1a4cbe01..d2062cae 100644 --- a/lib/bcoin/mempool.js +++ b/lib/bcoin/mempool.js @@ -469,7 +469,7 @@ Mempool.prototype.getCoinsByAddress = function getCoinsByAddress(addresses, call addresses = utils.uniq(addresses); utils.forEachSerial(addresses, function(address, next) { - address = bcoin.address.getHash(address); + address = bcoin.address.getHash(address, 'hex'); if (!address) return next(); @@ -513,7 +513,7 @@ Mempool.prototype.getTXByAddress = function getTXByAddress(addresses, callback) addresses = utils.uniq(addresses); utils.forEachSerial(addresses, function(address, next) { - address = bcoin.address.getHash(address); + address = bcoin.address.getHash(address, 'hex'); if (!address) return next(); @@ -1594,7 +1594,7 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry, callback) { batch.put('m/' + pad32(entry.ts) + '/' + hash, DUMMY); if (this.options.indexAddress) { - addresses = tx.getHashes(); + addresses = tx.getHashes('hex'); for (i = 0; i < addresses.length; i++) batch.put('T/' + addresses[i] + '/' + hash, DUMMY); } @@ -1612,7 +1612,7 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry, callback) { batch.put('s/' + key, tx.hash()); if (this.options.indexAddress) { - address = input.getHash(); + address = input.getHash('hex'); if (address) batch.del('C/' + address + '/' + key); } @@ -1630,7 +1630,7 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry, callback) { batch.put('c/' + key, coin); if (this.options.indexAddress) { - address = output.getHash(); + address = output.getHash('hex'); if (address) batch.put('C/' + address + '/' + key, DUMMY); } @@ -1668,7 +1668,7 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(hash, limit, call batch.del('m/' + pad32(entry.ts) + '/' + hash); if (self.options.indexAddress) { - addresses = tx.getHashes(); + addresses = tx.getHashes('hex'); for (i = 0; i < addresses.length; i++) batch.del('T/' + addresses[i] + '/' + hash); } @@ -1692,14 +1692,14 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(hash, limit, call if (result) { batch.put('c/' + key, input.coin.toRaw()); if (self.options.indexAddress) { - address = input.getHash(); + address = input.getHash('hex'); if (address) batch.put('C/' + address + '/' + key, DUMMY); } } else { batch.del('c/' + key); if (self.options.indexAddress) { - address = input.getHash(); + address = input.getHash('hex'); if (address) batch.del('C/' + address + '/' + key); } @@ -1721,7 +1721,7 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(hash, limit, call batch.del('c/' + key); if (self.options.indexAddress) { - address = output.getHash(); + address = output.getHash('hex'); if (address) batch.del('C/' + address + '/' + key); } diff --git a/lib/bcoin/output.js b/lib/bcoin/output.js index 23b7cf3f..4ff7047d 100644 --- a/lib/bcoin/output.js +++ b/lib/bcoin/output.js @@ -86,14 +86,15 @@ Output.prototype.getAddress = function getAddress() { /** * Get the address hash. + * @param {String?} enc * @returns {Hash} hash */ -Output.prototype.getHash = function getHash() { +Output.prototype.getHash = function getHash(enc) { var address = this.getAddress(); if (!address) return; - return address.getHash('hex'); + return address.getHash(enc); }; /** @@ -104,7 +105,7 @@ Output.prototype.getHash = function getHash() { */ Output.prototype.test = function test(addressMap) { - var hash = this.getHash(); + var hash = this.getHash('hex'); if (!hash) return false; diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index d09ae8bd..cff0d4a9 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -1242,7 +1242,7 @@ Pool.prototype.updateWatch = function updateWatch() { */ Pool.prototype.watchAddress = function watchAddress(address) { - this.watch(bcoin.address.getHash(address), 'hex'); + this.watch(bcoin.address.getHash(address)); }; /** diff --git a/lib/bcoin/tx.js b/lib/bcoin/tx.js index 62209d26..1c40613f 100644 --- a/lib/bcoin/tx.js +++ b/lib/bcoin/tx.js @@ -811,8 +811,17 @@ TX.prototype.getAddresses = function getAddresses() { * @returns {Hash[]} hashes */ -TX.prototype.getInputHashes = function getInputHashes() { - return Object.keys(this.getInputAddresses().table); +TX.prototype.getInputHashes = function getInputHashes(enc) { + var input = this.getInputAddresses(); + var i; + + if (enc === 'hex') + return Object.keys(input.table); + + for (i = 0; i < input.length; i++) + input[i] = input[i].getHash(); + + return input; }; /** @@ -820,8 +829,17 @@ TX.prototype.getInputHashes = function getInputHashes() { * @returns {Hash[]} hashes */ -TX.prototype.getOutputHashes = function getOutputHashes() { - return Object.keys(this.getOutputAddresses().table); +TX.prototype.getOutputHashes = function getOutputHashes(enc) { + var output = this.getOutputAddresses(); + var i; + + if (enc === 'hex') + return Object.keys(output.table); + + for (i = 0; i < output.length; i++) + output[i] = output[i].getHash(); + + return output; }; /** @@ -829,8 +847,17 @@ TX.prototype.getOutputHashes = function getOutputHashes() { * @returns {Hash[]} hashes */ -TX.prototype.getHashes = function getHashes() { - return Object.keys(this.getAddresses().table); +TX.prototype.getHashes = function getHashes(enc) { + var hashes = this.getAddresses(); + var i; + + if (enc === 'hex') + return Object.keys(hashes.table); + + for (i = 0; i < hashes.length; i++) + hashes[i] = hashes[i].getHash(); + + return hashes; }; /** diff --git a/lib/bcoin/txdb.js b/lib/bcoin/txdb.js index 3fef65f2..0267896c 100644 --- a/lib/bcoin/txdb.js +++ b/lib/bcoin/txdb.js @@ -110,8 +110,8 @@ TXDB.prototype._testFilter = function _testFilter(addresses) { TXDB.prototype.getMap = function getMap(tx, callback) { var i, input, output, address, addresses, map; - input = tx.getInputHashes(); - output = tx.getOutputHashes(); + input = tx.getInputHashes('hex'); + output = tx.getOutputHashes('hex'); addresses = utils.uniq(input.concat(output)); if (!this._testFilter(addresses)) @@ -347,7 +347,7 @@ TXDB.prototype._add = function add(tx, map, callback, force) { if (tx.isCoinbase()) return next(); - address = input.getHash(); + address = input.getHash('hex'); // Only add orphans if this input is ours. if (!address || !map.table[address].length) @@ -445,7 +445,7 @@ TXDB.prototype._add = function add(tx, map, callback, force) { // Add unspent outputs or resolve orphans utils.forEachSerial(tx.outputs, function(output, next, i) { - var address = output.getHash(); + var address = output.getHash('hex'); var key = hash + '/' + i; var coin; @@ -747,7 +747,7 @@ TXDB.prototype._confirm = function _confirm(tx, map, callback, force) { } utils.forEachSerial(tx.outputs, function(output, next, i) { - var address = output.getHash(); + var address = output.getHash('hex'); // Only update coins if this output is ours. if (!address || !map.table[address].length) @@ -896,7 +896,7 @@ TXDB.prototype._remove = function remove(tx, map, callback, force) { for (i = 0; i < tx.inputs.length; i++) { input = tx.inputs[i]; key = input.prevout.hash + '/' + input.prevout.index; - address = input.getHash(); + address = input.getHash('hex'); if (tx.isCoinbase()) break; @@ -923,7 +923,7 @@ TXDB.prototype._remove = function remove(tx, map, callback, force) { for (i = 0; i < tx.outputs.length; i++) { output = tx.outputs[i]; key = hash + '/' + i; - address = output.getHash(); + address = output.getHash('hex'); if (!address || !map.table[address].length) continue; diff --git a/lib/bcoin/wallet.js b/lib/bcoin/wallet.js index 16994ebd..5cc6e6d1 100644 --- a/lib/bcoin/wallet.js +++ b/lib/bcoin/wallet.js @@ -729,7 +729,7 @@ Wallet.prototype.getInputPaths = function getInputPaths(tx, callback) { if (tx instanceof bcoin.input) { if (!tx.coin) return callback(new Error('Not all coins available.')); - hashes = [tx.coin.getHash()]; + hashes = [tx.coin.getHash('hex')]; return done(); } @@ -740,7 +740,7 @@ Wallet.prototype.getInputPaths = function getInputPaths(tx, callback) { if (!tx.hasCoins()) return callback(new Error('Not all coins available.')); - hashes = tx.getInputHashes(); + hashes = tx.getInputHashes('hex'); done(); }); }; @@ -757,9 +757,9 @@ Wallet.prototype.getOutputPaths = function getOutputPaths(tx, callback) { var hashes; if (tx instanceof bcoin.output) - hashes = [tx.getHash()]; + hashes = [tx.getHash('hex')]; else - hashes = tx.getOutputHashes(); + hashes = tx.getOutputHashes('hex'); utils.forEachSerial(hashes, function(hash, next, i) { self.getPath(hash, function(err, path) {