diff --git a/lib/bcoin.js b/lib/bcoin.js index 7a3c0158..c5c58f86 100644 --- a/lib/bcoin.js +++ b/lib/bcoin.js @@ -6,10 +6,6 @@ var bcoin = exports; var assert = require('assert'); -var inherits = require('inherits'); -var elliptic = require('elliptic'); -var bn = require('bn.js'); -var hash = require('hash.js'); bcoin.isBrowser = (typeof process !== 'undefined' && process.browser) @@ -21,7 +17,8 @@ if (process.env.BCOIN_DEBUG) { bcoin.debug = +bcoin.debug === 1; } -bcoin.dir = process.env.HOME + '/.bcoin'; +bcoin.bn = require('bn.js'); +bcoin.elliptic = require('elliptic'); if (!bcoin.isBrowser) { bcoin.fs = require('f' + 's'); @@ -34,8 +31,12 @@ if (!bcoin.isBrowser) { utils.debug('Warning secp256k1 not found.' + ' Full block validation will be slow.'); } +} else { + bcoin.hash = require('hash.js'); } +bcoin.dir = process.env.HOME + '/.bcoin'; + if (bcoin.fs) { try { bcoin.fs.statSync(bcoin.dir, 0o750); @@ -44,17 +45,10 @@ if (bcoin.fs) { } } -bcoin.inherits = inherits; -bcoin.elliptic = elliptic; -bcoin.bn = bn; -bcoin.hash = hash; - -bcoin.ecdsa = elliptic.ec('secp256k1'); - +bcoin.ecdsa = bcoin.elliptic.ec('secp256k1'); assert(!bcoin.ecdsa.signature); -assert(!bcoin.ecdsa.keypair); - bcoin.ecdsa.signature = require('elliptic/lib/elliptic/ec/signature'); +assert(!bcoin.ecdsa.keypair); bcoin.ecdsa.keypair = require('elliptic/lib/elliptic/ec/key'); bcoin.utils = require('./bcoin/utils'); diff --git a/lib/bcoin/address.js b/lib/bcoin/address.js index 06652802..d56781ba 100644 --- a/lib/bcoin/address.js +++ b/lib/bcoin/address.js @@ -5,9 +5,7 @@ */ var bcoin = require('../bcoin'); -var hash = require('hash.js'); var bn = require('bn.js'); -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var utils = bcoin.utils; var assert = utils.assert; @@ -68,7 +66,7 @@ function Address(options) { this.setRedeem(options.redeem || options.script); } -inherits(Address, EventEmitter); +utils.inherits(Address, EventEmitter); Address.prototype.__defineGetter__('balance', function() { return this.getBalance(); diff --git a/lib/bcoin/blockdb.js b/lib/bcoin/blockdb.js index ee22765d..aaf9cda2 100644 --- a/lib/bcoin/blockdb.js +++ b/lib/bcoin/blockdb.js @@ -7,8 +7,6 @@ var bcoin = require('../bcoin'); var utils = bcoin.utils; var assert = utils.assert; -var levelup = require('levelup'); -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var network = bcoin.protocol.network; var fs = bcoin.fs; @@ -19,10 +17,14 @@ var fs = bcoin.fs; function BlockDB(options) { var self = this; + var levelup; if (!(this instanceof BlockDB)) return new BlockDB(options); + // Some lazy loading + levelup = require('levelup'); + EventEmitter.call(this); if (!options) @@ -64,7 +66,7 @@ function BlockDB(options) { }); } -inherits(BlockDB, EventEmitter); +utils.inherits(BlockDB, EventEmitter); BlockDB.prototype.close = function close(callback) { var self = this; diff --git a/lib/bcoin/chain.js b/lib/bcoin/chain.js index c29c53ea..d8b7d9b8 100644 --- a/lib/bcoin/chain.js +++ b/lib/bcoin/chain.js @@ -4,9 +4,7 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; -var request = require('request'); var bcoin = require('../bcoin'); var bn = require('bn.js'); @@ -62,7 +60,7 @@ function Chain(options) { this._init(); } -inherits(Chain, EventEmitter); +utils.inherits(Chain, EventEmitter); Chain.prototype._init = function _init() { var self = this; @@ -283,6 +281,7 @@ Chain.prototype._preload = function _preload(callback) { var self = this; var url = 'https://headers.electrum.org/blockchain_headers'; var chainHeight, buf, height, stream; + var request; if (!this.options.preload) return callback(); @@ -290,6 +289,12 @@ Chain.prototype._preload = function _preload(callback) { if (network.type !== 'main') return callback(new Error('Electrum.org only offers `main` headers.')); + try { + request = require('request'); + } catch (e) { + return callback(e); + } + utils.debug('Loading %s', url); stream = request.get(url); diff --git a/lib/bcoin/chainblock.js b/lib/bcoin/chainblock.js index 8595ec87..3d2d11e5 100644 --- a/lib/bcoin/chainblock.js +++ b/lib/bcoin/chainblock.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); diff --git a/lib/bcoin/chaindb.js b/lib/bcoin/chaindb.js index 32b7b3f2..cf2e85b2 100644 --- a/lib/bcoin/chaindb.js +++ b/lib/bcoin/chaindb.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); @@ -59,7 +58,7 @@ function ChainDB(chain, options) { this._init(); } -inherits(ChainDB, EventEmitter); +utils.inherits(ChainDB, EventEmitter); ChainDB.prototype._init = function _init() { var genesis = bcoin.chainblock.fromJSON(this.chain, { diff --git a/lib/bcoin/coin.js b/lib/bcoin/coin.js index 1daddd0e..8cf51726 100644 --- a/lib/bcoin/coin.js +++ b/lib/bcoin/coin.js @@ -6,7 +6,6 @@ var bn = require('bn.js'); var bcoin = require('../bcoin'); -var inherits = require('inherits'); var utils = bcoin.utils; var assert = utils.assert; var constants = bcoin.protocol.constants; @@ -68,7 +67,7 @@ function Coin(tx, index) { assert(typeof this.spent === 'boolean'); } -inherits(Coin, bcoin.output); +utils.inherits(Coin, bcoin.output); Coin.prototype.__defineGetter__('chain', function() { return this._chain || bcoin.chain.global; diff --git a/lib/bcoin/ec.js b/lib/bcoin/ec.js index 605196a6..3f80646f 100644 --- a/lib/bcoin/ec.js +++ b/lib/bcoin/ec.js @@ -45,14 +45,14 @@ ec.verify = function verify(msg, sig, key, historical) { // Note: We only do this for historical data! // https://github.com/indutny/elliptic/issues/78 if (historical) - sig = bcoin.ec.normalizeLength(sig); + sig = ec.normalizeLength(sig); try { if (bcoin.secp256k1) { // secp256k1 fails on low s values. This is // bad for verifying historical data. if (historical) - sig = bcoin.ec.toLowS(sig); + sig = ec.toLowS(sig); msg = new Buffer(msg); sig = new Buffer(sig); diff --git a/lib/bcoin/hd.js b/lib/bcoin/hd.js index 3ab3d096..638bac36 100644 --- a/lib/bcoin/hd.js +++ b/lib/bcoin/hd.js @@ -51,9 +51,7 @@ */ var bcoin = require('../bcoin'); -var hash = require('hash.js'); var bn = require('bn.js'); -var inherits = require('inherits'); var elliptic = require('elliptic'); var utils = bcoin.utils; var assert = utils.assert; @@ -185,7 +183,7 @@ function HDPrivateKey(options) { this.isPublic = false; } -inherits(HDPrivateKey, HD); +utils.inherits(HDPrivateKey, HD); HDPrivateKey.prototype.scan44 = function scan44(options, txByAddress, callback) { var self = this; @@ -952,7 +950,7 @@ function HDPublicKey(options) { this.isPublic = true; } -inherits(HDPublicKey, HD); +utils.inherits(HDPublicKey, HD); HDPublicKey.prototype.scan44 = HDPrivateKey.prototype.scan44; HDPublicKey.prototype.deriveAccount44 = HDPrivateKey.prototype.deriveAccount44; diff --git a/lib/bcoin/mempool.js b/lib/bcoin/mempool.js index c873128f..5a98b35a 100644 --- a/lib/bcoin/mempool.js +++ b/lib/bcoin/mempool.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); @@ -42,7 +41,7 @@ function Mempool(node, options) { this._init(); } -inherits(Mempool, EventEmitter); +utils.inherits(Mempool, EventEmitter); Mempool.prototype._init = function _init() { ; diff --git a/lib/bcoin/miner.js b/lib/bcoin/miner.js index 905fb1a3..c66807b5 100644 --- a/lib/bcoin/miner.js +++ b/lib/bcoin/miner.js @@ -10,7 +10,6 @@ var assert = utils.assert; var constants = bcoin.protocol.constants; var bn = require('bn.js'); -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; /** @@ -48,7 +47,7 @@ function Miner(pool, options) { this._init(); } -inherits(Miner, EventEmitter); +utils.inherits(Miner, EventEmitter); Miner.prototype._init = function _init() { var self = this; diff --git a/lib/bcoin/node.js b/lib/bcoin/node.js index 1c1ea831..427fc1c0 100644 --- a/lib/bcoin/node.js +++ b/lib/bcoin/node.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); var bn = require('bn.js'); @@ -49,7 +48,7 @@ function Node(options) { this._init(); } -inherits(Node, EventEmitter); +utils.inherits(Node, EventEmitter); Node.prototype._init = function _init() { var self = this; diff --git a/lib/bcoin/output.js b/lib/bcoin/output.js index f8cb2fae..218ba644 100644 --- a/lib/bcoin/output.js +++ b/lib/bcoin/output.js @@ -6,7 +6,6 @@ var bn = require('bn.js'); var bcoin = require('../bcoin'); -var inherits = require('inherits'); var utils = bcoin.utils; var assert = utils.assert; var constants = bcoin.protocol.constants; diff --git a/lib/bcoin/peer.js b/lib/bcoin/peer.js index c7f8ce69..bcb557de 100644 --- a/lib/bcoin/peer.js +++ b/lib/bcoin/peer.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); @@ -97,7 +96,7 @@ function Peer(pool, options) { this._init(); } -inherits(Peer, EventEmitter); +utils.inherits(Peer, EventEmitter); Peer.uid = new bn(0); diff --git a/lib/bcoin/pool.js b/lib/bcoin/pool.js index c8543c57..304dbbb3 100644 --- a/lib/bcoin/pool.js +++ b/lib/bcoin/pool.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); @@ -162,7 +161,7 @@ function Pool(options) { }); } -inherits(Pool, EventEmitter); +utils.inherits(Pool, EventEmitter); Pool.prototype._init = function _init() { var self = this; diff --git a/lib/bcoin/protocol/parser.js b/lib/bcoin/protocol/parser.js index 3ea0b292..96687572 100644 --- a/lib/bcoin/protocol/parser.js +++ b/lib/bcoin/protocol/parser.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bn = require('bn.js'); @@ -30,7 +29,7 @@ function Parser() { this.packet = null; } -inherits(Parser, EventEmitter); +utils.inherits(Parser, EventEmitter); Parser.prototype._error = function _error(str) { this.emit('error', new Error(str)); diff --git a/lib/bcoin/spvnode.js b/lib/bcoin/spvnode.js index 98c89170..68b87ab1 100644 --- a/lib/bcoin/spvnode.js +++ b/lib/bcoin/spvnode.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); var bn = require('bn.js'); @@ -46,7 +45,7 @@ function SPVNode(options) { this._init(); } -inherits(SPVNode, EventEmitter); +utils.inherits(SPVNode, EventEmitter); SPVNode.prototype._init = function _init() { var self = this; diff --git a/lib/bcoin/tx-pool.js b/lib/bcoin/tx-pool.js index c16731dd..d9520257 100644 --- a/lib/bcoin/tx-pool.js +++ b/lib/bcoin/tx-pool.js @@ -5,7 +5,6 @@ */ var bn = require('bn.js'); -var inherits = require('inherits'); var bcoin = require('../bcoin'); var utils = bcoin.utils; var assert = bcoin.utils.assert; @@ -38,7 +37,7 @@ function TXPool(wallet, txs) { this._init(txs); } -inherits(TXPool, EventEmitter); +utils.inherits(TXPool, EventEmitter); TXPool.prototype._init = function _init(txs) { var self = this; diff --git a/lib/bcoin/utils.js b/lib/bcoin/utils.js index 4cc7ccb4..e507e1cb 100644 --- a/lib/bcoin/utils.js +++ b/lib/bcoin/utils.js @@ -8,7 +8,6 @@ var utils = exports; var bcoin = require('../bcoin'); var bn = require('bn.js'); -var hash = require('hash.js'); var util = require('util'); /** @@ -153,7 +152,7 @@ utils.ripemd160 = function ripemd160(data, enc) { var result; if (!bcoin.crypto) - return hash.ripemd160().update(data, enc).digest(); + return bcoin.hash.ripemd160().update(data, enc).digest(); if (Array.isArray(data)) data = new Buffer(data); @@ -167,7 +166,7 @@ utils.sha1 = function sha1(data, enc) { var result; if (!bcoin.crypto) - return hash.sha1().update(data, enc).digest(); + return bcoin.hash.sha1().update(data, enc).digest(); if (Array.isArray(data)) data = new Buffer(data); @@ -189,7 +188,7 @@ utils.sha256 = function sha256(data, enc) { var result; if (!bcoin.crypto) - return hash.sha256().update(data, enc).digest(); + return bcoin.hash.sha256().update(data, enc).digest(); if (Array.isArray(data)) data = new Buffer(data); @@ -207,7 +206,7 @@ utils.sha512hmac = function sha512hmac(data, salt) { var hmac, result; if (!bcoin.crypto) { - hmac = hash.hmac(hash.sha512, utils.toArray(salt)); + hmac = bcoin.hash.hmac(hash.sha512, utils.toArray(salt)); return hmac.update(utils.toArray(data)).digest(); } @@ -1511,3 +1510,18 @@ utils.forEach = function forEach(arr, iter, callback) { utils.mb = function mb(size) { return size / 1024 / 1024 | 0; }; + +utils.inherits = function inherits(obj, from) { + if (Object.create) { + obj.prototype = Object.create(from.prototype, { + constructor: { + value: obj, + enumerable: false + } + }); + return; + } + var f = function() {}; + f.prototype = from.prototype; + obj.prototype = new f; +}; diff --git a/lib/bcoin/wallet.js b/lib/bcoin/wallet.js index 698a84c1..b30f141b 100644 --- a/lib/bcoin/wallet.js +++ b/lib/bcoin/wallet.js @@ -5,9 +5,7 @@ */ var bcoin = require('../bcoin'); -var hash = require('hash.js'); var bn = require('bn.js'); -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var utils = bcoin.utils; var assert = utils.assert; @@ -101,7 +99,7 @@ function Wallet(options) { }, this); } -inherits(Wallet, EventEmitter); +utils.inherits(Wallet, EventEmitter); Wallet.prototype._init = function _init() { var self = this; diff --git a/lib/bcoin/walletdb.js b/lib/bcoin/walletdb.js index dbe90118..424625c2 100644 --- a/lib/bcoin/walletdb.js +++ b/lib/bcoin/walletdb.js @@ -4,7 +4,6 @@ * https://github.com/indutny/bcoin */ -var inherits = require('inherits'); var EventEmitter = require('events').EventEmitter; var bcoin = require('../bcoin'); @@ -52,11 +51,13 @@ function WalletDB(options) { this._init(); } -inherits(WalletDB, EventEmitter); +utils.inherits(WalletDB, EventEmitter); WalletDB._db = {}; WalletDB.prototype._init = function _init() { + var levelup; + if (this.type === 'file' && !bcoin.fs) { this.type = 'leveldb'; utils.debug('`fs` module not available. Falling back to leveldb.'); @@ -84,6 +85,8 @@ WalletDB.prototype._init = function _init() { if (this.type === 'leveldb') { if (!WalletDB._db[this.file]) { + // Some lazy loading + levelup = require('levelup'); WalletDB._db[this.file] = new levelup(this.file, { keyEncoding: 'ascii', valueEncoding: 'utf8', diff --git a/package.json b/package.json index a0b11036..74e26378 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,14 @@ "repository": "git://github.com/indutny/bcoin.git", "keywords": [ "bitcoin", + "blockchain", "bcoin", "wallet" ], "author": "Fedor Indutny ", + "contributors": [ + "Christopher Jeffrey (https://github.com/chjj)" + ], "license": "MIT", "bugs": { "url": "https://github.com/indutny/bcoin/issues" @@ -26,16 +30,18 @@ "dependencies": { "bn.js": "4.6.3", "elliptic": "6.0.2", - "hash.js": "1.0.3", - "secp256k1": "3.0.0", - "inherits": "2.0.1", "leveldown": "1.4.4", - "level-js": "2.2.3", - "levelup": "1.3.1", + "levelup": "1.3.1" + }, + "optionalDependencies": { + "secp256k1": "3.0.0", "request": "2.67.0" }, "devDependencies": { + "hash.js": "1.0.3", + "level-js": "2.2.3", "browserify": "13.0.0", + "uglify-js": "2.6.1", "mocha": "1.21.5" } }