major refactor.

This commit is contained in:
Christopher Jeffrey 2016-05-13 09:23:57 -07:00
parent 5193e3533a
commit 5eb3946e38
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
47 changed files with 653 additions and 606 deletions

View File

@ -1,9 +1,11 @@
#!/usr/bin/env node #!/usr/bin/env node
var bcoin = require('../')({ debug: true, debugFile: true }); var bcoin = require('../');
var utils = bcoin.utils; var utils = bcoin.utils;
var assert = utils.assert; var assert = utils.assert;
bcoin.setDefaults({ debug: true, debugFile: true });
process.on('uncaughtException', function(err) { process.on('uncaughtException', function(err) {
bcoin.debug(err ? err.stack + '' : err + ''); bcoin.debug(err ? err.stack + '' : err + '');
process.exit(1); process.exit(1);
@ -27,7 +29,7 @@ node.open(function(err) {
throw err; throw err;
if (node.options.mine) { if (node.options.mine) {
if (bcoin.protocol.network.type !== 'regtest') if (bcoin.network.get().type !== 'regtest')
node.pool.connect(); node.pool.connect();
node.miner.start(); node.miner.start();
return; return;

View File

@ -10,7 +10,9 @@
var Environment = require('./bcoin/env'); var Environment = require('./bcoin/env');
var utils = require('./bcoin/utils'); var utils = require('./bcoin/utils');
var global = utils.global; var global = utils.global;
var env = {};
if (utils.isBrowser)
global.bcoin = exports;
/** /**
* Create a new Environment. Note that this will * Create a new Environment. Note that this will
@ -20,26 +22,5 @@ var env = {};
* @returns {Environment} * @returns {Environment}
*/ */
function BCoin(options) { utils.merge(exports, Environment.prototype);
var network = 'main'; Environment.call(exports);
if (options) {
if (options.network)
network = options.network;
else if (typeof options === 'string')
network = options;
}
if (!env[network])
env[network] = new Environment(options);
return env[network];
}
BCoin.env = Environment;
BCoin.utils = utils;
if (utils.isBrowser)
global.bcoin = BCoin;
module.exports = BCoin;

View File

@ -5,11 +5,9 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = bcoin.utils; var utils = bcoin.utils;
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network;
/** /**
* The class which all block-like objects inherit from. * The class which all block-like objects inherit from.
@ -133,15 +131,6 @@ AbstractBlock.prototype.verifyHeaders = function verifyHeaders(ret) {
return true; return true;
}; };
/**
* Test against the genesis block.
* @returns {Boolean}
*/
AbstractBlock.prototype.isGenesis = function isGenesis() {
return this.hash('hex') === network.genesis.hash;
};
/** /**
* Set the `height` property and the `height` * Set the `height` property and the `height`
* property of all transactions within the block. * property of all transactions within the block.
@ -164,5 +153,4 @@ AbstractBlock.prototype.__defineGetter__('rhash', function() {
return utils.revHex(this.hash('hex')); return utils.revHex(this.hash('hex'));
}); });
return AbstractBlock; module.exports = AbstractBlock;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = bcoin.utils; var utils = bcoin.utils;
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network; var network = bcoin.protocol.network;
@ -230,7 +229,7 @@ Address.prototype.getProgramAddress = function getProgramAddress() {
if (!this._programAddress) { if (!this._programAddress) {
hash = this.getProgramHash(); hash = this.getProgramHash();
address = Address.compileHash(hash, 'scripthash'); address = this.compileHash(hash, 'scripthash');
this._programAddress = address; this._programAddress = address;
} }
@ -299,10 +298,10 @@ Address.prototype.getScriptAddress = function getScriptAddress() {
if (!this._scriptAddress) { if (!this._scriptAddress) {
if (this.witness) { if (this.witness) {
hash = this.getScriptHash256(); hash = this.getScriptHash256();
address = Address.compileHash(hash, 'witnessscripthash', 0); address = this.compileHash(hash, 'witnessscripthash', 0);
} else { } else {
hash = this.getScriptHash160(); hash = this.getScriptHash160();
address = Address.compileHash(hash, 'scripthash'); address = this.compileHash(hash, 'scripthash');
} }
this._scriptAddress = address; this._scriptAddress = address;
} }
@ -336,9 +335,9 @@ Address.prototype.getKeyAddress = function getKeyAddress() {
if (!this._address) { if (!this._address) {
hash = this.getKeyHash(); hash = this.getKeyHash();
if (this.witness) if (this.witness)
address = Address.compileHash(hash, 'witnesspubkeyhash', 0); address = this.compileHash(hash, 'witnesspubkeyhash', 0);
else else
address = Address.compileHash(hash, 'pubkeyhash'); address = this.compileHash(hash, 'pubkeyhash');
this._address = address; this._address = address;
} }
@ -614,7 +613,7 @@ Address.sha256 = function sha256(key) {
* @throws Error on bad hash/prefix. * @throws Error on bad hash/prefix.
*/ */
Address.compileHash = function compileHash(hash, type, version) { Address.compileHash = function compileHash(hash, type, version, network) {
var p, prefix; var p, prefix;
if (!Buffer.isBuffer(hash)) if (!Buffer.isBuffer(hash))
@ -623,6 +622,8 @@ Address.compileHash = function compileHash(hash, type, version) {
if (!type) if (!type)
type = 'pubkeyhash'; type = 'pubkeyhash';
network = bcoin.network.get(network);
prefix = network.address.prefixes[type]; prefix = network.address.prefixes[type];
if (version == null) if (version == null)
@ -658,13 +659,13 @@ Address.compileHash = function compileHash(hash, type, version) {
* @returns {Base58Address} * @returns {Base58Address}
*/ */
Address.compileData = function compileData(data, type, version) { Address.compileData = function compileData(data, type, version, network) {
if (type === 'witnessscripthash') if (type === 'witnessscripthash')
data = Address.sha256(data); data = Address.sha256(data);
else else
data = Address.hash160(data); data = Address.hash160(data);
return Address.compileHash(data, type, version); return Address.compileHash(data, type, version, network);
}; };
/** /**
@ -674,7 +675,7 @@ Address.compileData = function compileData(data, type, version) {
* @throws Parse error * @throws Parse error
*/ */
Address.parse = function parse(address) { Address.parse = function parse(address, network) {
var prefix, type, version, hash; var prefix, type, version, hash;
if (!Buffer.isBuffer(address)) if (!Buffer.isBuffer(address))
@ -683,6 +684,8 @@ Address.parse = function parse(address) {
p = new BufferReader(address, true); p = new BufferReader(address, true);
prefix = p.readU8(); prefix = p.readU8();
network = bcoin.network.get(network);
type = network.address.prefixesByVal[prefix]; type = network.address.prefixesByVal[prefix];
version = network.address.versions[type]; version = network.address.versions[type];
@ -734,6 +737,10 @@ Address.validate = function validate(address, type) {
return true; return true;
}; };
Address.prototype.compileHash = function compileHash(hash, type, version) {
return Address.compileHash(hash, type, version, this.network);
};
/** /**
* Convert an Address to a more json-friendly object. * Convert an Address to a more json-friendly object.
* @param {String?} passphrase - Address passphrase * @param {String?} passphrase - Address passphrase
@ -749,7 +756,7 @@ Address.prototype.toJSON = function toJSON(passphrase) {
return { return {
v: 1, v: 1,
name: 'address', name: 'address',
network: network.type, network: this.network.type,
label: this.label, label: this.label,
change: this.change, change: this.change,
derived: this.derived, derived: this.derived,
@ -778,9 +785,6 @@ Address.fromJSON = function fromJSON(json, passphrase) {
assert.equal(json.v, 1); assert.equal(json.v, 1);
assert.equal(json.name, 'address'); assert.equal(json.name, 'address');
if (json.network)
assert.equal(json.network, network.type);
w = new Address({ w = new Address({
label: json.label, label: json.label,
change: json.change, change: json.change,
@ -798,5 +802,4 @@ Address.fromJSON = function fromJSON(json, passphrase) {
return w; return w;
}; };
return Address; module.exports = Address;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
@ -430,8 +429,8 @@ Block.prototype.getCoinbaseHeight = function getCoinbaseHeight() {
* @returns {BN} reward * @returns {BN} reward
*/ */
Block.prototype.getReward = function getReward() { Block.prototype.getReward = function getReward(network) {
var reward = Block.reward(this.height); var reward = Block.reward(this.height, network);
var i; var i;
for (i = 1; i < this.txs.length; i++) for (i = 1; i < this.txs.length; i++)
@ -457,9 +456,11 @@ Block.prototype.getClaimed = function getClaimed() {
* @returns {BN} * @returns {BN}
*/ */
Block.reward = function reward(height) { Block.reward = function reward(height, network) {
var halvings = height / network.halvingInterval | 0; var halvings, reward;
var reward;
network = bcoin.network.get(network);
halvings = height / network.halvingInterval | 0;
if (height < 0) if (height < 0)
return new bn(0); return new bn(0);
@ -644,5 +645,4 @@ Block.isBlock = function isBlock(obj) {
&& typeof obj.toCompact === 'function'; && typeof obj.toCompact === 'function';
}; };
return Block; module.exports = Block;
};

View File

@ -5,12 +5,10 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var bn = require('bn.js'); var bn = require('bn.js');
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var VerifyError = bcoin.errors.VerifyError; var VerifyError = bcoin.errors.VerifyError;
@ -67,6 +65,7 @@ function Chain(options) {
this.options = options; this.options = options;
this.loaded = false; this.loaded = false;
this.network = bcoin.network.get(options.network);
this.db = new bcoin.chaindb(this, options); this.db = new bcoin.chaindb(this, options);
this.total = 0; this.total = 0;
this.adding = false; this.adding = false;
@ -103,7 +102,7 @@ Chain.prototype._init = function _init() {
// Hook into events for debugging // Hook into events for debugging
this.on('block', function(block, entry) { this.on('block', function(block, entry) {
if (self.height < network.block.slowHeight) if (self.height < self.network.block.slowHeight)
return; return;
bcoin.debug('Block %s (%d) added to chain.', bcoin.debug('Block %s (%d) added to chain.',
@ -212,7 +211,7 @@ Chain.prototype._init = function _init() {
if (tip.height > self.bestHeight) { if (tip.height > self.bestHeight) {
self.bestHeight = tip.height; self.bestHeight = tip.height;
network.height = tip.height; self.network.updateHeight(tip.height);
} }
bcoin.profiler.snapshot(); bcoin.profiler.snapshot();
@ -293,7 +292,7 @@ Chain.prototype._preload = function _preload(callback) {
if (!this.options.spv) if (!this.options.spv)
return callback(); return callback();
if (network.type !== 'main') if (this.network.type !== 'main')
return callback(); return callback();
bcoin.debug('Loading %s', url); bcoin.debug('Loading %s', url);
@ -382,7 +381,7 @@ Chain.prototype._preload = function _preload(callback) {
data.height = height; data.height = height;
// Make sure the genesis block is correct. // Make sure the genesis block is correct.
if (data.height === 0 && data.hash !== network.genesis.hash) { if (data.height === 0 && data.hash !== self.network.genesis.hash) {
stream.destroy(); stream.destroy();
return callback(new Error('Bad genesis block.')); return callback(new Error('Bad genesis block.'));
} }
@ -456,6 +455,10 @@ Chain.prototype._verifyContext = function _verifyContext(block, prev, callback)
}); });
}; };
Chain.prototype.isGenesis = function isGenesis(block) {
return block.hash('hex') === this.network.genesis.hash;
};
/** /**
* Contextual verification for a block, including * Contextual verification for a block, including
* version deployments (IsSuperMajority), versionbits, * version deployments (IsSuperMajority), versionbits,
@ -476,7 +479,7 @@ Chain.prototype._verify = function _verify(block, prev, callback) {
return callback(new VerifyError(block, 'invalid', ret.reason, ret.score)); return callback(new VerifyError(block, 'invalid', ret.reason, ret.score));
// Skip the genesis block. Skip all blocks in spv mode. // Skip the genesis block. Skip all blocks in spv mode.
if (this.options.spv || block.isGenesis()) { if (this.options.spv || this.isGenesis(block)) {
return callback(null, { return callback(null, {
flags: constants.flags.MANDATORY_VERIFY_FLAGS, flags: constants.flags.MANDATORY_VERIFY_FLAGS,
lockFlags: constants.flags.MANDATORY_LOCKTIME_FLAGS, lockFlags: constants.flags.MANDATORY_LOCKTIME_FLAGS,
@ -649,7 +652,7 @@ Chain.prototype._checkDeployments = function _checkDeployments(block, prev, ance
// Only allow version 5 blocks (bip141 - segnet3) // Only allow version 5 blocks (bip141 - segnet3)
// once the majority of blocks are using it. // once the majority of blocks are using it.
if (network.segwitHeight !== -1 && height >= network.segwitHeight) { if (this.network.segwitHeight !== -1 && height >= this.network.segwitHeight) {
if (block.version < 5 && prev.isOutdated(5, ancestors)) if (block.version < 5 && prev.isOutdated(5, ancestors))
return callback(new VerifyError(block, 'obsolete', 'bad-version', 0)); return callback(new VerifyError(block, 'obsolete', 'bad-version', 0));
} }
@ -667,7 +670,7 @@ Chain.prototype._checkDeployments = function _checkDeployments(block, prev, ance
state.flags |= constants.flags.VERIFY_CHECKLOCKTIMEVERIFY; state.flags |= constants.flags.VERIFY_CHECKLOCKTIMEVERIFY;
// Segregrated witness is now usable (bip141 - segnet3) // Segregrated witness is now usable (bip141 - segnet3)
if (network.segwitHeight !== -1 && height >= network.segwitHeight) { if (this.network.segwitHeight !== -1 && height >= this.network.segwitHeight) {
if (block.version >= 5 && prev.isUpgraded(5, ancestors)) { if (block.version >= 5 && prev.isUpgraded(5, ancestors)) {
state.flags |= constants.flags.VERIFY_WITNESS; state.flags |= constants.flags.VERIFY_WITNESS;
state.segwit = true; state.segwit = true;
@ -732,20 +735,20 @@ Chain.prototype._checkDuplicates = function _checkDuplicates(block, prev, callba
if (this.options.spv) if (this.options.spv)
return callback(); return callback();
if (block.isGenesis()) if (this.isGenesis(block))
return callback(); return callback();
if (network.block.bip34height === -1 || height <= network.block.bip34height) if (this.network.block.bip34height === -1 || height <= this.network.block.bip34height)
return this._findDuplicates(block, prev, callback); return this._findDuplicates(block, prev, callback);
this.db.get(network.block.bip34height, function(err, entry) { this.db.get(this.network.block.bip34height, function(err, entry) {
if (err) if (err)
return callback(err); return callback(err);
// It was no longer possible to create duplicate // It was no longer possible to create duplicate
// TXs once bip34 went into effect. We can check // TXs once bip34 went into effect. We can check
// for this to avoid a DB lookup. // for this to avoid a DB lookup.
if (entry && entry.hash === network.block.bip34hash) if (entry && entry.hash === self.network.block.bip34hash)
return callback(); return callback();
return self._findDuplicates(block, prev, callback); return self._findDuplicates(block, prev, callback);
@ -818,12 +821,12 @@ Chain.prototype._checkInputs = function _checkInputs(block, prev, state, callbac
if (this.options.spv) if (this.options.spv)
return callback(); return callback();
if (block.isGenesis()) if (this.isGenesis(block))
return callback(); return callback();
// If we are an ancestor of a checkpoint, we can // If we are an ancestor of a checkpoint, we can
// skip the input verification. // skip the input verification.
if (height <= network.checkpoints.lastHeight) { if (height <= this.network.checkpoints.lastHeight) {
if (this.options.useCheckpoints) if (this.options.useCheckpoints)
scriptCheck = false; scriptCheck = false;
historical = true; historical = true;
@ -906,7 +909,7 @@ Chain.prototype._checkInputs = function _checkInputs(block, prev, state, callbac
} }
// Make sure the miner isn't trying to conjure more coins. // Make sure the miner isn't trying to conjure more coins.
if (block.getClaimed().cmp(block.getReward()) > 0) { if (block.getClaimed().cmp(block.getReward(self.network)) > 0) {
return callback(new VerifyError(block, return callback(new VerifyError(block,
'invalid', 'invalid',
'bad-cb-amount', 'bad-cb-amount',
@ -1096,7 +1099,7 @@ Chain.prototype.disconnect = function disconnect(entry, callback) {
self.height = entry.height; self.height = entry.height;
self.bestHeight = entry.height; self.bestHeight = entry.height;
network.height = entry.height; self.network.updateHeight(entry.height);
self.emit('tip', entry); self.emit('tip', entry);
@ -1151,7 +1154,7 @@ Chain.prototype.connect = function connect(entry, callback) {
self.height = entry.height; self.height = entry.height;
self.bestHeight = entry.height; self.bestHeight = entry.height;
network.height = entry.height; self.network.updateHeight(entry.height);
self.emit('tip', entry); self.emit('tip', entry);
@ -1220,7 +1223,7 @@ Chain.prototype._setBestChain = function _setBestChain(entry, block, prev, callb
// We don't have a genesis block yet. // We don't have a genesis block yet.
if (!this.tip) { if (!this.tip) {
if (entry.hash !== network.genesis.hash) { if (entry.hash !== this.network.genesis.hash) {
return utils.asyncify(callback)(new VerifyError(block, return utils.asyncify(callback)(new VerifyError(block,
'invalid', 'invalid',
'bad-genblk', 'bad-genblk',
@ -1405,7 +1408,7 @@ Chain.prototype.add = function add(block, callback, force) {
} }
// Special case for genesis block. // Special case for genesis block.
if (block.isGenesis()) if (self.isGenesis(block))
return done(); return done();
// Validate the block we want to add. // Validate the block we want to add.
@ -1445,7 +1448,7 @@ Chain.prototype.add = function add(block, callback, force) {
if (height > self.bestHeight) { if (height > self.bestHeight) {
self.bestHeight = height; self.bestHeight = height;
network.height = height; self.network.height = height;
} }
// If previous block wasn't ever seen, // If previous block wasn't ever seen,
@ -1462,7 +1465,7 @@ Chain.prototype.add = function add(block, callback, force) {
// getblocks sync, making it an orphan). // getblocks sync, making it an orphan).
if (block.getCoinbaseHeight() > self.bestHeight) { if (block.getCoinbaseHeight() > self.bestHeight) {
self.bestHeight = block.getCoinbaseHeight(); self.bestHeight = block.getCoinbaseHeight();
network.height = self.bestHeight; self.network.height = self.bestHeight;
} }
self.emit('orphan', block, { self.emit('orphan', block, {
@ -1475,7 +1478,7 @@ Chain.prototype.add = function add(block, callback, force) {
} }
// Verify the checkpoint. // Verify the checkpoint.
checkpoint = network.checkpoints[height]; checkpoint = self.network.checkpoints[height];
if (checkpoint) { if (checkpoint) {
self.emit('checkpoint', block, { self.emit('checkpoint', block, {
height: height, height: height,
@ -1520,6 +1523,7 @@ Chain.prototype.add = function add(block, callback, force) {
try { try {
block = block.toBlock(); block = block.toBlock();
} catch (e) { } catch (e) {
utils.print(e.stack + '');
return done(new VerifyError(block, return done(new VerifyError(block,
'malformed', 'malformed',
'error parsing message', 'error parsing message',
@ -1837,11 +1841,11 @@ Chain.prototype.isInitial = function isInitial() {
if (this.synced) if (this.synced)
return false; return false;
if (this.height < network.checkpoints.lastHeight) if (this.height < this.network.checkpoints.lastHeight)
return true; return true;
return this.height < this.bestHeight - 24 * 6 return this.height < this.bestHeight - 24 * 6
|| this.tip.ts < utils.now() - network.block.maxTipAge; || this.tip.ts < utils.now() - this.network.block.maxTipAge;
}; };
/** /**
@ -1855,7 +1859,7 @@ Chain.prototype.getProgress = function getProgress() {
if (!this.tip) if (!this.tip)
return 0; return 0;
start = network.genesis.ts; start = this.network.genesis.ts;
current = this.tip.ts - start; current = this.tip.ts - start;
end = utils.now() - start - 40 * 60; end = utils.now() - start - 40 * 60;
@ -1922,7 +1926,7 @@ Chain.prototype.getLocator = function getLocator(start, callback, force) {
step *= 2; step *= 2;
if (height === 0) if (height === 0)
return next(null, { hash: network.genesis.hash, height: 0 }); return next(null, { hash: self.network.genesis.hash, height: 0 });
if (!main) if (!main)
return entry.getAncestorByHeight(height, next); return entry.getAncestorByHeight(height, next);
@ -1976,7 +1980,7 @@ Chain.prototype.getOrphanRoot = function getOrphanRoot(hash) {
Chain.prototype.getCurrentTarget = function getCurrentTarget(callback) { Chain.prototype.getCurrentTarget = function getCurrentTarget(callback) {
if (!this.tip) if (!this.tip)
return callback(null, utils.toCompact(network.pow.limit)); return callback(null, utils.toCompact(this.network.pow.limit));
return this.getTargetAsync(null, this.tip, callback); return this.getTargetAsync(null, this.tip, callback);
}; };
@ -1991,12 +1995,12 @@ Chain.prototype.getCurrentTarget = function getCurrentTarget(callback) {
Chain.prototype.getTargetAsync = function getTargetAsync(block, prev, callback) { Chain.prototype.getTargetAsync = function getTargetAsync(block, prev, callback) {
var self = this; var self = this;
if ((prev.height + 1) % network.pow.retargetInterval !== 0) { if ((prev.height + 1) % this.network.pow.retargetInterval !== 0) {
if (!network.pow.allowMinDifficultyBlocks) if (!this.network.pow.allowMinDifficultyBlocks)
return utils.asyncify(callback)(null, this.getTarget(block, prev)); return utils.asyncify(callback)(null, this.getTarget(block, prev));
} }
return prev.getAncestors(network.pow.retargetInterval, function(err, ancestors) { return prev.getAncestors(this.network.pow.retargetInterval, function(err, ancestors) {
if (err) if (err)
return callback(err); return callback(err);
@ -2014,7 +2018,7 @@ Chain.prototype.getTargetAsync = function getTargetAsync(block, prev, callback)
*/ */
Chain.prototype.getTarget = function getTarget(block, prev, ancestors) { Chain.prototype.getTarget = function getTarget(block, prev, ancestors) {
var powLimit = utils.toCompact(network.pow.limit); var powLimit = utils.toCompact(this.network.pow.limit);
var ts, first, i; var ts, first, i;
// Genesis // Genesis
@ -2022,16 +2026,16 @@ Chain.prototype.getTarget = function getTarget(block, prev, ancestors) {
return powLimit; return powLimit;
// Do not retarget // Do not retarget
if ((prev.height + 1) % network.pow.retargetInterval !== 0) { if ((prev.height + 1) % this.network.pow.retargetInterval !== 0) {
if (network.pow.allowMinDifficultyBlocks) { if (this.network.pow.allowMinDifficultyBlocks) {
// Special behavior for testnet: // Special behavior for testnet:
ts = block ? (block.ts || block) : bcoin.now(); ts = block ? (block.ts || block) : bcoin.now();
if (ts > prev.ts + network.pow.targetSpacing * 2) if (ts > prev.ts + this.network.pow.targetSpacing * 2)
return powLimit; return powLimit;
i = 1; i = 1;
while (ancestors[i] while (ancestors[i]
&& prev.height % network.pow.retargetInterval !== 0 && prev.height % this.network.pow.retargetInterval !== 0
&& prev.bits === powLimit) { && prev.bits === powLimit) {
prev = ancestors[i++]; prev = ancestors[i++];
} }
@ -2040,7 +2044,7 @@ Chain.prototype.getTarget = function getTarget(block, prev, ancestors) {
} }
// Back 2 weeks // Back 2 weeks
first = ancestors[network.pow.retargetInterval - 1]; first = ancestors[this.network.pow.retargetInterval - 1];
assert(first); assert(first);
@ -2056,10 +2060,10 @@ Chain.prototype.getTarget = function getTarget(block, prev, ancestors) {
*/ */
Chain.prototype.retarget = function retarget(prev, first) { Chain.prototype.retarget = function retarget(prev, first) {
var powTargetTimespan = new bn(network.pow.targetTimespan); var powTargetTimespan = new bn(this.network.pow.targetTimespan);
var actualTimespan, target; var actualTimespan, target;
if (network.pow.noRetargeting) if (this.network.pow.noRetargeting)
return prev.bits; return prev.bits;
actualTimespan = new bn(prev.ts - first.ts); actualTimespan = new bn(prev.ts - first.ts);
@ -2074,8 +2078,8 @@ Chain.prototype.retarget = function retarget(prev, first) {
target.imul(actualTimespan); target.imul(actualTimespan);
target = target.div(powTargetTimespan); target = target.div(powTargetTimespan);
if (target.cmp(network.pow.limit) > 0) if (target.cmp(this.network.pow.limit) > 0)
target = network.pow.limit.clone(); target = this.network.pow.limit.clone();
return utils.toCompact(target); return utils.toCompact(target);
}; };
@ -2118,7 +2122,7 @@ Chain.prototype.findLocator = function findLocator(locator, callback) {
Chain.prototype.isActive = function isActive(prev, id, callback) { Chain.prototype.isActive = function isActive(prev, id, callback) {
// Optimization for main // Optimization for main
if (network.type === 'main' && prev.height < 400000) if (this.network.type === 'main' && prev.height < 400000)
return callback(null, false); return callback(null, false);
this.getState(prev, id, function(err, state) { this.getState(prev, id, function(err, state) {
@ -2141,9 +2145,9 @@ Chain.prototype.isActive = function isActive(prev, id, callback) {
Chain.prototype.getState = function getState(prev, id, callback) { Chain.prototype.getState = function getState(prev, id, callback) {
var self = this; var self = this;
var period = network.minerConfirmationWindow; var period = this.network.minerConfirmationWindow;
var threshold = network.ruleChangeActivationThreshold; var threshold = this.network.ruleChangeActivationThreshold;
var deployment = network.deployments[id]; var deployment = this.network.deployments[id];
var timeStart, timeTimeout, compute, height; var timeStart, timeTimeout, compute, height;
if (!deployment) if (!deployment)
@ -2294,8 +2298,8 @@ Chain.prototype.computeBlockVersion = function computeBlockVersion(prev, callbac
var self = this; var self = this;
var version = 0; var version = 0;
utils.forEachSerial(Object.keys(network.deployments), function(id, next) { utils.forEachSerial(Object.keys(this.network.deployments), function(id, next) {
var deployment = network.deployments[id]; var deployment = self.network.deployments[id];
self.getState(prev, id, function(err, state) { self.getState(prev, id, function(err, state) {
if (err) if (err)
return next(err); return next(err);
@ -2499,5 +2503,4 @@ Chain.prototype.checkLocks = function checkLocks(prev, tx, flags, callback) {
}); });
}; };
return Chain; module.exports = Chain;
};

View File

@ -5,11 +5,9 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var BufferWriter = require('./writer'); var BufferWriter = require('./writer');
@ -45,6 +43,7 @@ function ChainBlock(chain, data, prev) {
return new ChainBlock(chain, data); return new ChainBlock(chain, data);
this.chain = chain; this.chain = chain;
this.network = this.chain.network;
this.hash = data.hash; this.hash = data.hash;
this.version = data.version; this.version = data.version;
@ -85,7 +84,7 @@ ChainBlock.prototype.getChainwork = function getChainwork(prev) {
*/ */
ChainBlock.prototype.isGenesis = function isGenesis() { ChainBlock.prototype.isGenesis = function isGenesis() {
return this.hash === network.genesis.hash; return this.hash === this.network.genesis.hash;
}; };
/** /**
@ -97,10 +96,10 @@ ChainBlock.prototype.isGenesis = function isGenesis() {
*/ */
ChainBlock.prototype.getRetargetAncestors = function getRetargetAncestors(callback) { ChainBlock.prototype.getRetargetAncestors = function getRetargetAncestors(callback) {
var majorityWindow = network.block.majorityWindow; var majorityWindow = this.network.block.majorityWindow;
var medianTimespan = constants.block.MEDIAN_TIMESPAN; var medianTimespan = constants.block.MEDIAN_TIMESPAN;
var powDiffInterval = network.pow.retargetInterval; var powDiffInterval = this.network.pow.retargetInterval;
var allowMinDiff = network.pow.allowMinDifficultyBlocks; var allowMinDiff = this.network.pow.allowMinDifficultyBlocks;
var max = Math.max(majorityWindow, medianTimespan); var max = Math.max(majorityWindow, medianTimespan);
if ((this.height + 1) % powDiffInterval === 0 || allowMinDiff) if ((this.height + 1) % powDiffInterval === 0 || allowMinDiff)
max = Math.max(max, powDiffInterval); max = Math.max(max, powDiffInterval);
@ -292,7 +291,7 @@ ChainBlock.prototype.getMedianTimeAsync = function getMedianTimeAsync(callback)
*/ */
ChainBlock.prototype.isOutdated = function isOutdated(version, ancestors) { ChainBlock.prototype.isOutdated = function isOutdated(version, ancestors) {
return this.isSuperMajority(version, network.block.majorityRejectOutdated, ancestors); return this.isSuperMajority(version, this.network.block.majorityRejectOutdated, ancestors);
}; };
/** /**
@ -305,7 +304,7 @@ ChainBlock.prototype.isOutdated = function isOutdated(version, ancestors) {
ChainBlock.prototype.isOutdatedAsync = function isOutdatedAsync(version, callback) { ChainBlock.prototype.isOutdatedAsync = function isOutdatedAsync(version, callback) {
return this.isSuperMajorityAsync( return this.isSuperMajorityAsync(
version, version,
network.block.majorityRejectOutdated, this.network.block.majorityRejectOutdated,
callback); callback);
}; };
@ -317,7 +316,7 @@ ChainBlock.prototype.isOutdatedAsync = function isOutdatedAsync(version, callbac
*/ */
ChainBlock.prototype.isUpgraded = function isUpgraded(version, ancestors) { ChainBlock.prototype.isUpgraded = function isUpgraded(version, ancestors) {
return this.isSuperMajority(version, network.block.majorityEnforceUpgrade, ancestors); return this.isSuperMajority(version, this.network.block.majorityEnforceUpgrade, ancestors);
}; };
/** /**
@ -330,7 +329,7 @@ ChainBlock.prototype.isUpgraded = function isUpgraded(version, ancestors) {
ChainBlock.prototype.isUpgradedAsync = function isUpgradedAsync(version, callback) { ChainBlock.prototype.isUpgradedAsync = function isUpgradedAsync(version, callback) {
return this.isSuperMajorityAsync( return this.isSuperMajorityAsync(
version, version,
network.block.majorityEnforceUpgrade, this.network.block.majorityEnforceUpgrade,
callback); callback);
}; };
@ -345,7 +344,7 @@ ChainBlock.prototype.isUpgradedAsync = function isUpgradedAsync(version, callbac
ChainBlock.prototype.isSuperMajority = function isSuperMajority(version, required, ancestors) { ChainBlock.prototype.isSuperMajority = function isSuperMajority(version, required, ancestors) {
var entry = this; var entry = this;
var found = 0; var found = 0;
var majorityWindow = network.block.majorityWindow; var majorityWindow = this.network.block.majorityWindow;
var i; var i;
for (i = 0; i < majorityWindow && found < required && entry; i++) { for (i = 0; i < majorityWindow && found < required && entry; i++) {
@ -368,7 +367,7 @@ ChainBlock.prototype.isSuperMajority = function isSuperMajority(version, require
ChainBlock.prototype.isSuperMajorityAsync = function isSuperMajorityAsync(version, required, callback) { ChainBlock.prototype.isSuperMajorityAsync = function isSuperMajorityAsync(version, required, callback) {
var self = this; var self = this;
return this.getAncestors(network.block.majorityWindow, function(err, ancestors) { return this.getAncestors(this.network.block.majorityWindow, function(err, ancestors) {
if (err) if (err)
return callback(err); return callback(err);
@ -485,5 +484,4 @@ ChainBlock.isChainBlock = function isChainBlock(obj) {
&& typeof obj.getMedianTime === 'function'; && typeof obj.getMedianTime === 'function';
}; };
return ChainBlock; module.exports = ChainBlock;
};

View File

@ -5,8 +5,6 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) {
/* /*
* Database Layout: * Database Layout:
* R -> tip hash * R -> tip hash
@ -22,8 +20,8 @@ module.exports = function(bcoin) {
* C/[address]/[hash] -> dummy (coin by address) * C/[address]/[hash] -> dummy (coin by address)
*/ */
var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var network = bcoin.protocol.network;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
@ -71,6 +69,7 @@ function ChainDB(chain, options) {
this.options = options; this.options = options;
this.chain = chain; this.chain = chain;
this.network = this.chain.network;
this.keepBlocks = options.keepBlocks || 288; this.keepBlocks = options.keepBlocks || 288;
this.prune = !!options.prune; this.prune = !!options.prune;
@ -83,7 +82,7 @@ function ChainDB(chain, options) {
// We add a padding of 100 for forked chains, // We add a padding of 100 for forked chains,
// reorgs, chain locator creation and the bip34 // reorgs, chain locator creation and the bip34
// check. // check.
this.cacheWindow = (network.pow.retargetInterval + 1) * 2 + 100; this.cacheWindow = (this.network.pow.retargetInterval + 1) * 2 + 100;
this.coinCache = new NullCache(100000); this.coinCache = new NullCache(100000);
this.cacheHash = new bcoin.lru(this.cacheWindow); this.cacheHash = new bcoin.lru(this.cacheWindow);
@ -102,6 +101,7 @@ ChainDB.prototype._init = function _init() {
return; return;
this.db = bcoin.ldb({ this.db = bcoin.ldb({
network: this.network,
name: this.options.name || (this.options.spv ? 'spvchain' : 'chain'), name: this.options.name || (this.options.spv ? 'spvchain' : 'chain'),
location: this.options.location, location: this.options.location,
db: this.options.db, db: this.options.db,
@ -126,7 +126,7 @@ ChainDB.prototype._init = function _init() {
self.emit('open'); self.emit('open');
} }
self.db.has('h/' + network.genesis.hash, function(err, exists) { self.db.has('h/' + self.network.genesis.hash, function(err, exists) {
if (err) if (err)
return self.emit('error', err); return self.emit('error', err);
@ -134,18 +134,18 @@ ChainDB.prototype._init = function _init() {
return finish(); return finish();
genesis = new bcoin.chainblock(self.chain, { genesis = new bcoin.chainblock(self.chain, {
hash: network.genesis.hash, hash: self.network.genesis.hash,
version: network.genesis.version, version: self.network.genesis.version,
prevBlock: network.genesis.prevBlock, prevBlock: self.network.genesis.prevBlock,
merkleRoot: network.genesis.merkleRoot, merkleRoot: self.network.genesis.merkleRoot,
ts: network.genesis.ts, ts: self.network.genesis.ts,
bits: network.genesis.bits, bits: self.network.genesis.bits,
nonce: network.genesis.nonce, nonce: self.network.genesis.nonce,
height: 0, height: 0,
chainwork: null chainwork: null
}, null); }, null);
block = bcoin.block.fromRaw(network.genesisBlock, 'hex'); block = bcoin.block.fromRaw(self.network.genesisBlock, 'hex');
block.setHeight(0); block.setHeight(0);
self.save(genesis, block, true, finish); self.save(genesis, block, true, finish);
@ -616,7 +616,7 @@ ChainDB.prototype.isMainChain = function isMainChain(hash, callback) {
query = hash; query = hash;
} }
if (hash === this.chain.tip.hash || hash === network.genesis.hash) if (hash === this.chain.tip.hash || hash === this.network.genesis.hash)
return utils.asyncify(callback)(null, true); return utils.asyncify(callback)(null, true);
return this.getHeight(query, function(err, height) { return this.getHeight(query, function(err, height) {
@ -784,7 +784,7 @@ ChainDB.prototype.connectBlock = function connectBlock(block, batch, callback) {
} }
// Genesis block's coinbase is unspendable. // Genesis block's coinbase is unspendable.
if (block.hash('hex') === network.genesis.hash) if (this.chain.isGenesis(block))
return utils.nextTick(callback); return utils.nextTick(callback);
this._ensureBlock(block, function(err, block) { this._ensureBlock(block, function(err, block) {
@ -801,7 +801,7 @@ ChainDB.prototype.connectBlock = function connectBlock(block, batch, callback) {
if (self.options.indexTX) { if (self.options.indexTX) {
batch.put('t/' + hash, tx.toExtended()); batch.put('t/' + hash, tx.toExtended());
if (self.options.indexAddress) { if (self.options.indexAddress) {
addresses = tx.getAddresses(); addresses = tx.getAddresses(self.network);
for (j = 0; j < addresses.length; j++) { for (j = 0; j < addresses.length; j++) {
address = addresses[j]; address = addresses[j];
batch.put('T/' + address + '/' + hash, DUMMY); batch.put('T/' + address + '/' + hash, DUMMY);
@ -819,7 +819,7 @@ ChainDB.prototype.connectBlock = function connectBlock(block, batch, callback) {
assert(input.coin); assert(input.coin);
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = input.getAddress(); address = input.getAddress(self.network);
if (address) if (address)
batch.del('C/' + address + '/' + key); batch.del('C/' + address + '/' + key);
} }
@ -841,7 +841,7 @@ ChainDB.prototype.connectBlock = function connectBlock(block, batch, callback) {
coin = bcoin.coin(tx, j); coin = bcoin.coin(tx, j);
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = output.getAddress(); address = output.getAddress(self.network);
if (address) if (address)
batch.put('C/' + address + '/' + key, DUMMY); batch.put('C/' + address + '/' + key, DUMMY);
} }
@ -893,7 +893,7 @@ ChainDB.prototype.disconnectBlock = function disconnectBlock(block, batch, callb
if (self.options.indexTX) { if (self.options.indexTX) {
batch.del('t/' + hash); batch.del('t/' + hash);
if (self.options.indexAddress) { if (self.options.indexAddress) {
addresses = tx.getAddresses(); addresses = tx.getAddresses(self.network);
for (j = 0; j < addresses.length; j++) { for (j = 0; j < addresses.length; j++) {
address = addresses[j]; address = addresses[j];
batch.del('T/' + address + '/' + hash); batch.del('T/' + address + '/' + hash);
@ -911,7 +911,7 @@ ChainDB.prototype.disconnectBlock = function disconnectBlock(block, batch, callb
assert(input.coin); assert(input.coin);
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = input.getAddress(); address = input.getAddress(self.network);
if (address) if (address)
batch.put('C/' + address + '/' + key, DUMMY); batch.put('C/' + address + '/' + key, DUMMY);
} }
@ -929,7 +929,7 @@ ChainDB.prototype.disconnectBlock = function disconnectBlock(block, batch, callb
continue; continue;
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = output.getAddress(); address = output.getAddress(self.network);
if (address) if (address)
batch.del('C/' + address + '/' + key); batch.del('C/' + address + '/' + key);
} }
@ -1431,7 +1431,7 @@ ChainDB.prototype._pruneBlock = function _pruneBlock(block, batch, callback) {
if (!this.prune) if (!this.prune)
return callback(); return callback();
if (block.height <= network.block.pruneAfterHeight) if (block.height <= this.network.block.pruneAfterHeight)
return callback(); return callback();
futureHeight = pad32(block.height + this.keepBlocks); futureHeight = pad32(block.height + this.keepBlocks);
@ -1466,5 +1466,4 @@ NullCache.prototype.get = function get(key) {};
NullCache.prototype.has = function has(key) {}; NullCache.prototype.has = function has(key) {};
NullCache.prototype.reset = function reset() {}; NullCache.prototype.reset = function reset() {};
return ChainDB; module.exports = ChainDB;
};

View File

@ -5,12 +5,10 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network;
/** /**
* Represents an unspent output. * Represents an unspent output.
@ -84,7 +82,7 @@ utils.inherits(Coin, bcoin.output);
Coin.prototype.getConfirmations = function getConfirmations(height) { Coin.prototype.getConfirmations = function getConfirmations(height) {
if (height == null) if (height == null)
height = network.height; height = bcoin.network.get().height;
if (this.height === -1) if (this.height === -1)
return 0; return 0;
@ -284,5 +282,4 @@ Coin.isCoin = function isCoin(obj) {
&& typeof obj.getConfirmations === 'function'; && typeof obj.getConfirmations === 'function';
}; };
return Coin; module.exports = Coin;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = bcoin.utils; var utils = bcoin.utils;
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
@ -274,5 +273,4 @@ Coins.fromRaw = function fromRaw(buf, hash) {
return new Coins(Coins.parseRaw(buf), hash); return new Coins(Coins.parseRaw(buf), hash);
}; };
return Coins; module.exports = Coins;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = bcoin.utils; var utils = bcoin.utils;
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
@ -162,5 +161,4 @@ CoinView.prototype.toArray = function toArray() {
return out; return out;
}; };
return CoinView; module.exports = CoinView;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
@ -117,5 +116,4 @@ CompactBlock.isCompactBlock = function isCompactBlock(obj) {
return obj && typeof obj.toBlock === 'function'; return obj && typeof obj.toBlock === 'function';
}; };
return CompactBlock; module.exports = CompactBlock;
};

View File

@ -109,8 +109,8 @@ try {
*/ */
function Environment(options) { function Environment(options) {
if (!(this instanceof Environment)) // if (!(this instanceof Environment))
return new Environment(options); // return new Environment(options);
if (!options) if (!options)
options = {}; options = {};
@ -125,49 +125,6 @@ function Environment(options) {
this.isBrowser = utils.isBrowser; this.isBrowser = utils.isBrowser;
this.prefix = options.prefix
|| process.env.BCOIN_PREFIX
|| process.env.HOME + '/.bcoin';
this.networkType = options.network
|| process.env.BCOIN_NETWORK
|| 'main';
this.db = options.db || process.env.BCOIN_DB;
this.debugLogs = options.debug;
this.debugFile = options.debugFile;
this.profile = options.profile;
this.useWorkers = options.useWorkers;
this.maxWorkers = options.maxWorkers;
this.workerTimeout = options.workerTimeout;
if (this.debugLogs == null && process.env.BCOIN_DEBUG != null)
this.debugLogs = +process.env.BCOIN_DEBUG === 1;
if (this.debugFile == null && process.env.BCOIN_DEBUGFILE != null) {
if (process.env.BCOIN_DEBUGFILE === '0'
|| process.env.BCOIN_DEBUGFILE === '1') {
this.debugFile = +process.env.BCOIN_DEBUGFILE !== 0;
} else {
this.debugFile = process.env.BCOIN_DEBUGFILE;
}
}
if (this.debugFile && typeof this.debugFile !== 'string')
this.debugFile = this.prefix + '/debug.log'
if (this.profile == null && process.env.BCOIN_PROFILE != null)
this.profile = +process.env.BCOIN_PROFILE === 1;
if (this.useWorkers == null && process.env.BCOIN_USE_WORKERS != null)
this.useWorkers = +process.env.BCOIN_USE_WORKERS === 1;
if (this.maxWorkers == null && process.env.BCOIN_MAX_WORKERS != null)
this.maxWorkers = +process.env.BCOIN_MAX_WORKERS;
if (this.workerTime == null && process.env.BCOIN_WORKER_TIMEOUT != null)
this.workerTimeout = +process.env.BCOIN_WORKER_TIMEOUT;
this.bn = require('bn.js'); this.bn = require('bn.js');
this.utils = require('./utils'); this.utils = require('./utils');
this.locker = require('./locker'); this.locker = require('./locker');
@ -180,60 +137,128 @@ function Environment(options) {
this.lowlevelup = require('./lowlevelup'); this.lowlevelup = require('./lowlevelup');
this.uri = require('./uri'); this.uri = require('./uri');
this.protocol = require('./protocol')(this); this.network = require('./network');
this.errors = require('./errors')(this); this.protocol = require('./protocol');
this.profiler = require('./profiler')(this); this.errors = require('./errors');
this.ldb = require('./ldb')(this); this.ldb = require('./ldb');
this.timedata = require('./timedata')(this); this.profiler = require('./profiler');
this.script = require('./script')(this); this.timedata = require('./timedata');
this.stack = this.script.stack; this.script = require('./script');
this.witness = this.script.witness; this.stack = this.script.Stack;
this.input = require('./input')(this); this.witness = this.script.Witness;
this.output = require('./output')(this); this.input = require('./input');
this.coin = require('./coin')(this); this.output = require('./output');
this.coins = require('./coins')(this); this.coin = require('./coin');
this.coinview = require('./coinview')(this); this.coins = require('./coins');
this.tx = require('./tx')(this); this.coinview = require('./coinview');
this.mtx = require('./mtx')(this); this.tx = require('./tx');
this.txdb = require('./txdb')(this); this.mtx = require('./mtx');
this.abstractblock = require('./abstractblock')(this); this.txdb = require('./txdb');
this.compactblock = require('./compactblock')(this); this.abstractblock = require('./abstractblock');
this.block = require('./block')(this); this.compactblock = require('./compactblock');
this.merkleblock = require('./merkleblock')(this); this.block = require('./block');
this.headers = require('./headers')(this); this.merkleblock = require('./merkleblock');
this.node = require('./node')(this); this.headers = require('./headers');
this.spvnode = require('./spvnode')(this); this.node = require('./node');
this.fullnode = require('./fullnode')(this); this.spvnode = require('./spvnode');
this.chainblock = require('./chainblock')(this); this.fullnode = require('./fullnode');
this.chaindb = require('./chaindb')(this); this.chainblock = require('./chainblock');
this.chain = require('./chain')(this); this.chaindb = require('./chaindb');
this.mempool = require('./mempool')(this); this.chain = require('./chain');
this.mempoolentry = this.mempool.mempoolentry; this.mempool = require('./mempool');
this.keypair = require('./keypair')(this); this.mempoolentry = this.mempool.MempoolEntry;
this.hd = require('./hd')(this); this.keypair = require('./keypair');
this.address = require('./address')(this); this.hd = require('./hd');
this.wallet = require('./wallet')(this); this.address = require('./address');
this.walletdb = require('./walletdb')(this); this.wallet = require('./wallet');
this.provider = this.walletdb.provider; this.walletdb = require('./walletdb');
this.peer = require('./peer')(this); this.provider = this.walletdb.Provider;
this.pool = require('./pool')(this); this.peer = require('./peer');
this.miner = require('./miner')(this); this.pool = require('./pool');
this.minerblock = this.miner.minerblock; this.miner = require('./miner');
this.http = require('./http')(this); this.minerblock = this.miner.MinerBlock;
this.workers = this.useWorkers && !this.isBrowser this.http = require('./http');
? require('./work' + 'ers')(this)
: null;
this.time = new this.timedata(); this.workers = null;
this.workerPool = null; this.workerPool = null;
if (this.workers) { this.prefix = null;
this.networkType = null;
this.db = null;
this.debugLogs = null;
this.debugFile = null;
this.profile = null;
this.useWorkers = null;
this.maxWorkers = null;
this.workerTimeout = null;
this.time = new this.timedata();
this.setDefaults(options);
}
Environment.prototype.setDefaults = function setDefaults(options) {
options = utils.merge({}, options);
options.prefix = options.prefix
|| process.env.BCOIN_PREFIX
|| process.env.HOME + '/.bcoin';
options.network = options.network
|| process.env.BCOIN_NETWORK
|| 'main';
if (!options.db)
options.db = process.env.BCOIN_DB;
if (options.debug == null && process.env.BCOIN_DEBUG != null)
options.debug = +process.env.BCOIN_DEBUG === 1;
if (options.debugFile == null && process.env.BCOIN_DEBUGFILE != null) {
if (process.env.BCOIN_DEBUGFILE === '0'
|| process.env.BCOIN_DEBUGFILE === '1') {
options.debugFile = +process.env.BCOIN_DEBUGFILE !== 0;
} else {
options.debugFile = process.env.BCOIN_DEBUGFILE;
}
}
if (options.profile == null && process.env.BCOIN_PROFILE != null)
options.profile = +process.env.BCOIN_PROFILE === 1;
if (options.useWorkers == null && process.env.BCOIN_USE_WORKERS != null)
options.useWorkers = +process.env.BCOIN_USE_WORKERS === 1;
if (options.maxWorkers == null && process.env.BCOIN_MAX_WORKERS != null)
options.maxWorkers = +process.env.BCOIN_MAX_WORKERS;
if (options.workerTime == null && process.env.BCOIN_WORKER_TIMEOUT != null)
options.workerTimeout = +process.env.BCOIN_WORKER_TIMEOUT;
if (options.debugFile && typeof options.debugFile !== 'string')
options.debugFile = options.prefix + '/debug.log'
this.prefix = options.prefix;
this.networkType = options.network;
this.db = options.db;
this.debugLogs = !!options.debug;
this.debugFile = options.debugFile;
this.profile = options.profile;
this.useWorkers = !!options.useWorkers;
this.maxWorkers = options.maxWorkers;
this.workerTimeout = options.workerTimeout;
this.network.set(this.networkType);
if (this.useWorkers) {
this.workers = require('./workers');
this.workerPool = new this.workers({ this.workerPool = new this.workers({
size: this.maxWorkers, size: this.maxWorkers,
timeout: this.workerTimeout timeout: this.workerTimeout,
network: this.network.get(this.network.primary)
}); });
} }
} };
/** /**
* Ensure the `prefix`. * Ensure the `prefix`.

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = bcoin.utils; var utils = bcoin.utils;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
@ -110,8 +109,5 @@ function ScriptError(code, op, ip) {
utils.inherits(ScriptError, Error); utils.inherits(ScriptError, Error);
return { exports.VerifyError = VerifyError;
VerifyError: VerifyError, exports.ScriptError = ScriptError;
ScriptError: ScriptError
};
};

View File

@ -5,11 +5,9 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network;
/** /**
* Create a fullnode complete with a chain, * Create a fullnode complete with a chain,
@ -64,6 +62,7 @@ Fullnode.prototype._init = function _init() {
this.wallet = null; this.wallet = null;
this.chain = new bcoin.chain({ this.chain = new bcoin.chain({
network: this.network,
preload: false, preload: false,
spv: false, spv: false,
prune: this.options.prune, prune: this.options.prune,
@ -72,6 +71,7 @@ Fullnode.prototype._init = function _init() {
// Mempool needs access to the chain. // Mempool needs access to the chain.
this.mempool = new bcoin.mempool({ this.mempool = new bcoin.mempool({
network: this.network,
chain: this.chain, chain: this.chain,
limitFree: this.options.limitFree, limitFree: this.options.limitFree,
limitFreeRelay: this.options.limitFreeRelay, limitFreeRelay: this.options.limitFreeRelay,
@ -82,9 +82,10 @@ Fullnode.prototype._init = function _init() {
// Pool needs access to the chain and mempool. // Pool needs access to the chain and mempool.
this.pool = new bcoin.pool({ this.pool = new bcoin.pool({
network: this.network,
chain: this.chain, chain: this.chain,
mempool: this.mempool, mempool: this.mempool,
witness: network.witness, witness: this.network.witness,
listen: this.options.listen, listen: this.options.listen,
selfish: this.options.selfish, selfish: this.options.selfish,
broadcast: this.options.broadcast, broadcast: this.options.broadcast,
@ -93,6 +94,7 @@ Fullnode.prototype._init = function _init() {
// Miner needs access to the chain and mempool. // Miner needs access to the chain and mempool.
this.miner = new bcoin.miner({ this.miner = new bcoin.miner({
network: this.network,
chain: this.chain, chain: this.chain,
mempool: this.mempool, mempool: this.mempool,
address: this.options.payoutAddress, address: this.options.payoutAddress,
@ -100,15 +102,17 @@ Fullnode.prototype._init = function _init() {
}); });
this.walletdb = new bcoin.walletdb({ this.walletdb = new bcoin.walletdb({
network: this.network,
verify: false verify: false
}); });
// HTTP needs access to the node. // HTTP needs access to the node.
this.http = new bcoin.http.server({ this.http = new bcoin.http.server({
network: this.network,
node: this, node: this,
key: this.options.sslKey, key: this.options.sslKey,
cert: this.options.sslCert, cert: this.options.sslCert,
port: this.options.httpPort || network.rpcPort, port: this.options.httpPort || this.network.rpcPort,
host: this.options.httpHost || '0.0.0.0' host: this.options.httpHost || '0.0.0.0'
}); });
@ -597,5 +601,4 @@ Fullnode.prototype.getConfidence = function getConfidence(tx, callback) {
return this.mempool.getConfidence(tx, callback); return this.mempool.getConfidence(tx, callback);
}; };
return Fullnode; module.exports = Fullnode;
};

View File

@ -76,8 +76,7 @@
* SOFTWARE. * SOFTWARE.
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var ec = require('./ec'); var ec = require('./ec');
@ -378,7 +377,7 @@ function HDPrivateKey(options) {
assert(options, 'No options for HD private key.'); assert(options, 'No options for HD private key.');
assert(options.depth <= 0xff, 'Depth is too high.'); assert(options.depth <= 0xff, 'Depth is too high.');
this.network = options.network || network.type; this.network = bcoin.network.get(options.network);
this.xprivkey = options.xprivkey; this.xprivkey = options.xprivkey;
this.mnemonic = options.mnemonic; this.mnemonic = options.mnemonic;
@ -405,7 +404,7 @@ HDPrivateKey.prototype.__defineGetter__('hdPublicKey', function() {
if (!this._hdPublicKey) { if (!this._hdPublicKey) {
this._hdPublicKey = new HDPublicKey({ this._hdPublicKey = new HDPublicKey({
network: this.network, network: this.network,
version: network[this.network].prefixes.xpubkey, version: this.network.prefixes.xpubkey,
depth: this.depth, depth: this.depth,
parentFingerPrint: this.parentFingerPrint, parentFingerPrint: this.parentFingerPrint,
childIndex: this.childIndex, childIndex: this.childIndex,
@ -506,7 +505,7 @@ HDPrivateKey.prototype.deriveAccount44 = function deriveAccount44(options) {
} }
if (coinType == null) if (coinType == null)
coinType = this.network === 'main' ? 0 : 1; coinType = this.network.type === 'main' ? 0 : 1;
assert(utils.isNumber(coinType)); assert(utils.isNumber(coinType));
assert(utils.isNumber(accountIndex)); assert(utils.isNumber(accountIndex));
@ -702,9 +701,7 @@ HDPrivateKey.parseSeed = function parseSeed(seed, networkType) {
hash = utils.hmac('sha512', data, 'Bitcoin seed'); hash = utils.hmac('sha512', data, 'Bitcoin seed');
return { return {
version: networkType version: bcoin.network.get(networkType).prefixes.xprivkey,
? network[networkType].prefixes.xprivkey
: network.prefixes.xprivkey,
depth: 0, depth: 0,
parentFingerPrint: new Buffer([0, 0, 0, 0]), parentFingerPrint: new Buffer([0, 0, 0, 0]),
childIndex: 0, childIndex: 0,
@ -756,9 +753,7 @@ HDPrivateKey._generate = function _generate(options, networkType) {
entropy = ec.random(32); entropy = ec.random(32);
return { return {
version: networkType version: bcoin.network.get(networkType).prefixes.xprivkey,
? network[networkType].prefixes.xprivkey
: network.prefixes.xprivkey,
depth: 0, depth: 0,
parentFingerPrint: new Buffer([0, 0, 0, 0]), parentFingerPrint: new Buffer([0, 0, 0, 0]),
childIndex: 0, childIndex: 0,
@ -990,7 +985,7 @@ function HDPublicKey(options) {
assert(options, 'No options for HDPublicKey'); assert(options, 'No options for HDPublicKey');
assert(options.depth <= 0xff, 'Depth is too high.'); assert(options.depth <= 0xff, 'Depth is too high.');
this.network = options.network || network.type; this.network = bcoin.network.get(options.network);
this.xpubkey = options.xpubkey; this.xpubkey = options.xpubkey;
this.xprivkey = null; this.xprivkey = null;
@ -1335,7 +1330,7 @@ HDPublicKey.isHDPublicKey = function isHDPublicKey(obj) {
*/ */
HDPrivateKey.prototype.toSecret = function toSecret() { HDPrivateKey.prototype.toSecret = function toSecret() {
return KeyPair.toSecret.call(this); return KeyPair.prototype.toSecret.call(this);
}; };
HD.mnemonic = Mnemonic; HD.mnemonic = Mnemonic;
@ -1345,5 +1340,4 @@ HD.privateKey = HDPrivateKey;
HD.publicKey = HDPublicKey; HD.publicKey = HDPublicKey;
HD.fromJSON = HDPrivateKey.fromJSON; HD.fromJSON = HDPrivateKey.fromJSON;
return HD; module.exports = HD;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
/** /**
@ -155,5 +154,4 @@ Headers.isHeaders = function isHeaders(obj) {
&& typeof obj.toBlock !== 'function'; && typeof obj.toBlock !== 'function';
}; };
return Headers; module.exports = Headers;
};

View File

@ -5,10 +5,8 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var network = bcoin.protocol.network;
var utils = require('../utils'); var utils = require('../utils');
var assert = utils.assert; var assert = utils.assert;
var request = require('./request'); var request = require('./request');
@ -21,19 +19,20 @@ var request = require('./request');
* @param {Object?} options * @param {Object?} options
*/ */
function HTTPClient(uri, options) { function HTTPClient(options) {
if (!(this instanceof HTTPClient)) if (!(this instanceof HTTPClient))
return new HTTPClient(uri, options); return new HTTPClient(options);
if (!options) if (!options)
options = {}; options = {};
EventEmitter.call(this); EventEmitter.call(this);
this.uri = uri; this.uri = options.uri;
this.loaded = false; this.loaded = false;
this.id = null; this.id = null;
this.options = options; this.options = options;
this.network = bcoin.network.get(options.network);
this._init(); this._init();
} }
@ -63,7 +62,7 @@ HTTPClient.prototype._init = function _init() {
self.socket.on('version', function(info) { self.socket.on('version', function(info) {
bcoin.debug('Connected to bcoin server: %s (%s)', bcoin.debug('Connected to bcoin server: %s (%s)',
info.version, info.network); info.version, info.network);
assert(info.network === network.type, 'Wrong network.'); assert(info.network === self.network.type, 'Wrong network.');
}); });
self.socket.on('tx', function(tx, map) { self.socket.on('tx', function(tx, map) {
@ -224,7 +223,7 @@ HTTPClient.prototype._request = function _request(method, endpoint, json, callba
return callback(err); return callback(err);
networkType = res.headers['x-bcoin-network']; networkType = res.headers['x-bcoin-network'];
assert(networkType === network.type, 'Wrong network.'); assert(networkType === self.network.type, 'Wrong network.');
if (res.statusCode === 404) if (res.statusCode === 404)
return callback(); return callback();
@ -335,7 +334,7 @@ HTTPClient.prototype.getWallet = function getWallet(id, passphrase, callback) {
return callback(e); return callback(e);
} }
json.provider = new bcoin.http.provider(self.uri); json.provider = new bcoin.http.provider(self.options);
return callback(null, new bcoin.wallet(json)); return callback(null, new bcoin.wallet(json));
}); });
@ -361,7 +360,7 @@ HTTPClient.prototype.createWallet = function createWallet(options, callback) {
return callback(e); return callback(e);
} }
json.provider = new bcoin.http.provider(self.uri); json.provider = new bcoin.http.provider(self.options);
return callback(null, new bcoin.wallet(json)); return callback(null, new bcoin.wallet(json));
}); });
@ -914,5 +913,4 @@ HTTPClient.prototype.getInfo = function getInfo(callback) {
}); });
}; };
return HTTPClient; module.exports = HTTPClient;
};

View File

@ -5,17 +5,13 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var utils = require('../utils');
bcoin.http = {};
bcoin.http.request = require('./request'); exports.request = require('./request');
bcoin.http.client = require('./client')(bcoin); exports.provider = require('./provider');
bcoin.http.provider = require('./provider')(bcoin); exports.client = require('./client');
if (!bcoin.isBrowser) { if (!utils.isBrowser) {
bcoin.http.base = require('./ba' + 'se'); exports.base = require('./ba' + 'se');
bcoin.http.server = require('./ser' + 'ver')(bcoin); exports.server = require('./ser' + 'ver');
} }
return bcoin.http;
};

View File

@ -5,13 +5,13 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('../utils'); var utils = require('../utils');
var assert = utils.assert; var assert = utils.assert;
var HTTPClient = bcoin.http.client; var http = require('./');
var HTTPClient = http.client;
/** /**
* HTTPProvider * HTTPProvider
@ -20,13 +20,14 @@ var HTTPClient = bcoin.http.client;
* @param {String} uri * @param {String} uri
*/ */
function HTTPProvider(uri) { function HTTPProvider(options) {
if (!(this instanceof HTTPProvider)) if (!(this instanceof HTTPProvider))
return new HTTPProvider(uri); return new HTTPProvider(options);
EventEmitter.call(this); EventEmitter.call(this);
this.client = new HTTPClient(uri); this.client = new HTTPClient(options);
this.network = bcoin.network.get(options.network);
this.uri = uri; this.uri = uri;
this.id = null; this.id = null;
this._init(); this._init();
@ -201,5 +202,4 @@ HTTPProvider.prototype.zap = function zap(now, age, callback) {
return this.client.zapWallet(this.id, now, age, callback); return this.client.zapWallet(this.id, now, age, callback);
}; };
return HTTPProvider; module.exports = HTTPProvider;
};

View File

@ -5,12 +5,11 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network; var http = require('./');
var HTTPBase = bcoin.http.base; var HTTPBase = http.base;
var utils = require('../utils'); var utils = require('../utils');
var assert = utils.assert; var assert = utils.assert;
@ -33,6 +32,7 @@ function HTTPServer(options) {
assert(this.node, 'HTTP requires a Node.'); assert(this.node, 'HTTP requires a Node.');
this.network = this.node.network;
this.walletdb = this.node.walletdb; this.walletdb = this.node.walletdb;
this.mempool = this.node.mempool; this.mempool = this.node.mempool;
this.pool = this.node.pool; this.pool = this.node.pool;
@ -68,7 +68,7 @@ HTTPServer.prototype._init = function _init() {
res.setHeader('X-Bcoin-Version', constants.USER_VERSION); res.setHeader('X-Bcoin-Version', constants.USER_VERSION);
res.setHeader('X-Bcoin-Agent', constants.USER_AGENT); res.setHeader('X-Bcoin-Agent', constants.USER_AGENT);
res.setHeader('X-Bcoin-Network', network.type); res.setHeader('X-Bcoin-Network', self.network.type);
res.setHeader('X-Bcoin-Height', self.node.chain.height + ''); res.setHeader('X-Bcoin-Height', self.node.chain.height + '');
res.setHeader('X-Bcoin-Tip', utils.revHex(self.node.chain.tip.hash)); res.setHeader('X-Bcoin-Tip', utils.revHex(self.node.chain.tip.hash));
@ -187,7 +187,7 @@ HTTPServer.prototype._init = function _init() {
send(200, { send(200, {
version: constants.USER_VERSION, version: constants.USER_VERSION,
agent: constants.USER_AGENT, agent: constants.USER_AGENT,
network: network.type, network: self.network.type,
height: self.node.chain.height, height: self.node.chain.height,
tip: utils.revHex(self.node.chain.tip.hash), tip: utils.revHex(self.node.chain.tip.hash),
peers: self.node.pool.peers.all.length, peers: self.node.pool.peers.all.length,
@ -670,7 +670,7 @@ HTTPServer.prototype._initIO = function _initIO() {
socket.emit('version', { socket.emit('version', {
version: constants.USER_AGENT, version: constants.USER_AGENT,
network: network.type network: self.network.type
}); });
}); });
@ -785,5 +785,4 @@ HTTPServer.prototype.listen = function listen(port, host, callback) {
}); });
}; };
return HTTPServer; module.exports = HTTPServer;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
@ -41,7 +40,7 @@ function Input(options, mutable) {
this.prevout = options.prevout; this.prevout = options.prevout;
this.script = bcoin.script(options.script, this.mutable); this.script = bcoin.script(options.script, this.mutable);
this.sequence = options.sequence == null ? 0xffffffff : options.sequence; this.sequence = options.sequence == null ? 0xffffffff : options.sequence;
this.witness = bcoin.script.witness(options.witness, this.mutable); this.witness = bcoin.witness(options.witness, this.mutable);
if (options.coin) if (options.coin)
this.coin = bcoin.coin(options.coin); this.coin = bcoin.coin(options.coin);
@ -52,14 +51,6 @@ function Input(options, mutable) {
assert(typeof this.sequence === 'number'); assert(typeof this.sequence === 'number');
} }
Input.prototype.__defineGetter__('type', function() {
return this.getType();
});
Input.prototype.__defineGetter__('address', function() {
return this.getAddress();
});
/** /**
* Get the previous output script type. Will "guess" * Get the previous output script type. Will "guess"
* based on the input script and/or witness if coin * based on the input script and/or witness if coin
@ -160,23 +151,23 @@ Input.prototype.getSubtype = function getSubtype() {
* @returns {String?} address * @returns {String?} address
*/ */
Input.prototype.getAddress = function getAddress() { Input.prototype.getAddress = function getAddress(network) {
var address; var address;
if (this.isCoinbase()) if (this.isCoinbase())
return; return;
if (this.coin) if (this.coin)
return this.coin.getAddress(); return this.coin.getAddress(network);
if (this._address) if (this._address)
return this._address; return this._address;
if (this.witness.items.length > 0) if (this.witness.items.length > 0)
address = this.witness.getInputAddress(); address = this.witness.getInputAddress(network);
if (!address) if (!address)
address = this.script.getInputAddress(); address = this.script.getInputAddress(network);
if (!this.mutable) if (!this.mutable)
this._address = address; this._address = address;
@ -209,8 +200,8 @@ Input.prototype.isCoinbase = function isCoinbase() {
* @returns {Boolean} Whether the input matched. * @returns {Boolean} Whether the input matched.
*/ */
Input.prototype.test = function test(addressMap) { Input.prototype.test = function test(addressMap, network) {
var address = this.getAddress(); var address = this.getAddress(network);
if (!address) if (!address)
return false; return false;
@ -426,5 +417,4 @@ Input.isInput = function isInput(obj) {
&& typeof obj.getAddress === 'function'; && typeof obj.getAddress === 'function';
}; };
return Input; module.exports = Input;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network; var network = bcoin.protocol.network;
@ -34,6 +33,7 @@ function KeyPair(options) {
this.options = options; this.options = options;
this.key = null; this.key = null;
this.compressed = options.compressed !== false; this.compressed = options.compressed !== false;
this.network = bcoin.network.get(options.network);
if (!options.privateKey && !options.publicKey) if (!options.privateKey && !options.publicKey)
throw new Error('No options for keypair'); throw new Error('No options for keypair');
@ -129,7 +129,7 @@ KeyPair.prototype.getPublicKey = function getPublicKey(enc) {
*/ */
KeyPair.prototype.toSecret = function toSecret() { KeyPair.prototype.toSecret = function toSecret() {
return KeyPair.toSecret(this.getPrivateKey(), this.compressed); return KeyPair.toSecret(this.getPrivateKey(), this.compressed, this.network);
}; };
/** /**
@ -139,9 +139,10 @@ KeyPair.prototype.toSecret = function toSecret() {
* @returns {Base58String} * @returns {Base58String}
*/ */
KeyPair.toSecret = function toSecret(privateKey, compressed) { KeyPair.toSecret = function toSecret(privateKey, compressed, network) {
var p = new BufferWriter(); var p = new BufferWriter();
network = bcoin.network.get(network);
p.writeU8(network.prefixes.privkey); p.writeU8(network.prefixes.privkey);
p.writeBytes(privateKey); p.writeBytes(privateKey);
@ -163,9 +164,18 @@ KeyPair.parseSecret = function parseSecret(secret) {
var data = utils.fromBase58(secret); var data = utils.fromBase58(secret);
var p = new BufferReader(data, true); var p = new BufferReader(data, true);
var compressed = false; var compressed = false;
var privateKey; var prefix, type, privateKey;
assert(p.readU8() === network.prefixes.privkey, 'Bad network.'); prefix = p.readU8();
for (i = 0; i < network.types.length; i++) {
type = network.types[i];
prefix = network[type].prefixes.privkey;
if (data.version === prefix)
break;
}
assert(i < network.types.length, 'Network not found.');
privateKey = p.readBytes(32); privateKey = p.readBytes(32);
@ -177,6 +187,7 @@ KeyPair.parseSecret = function parseSecret(secret) {
p.verifyChecksum(); p.verifyChecksum();
return { return {
network: type,
privateKey: privateKey, privateKey: privateKey,
compressed: compressed compressed: compressed
}; };
@ -262,5 +273,4 @@ KeyPair.fromJSON = function fromJSON(json, passphrase) {
return new KeyPair(KeyPair.parseJSON(json, passphrase)); return new KeyPair(KeyPair.parseJSON(json, passphrase));
}; };
return KeyPair; module.exports = KeyPair;
};

View File

@ -7,11 +7,9 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var LowlevelUp = require('./lowlevelup'); var LowlevelUp = require('./lowlevelup');
var utils = bcoin.utils; var utils = bcoin.utils;
var network = bcoin.protocol.network;
var db = {}; var db = {};
/** /**
@ -69,7 +67,7 @@ function getLocation(options) {
+ '/' + '/'
+ options.name + options.name
+ '-' + '-'
+ network.type + bcoin.network.get(options.network).type
+ '.db'; + '.db';
} }
@ -132,5 +130,4 @@ function repair(options, callback) {
ldb.destroy = destroy; ldb.destroy = destroy;
ldb.repair = repair; ldb.repair = repair;
return ldb; module.exports = ldb;
};

View File

@ -5,17 +5,15 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) {
/* /*
* Database Layout: * Database Layout:
* (inherits all from txdb) * (inherits all from txdb)
*/ */
var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var bn = require('bn.js'); var bn = require('bn.js');
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var BufferWriter = require('./writer'); var BufferWriter = require('./writer');
@ -66,6 +64,7 @@ function Mempool(options) {
assert(this.chain, 'Mempool requires a blockchain.'); assert(this.chain, 'Mempool requires a blockchain.');
this.network = this.chain.network;
this.loaded = false; this.loaded = false;
this.locker = new bcoin.locker(this, this.addTX, 100 << 20); this.locker = new bcoin.locker(this, this.addTX, 100 << 20);
@ -87,7 +86,7 @@ function Mempool(options) {
this.relayPriority = this.options.relayPriority !== false; this.relayPriority = this.options.relayPriority !== false;
this.requireStandard = this.options.requireStandard != null this.requireStandard = this.options.requireStandard != null
? this.options.requireStandard ? this.options.requireStandard
: network.requireStandard; : this.network.requireStandard;
this.rejectAbsurdFees = this.options.rejectAbsurdFees !== false; this.rejectAbsurdFees = this.options.rejectAbsurdFees !== false;
this.prematureWitness = !!this.options.prematureWitness; this.prematureWitness = !!this.options.prematureWitness;
this.accurateMemory = !!this.options.accurateMemory; this.accurateMemory = !!this.options.accurateMemory;
@ -120,6 +119,7 @@ Mempool.prototype._init = function _init() {
var self = this; var self = this;
var unlock = this._lock(utils.nop, []); var unlock = this._lock(utils.nop, []);
var options = { var options = {
network: this.network,
name: this.options.name || 'mempool', name: this.options.name || 'mempool',
location: this.options.location, location: this.options.location,
db: this.options.db || 'memory' db: this.options.db || 'memory'
@ -1543,7 +1543,7 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry, callback) {
batch.put('m/' + pad32(entry.ts) + '/' + hash, DUMMY); batch.put('m/' + pad32(entry.ts) + '/' + hash, DUMMY);
if (this.options.indexAddress) { if (this.options.indexAddress) {
addresses = tx.getAddresses(); addresses = tx.getAddresses(this.network);
for (i = 0; i < addresses.length; i++) for (i = 0; i < addresses.length; i++)
batch.put('T/' + addresses[i] + '/' + hash, DUMMY); batch.put('T/' + addresses[i] + '/' + hash, DUMMY);
} }
@ -1561,7 +1561,7 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry, callback) {
batch.put('s/' + key, tx.hash()); batch.put('s/' + key, tx.hash());
if (this.options.indexAddress) { if (this.options.indexAddress) {
address = input.getAddress(); address = input.getAddress(this.network);
if (address) if (address)
batch.del('C/' + address + '/' + key); batch.del('C/' + address + '/' + key);
} }
@ -1579,7 +1579,7 @@ Mempool.prototype._addUnchecked = function _addUnchecked(entry, callback) {
batch.put('c/' + key, coin); batch.put('c/' + key, coin);
if (this.options.indexAddress) { if (this.options.indexAddress) {
address = output.getAddress(); address = output.getAddress(this.network);
if (address) if (address)
batch.put('C/' + address + '/' + key, DUMMY); batch.put('C/' + address + '/' + key, DUMMY);
} }
@ -1617,7 +1617,7 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(hash, limit, call
batch.del('m/' + pad32(entry.ts) + '/' + hash); batch.del('m/' + pad32(entry.ts) + '/' + hash);
if (self.options.indexAddress) { if (self.options.indexAddress) {
addresses = tx.getAddresses(); addresses = tx.getAddresses(self.network);
for (i = 0; i < addresses.length; i++) for (i = 0; i < addresses.length; i++)
batch.del('T/' + addresses[i] + '/' + hash); batch.del('T/' + addresses[i] + '/' + hash);
} }
@ -1641,14 +1641,14 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(hash, limit, call
if (result) { if (result) {
batch.put('c/' + key, input.coin.toRaw()); batch.put('c/' + key, input.coin.toRaw());
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = input.getAddress(); address = input.getAddress(self.network);
if (address) if (address)
batch.put('C/' + address + '/' + key, DUMMY); batch.put('C/' + address + '/' + key, DUMMY);
} }
} else { } else {
batch.del('c/' + key); batch.del('c/' + key);
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = input.getAddress(); address = input.getAddress(self.network);
if (address) if (address)
batch.del('C/' + address + '/' + key); batch.del('C/' + address + '/' + key);
} }
@ -1669,7 +1669,7 @@ Mempool.prototype._removeUnchecked = function _removeUnchecked(hash, limit, call
batch.del('c/' + key); batch.del('c/' + key);
if (self.options.indexAddress) { if (self.options.indexAddress) {
address = output.getAddress(); address = output.getAddress(self.network);
if (address) if (address)
batch.del('C/' + address + '/' + key); batch.del('C/' + address + '/' + key);
} }
@ -1943,7 +1943,6 @@ function mallocUsage(alloc) {
return ((alloc + 15) >>> 3) << 3; return ((alloc + 15) >>> 3) << 3;
} }
Mempool.mempoolentry = MempoolEntry; Mempool.MempoolEntry = MempoolEntry;
return Mempool; module.exports = Mempool;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
/** /**
@ -403,5 +402,4 @@ MerkleBlock.isMerkleBlock = function isMerkleBlock(obj) {
&& typeof obj.verifyPartial === 'function'; && typeof obj.verifyPartial === 'function';
}; };
return MerkleBlock; module.exports = MerkleBlock;
};

View File

@ -5,12 +5,10 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var bn = require('bn.js'); var bn = require('bn.js');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
@ -52,6 +50,7 @@ function Miner(options) {
assert(this.chain, 'Miner requires a blockchain.'); assert(this.chain, 'Miner requires a blockchain.');
this.network = this.chain.network;
this.running = false; this.running = false;
this.timeout = null; this.timeout = null;
this.loaded = false; this.loaded = false;
@ -62,6 +61,7 @@ function Miner(options) {
if (bcoin.useWorkers) { if (bcoin.useWorkers) {
this.workerPool = new bcoin.workers({ this.workerPool = new bcoin.workers({
network: this.network,
size: 1, size: 1,
timeout: -1 timeout: -1
}); });
@ -118,7 +118,7 @@ Miner.prototype._init = function _init() {
self.stop(); self.stop();
setTimeout(function() { setTimeout(function() {
self.start(); self.start();
}, network.type === 'regtest' ? 100 : 5000); }, self.network.type === 'regtest' ? 100 : 5000);
}); });
this.on('block', function(block) { this.on('block', function(block) {
@ -386,7 +386,7 @@ function MinerBlock(options) {
// miner succeeded. // miner succeeded.
new Buffer(options.coinbaseFlags, 'ascii') new Buffer(options.coinbaseFlags, 'ascii')
]), ]),
witness: new bcoin.script.witness(), witness: new bcoin.witness(),
sequence: 0xffffffff sequence: 0xffffffff
}); });
@ -672,7 +672,6 @@ function rcmp(a, b) {
return 0; return 0;
} }
Miner.minerblock = MinerBlock; Miner.MinerBlock = MinerBlock;
return Miner; module.exports = Miner;
};

View File

@ -5,15 +5,13 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var Script = bcoin.script; var Script = bcoin.script;
var Witness = bcoin.script.witness; var Witness = bcoin.witness;
var opcodes = constants.opcodes; var opcodes = constants.opcodes;
/** /**
@ -1100,8 +1098,8 @@ MTX.prototype.selectCoins = function selectCoins(coins, options) {
if (options.confirmed && coin.height === -1) if (options.confirmed && coin.height === -1)
continue; continue;
if (network.height !== -1 && coin.coinbase) { if (options.height != null && coin.coinbase) {
if (network.height + 1 < coin.height + constants.tx.COINBASE_MATURITY) if (options.height + 1 < coin.height + constants.tx.COINBASE_MATURITY)
continue; continue;
} }
@ -1147,12 +1145,12 @@ MTX.prototype.selectCoins = function selectCoins(coins, options) {
// Calculate max possible size after signing. // Calculate max possible size after signing.
size = tx.maxSize(options, true); size = tx.maxSize(options, true);
if (tryFree) { if (tryFree && options.height != null) {
// Note that this will only work // Note that this will only work
// if the mempool's rolling reject // if the mempool's rolling reject
// fee is zero (i.e. the mempool is // fee is zero (i.e. the mempool is
// not full). // not full).
if (tx.isFree(network.height + 1, size)) { if (tx.isFree(options.height + 1, size)) {
fee = new bn(0); fee = new bn(0);
break; break;
} }
@ -1298,7 +1296,7 @@ MTX.prototype.sortMembers = function sortMembers() {
MTX.prototype.avoidFeeSniping = function avoidFeeSniping(height) { MTX.prototype.avoidFeeSniping = function avoidFeeSniping(height) {
if (height == null) if (height == null)
height = network.height; height = bcoin.network.get().height;
if (height === -1) if (height === -1)
height = 0; height = 0;
@ -1403,5 +1401,4 @@ MTX.isMTX = function isMTX(obj) {
&& typeof obj.scriptInput === 'function'; && typeof obj.scriptInput === 'function';
}; };
return MTX; module.exports = MTX;
};

111
lib/bcoin/network.js Normal file
View File

@ -0,0 +1,111 @@
/*!
* network.js - network object for bcoin
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
* Copyright (c) 2014-2016, Christopher Jeffrey (MIT License).
* https://github.com/indutny/bcoin
*/
var utils = require('./utils');
var assert = utils.assert;
var network = require('./protocol/network');
/**
* Represents a key ring which amounts to an address. Used for {@link Wallet}.
* @exports Address
* @constructor
* @param {Object} options
* @param {String?} options.label
* @param {Boolean?} options.derived
* @param {HDPrivateKey|HDPublicKey} options.key
* @param {String?} options.path
* @param {Boolean?} options.change
* @param {Number?} options.index
* @param {String?} options.type - `"pubkeyhash"` or `"multisig"`.
* @param {Buffer[]} options.keys - Shared multisig keys.
* @param {Number?} options.m - Multisig `m` value.
* @param {Number?} options.n - Multisig `n` value.
* @param {Boolean?} options.witness - Whether witness programs are enabled.
*/
function Network(options) {
var i, keys, key, value;
if (typeof options === 'string')
options = network[options];
assert(options, 'Network requires a type or options.');
keys = Object.keys(options);
for (i = 0; i < keys.length; i++) {
key = keys[i];
value = options[key];
this[key] = value;
}
if (!Network[this.type])
Network[this.type] = this;
if (!Network.primary)
Network.primary = this.type;
}
Network.primary = null;
/**
* Test an object to see if it is an Address.
* @param {Object} obj
* @returns {Boolean}
*/
Network.prototype.updateHeight = function updateHeight(height) {
this.height = height;
};
/**
* Return address ID (pubkeyhash address of pubkey).
* @returns {Base58Address}
*/
Network.prototype.updateRate = function updateRate(rate) {
this.rate = rate;
};
/**
* Test an object to see if it is an Address.
* @param {Object} obj
* @returns {Boolean}
*/
Network.set = function set(type) {
assert(type, 'Bad network.');
if (!Network[type])
Network[type] = new Network(type);
if (!Network.primary)
Network.primary = type;
return Network[type];
};
Network.get = function get(options) {
var net;
if (!options) {
assert(Network.primary, 'No default network.');
return Network[Network.primary];
}
if (options instanceof Network)
return options;
if (typeof options === 'string') {
assert(Network[options], 'Network not created.');
return Network[options];
}
assert(false, 'Unknown network.');
};
module.exports = Network;

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('./utils'); var utils = require('./utils');
@ -29,6 +28,7 @@ function Node(options) {
options = {}; options = {};
this.options = options; this.options = options;
this.network = bcoin.network.get(options.network);
this.mempool = null; this.mempool = null;
this.pool = null; this.pool = null;
@ -39,5 +39,4 @@ function Node(options) {
utils.inherits(Node, EventEmitter); utils.inherits(Node, EventEmitter);
return Node; module.exports = Node;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
@ -50,14 +49,6 @@ function Output(options, mutable) {
assert(!this.mutable || !this.value.isNeg()); assert(!this.mutable || !this.value.isNeg());
} }
Output.prototype.__defineGetter__('type', function() {
return this.getType();
});
Output.prototype.__defineGetter__('address', function() {
return this.getAddress();
});
/** /**
* Get the script type. * Get the script type.
* @returns {String} type * @returns {String} type
@ -82,13 +73,13 @@ Output.prototype.getType = function getType() {
* @returns {String?} address * @returns {String?} address
*/ */
Output.prototype.getAddress = function getAddress() { Output.prototype.getAddress = function getAddress(network) {
var address; var address;
if (this._address) if (this._address)
return this._address; return this._address;
address = this.script.getAddress(); address = this.script.getAddress(network);
if (!this.mutable) if (!this.mutable)
this._address = address; this._address = address;
@ -103,8 +94,8 @@ Output.prototype.getAddress = function getAddress() {
* @returns {Boolean} Whether the output matched. * @returns {Boolean} Whether the output matched.
*/ */
Output.prototype.test = function test(addressMap) { Output.prototype.test = function test(addressMap, network) {
var address = this.getAddress(); var address = this.getAddress(network);
if (!address) if (!address)
return false; return false;
@ -227,5 +218,4 @@ Output.isOutput = function isOutput(obj) {
&& typeof obj.getAddress === 'function'; && typeof obj.getAddress === 'function';
}; };
return Output; module.exports = Output;
};

View File

@ -5,14 +5,12 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
/** /**
* Represents a remote peer. * Represents a remote peer.
@ -78,11 +76,12 @@ function Peer(pool, options) {
this.port = 0; this.port = 0;
this._createSocket = this.options.createSocket; this._createSocket = this.options.createSocket;
this.priority = this.options.priority; this.priority = this.options.priority;
this.parser = new bcoin.protocol.parser();
this.framer = new bcoin.protocol.framer();
this.chain = this.pool.chain; this.chain = this.pool.chain;
this.mempool = this.pool.mempool; this.mempool = this.pool.mempool;
this.bloom = this.pool.bloom; this.bloom = this.pool.bloom;
this.network = this.chain.network;
this.parser = new bcoin.protocol.parser(this.chain.options);
this.framer = new bcoin.protocol.framer(this.chain.options);
this.version = null; this.version = null;
this.destroyed = false; this.destroyed = false;
this.ack = false; this.ack = false;
@ -107,7 +106,7 @@ function Peer(pool, options) {
assert(this.port != null); assert(this.port != null);
} else if (options.seed) { } else if (options.seed) {
options.seed = utils.parseHost(options.seed); options.seed = utils.parseHost(options.seed);
options.seed.port = options.seed.port || network.port; options.seed.port = options.seed.port || this.network.port;
this.socket = this.createSocket(options.seed.port, options.seed.host); this.socket = this.createSocket(options.seed.port, options.seed.host);
} }
@ -1214,7 +1213,7 @@ Peer.prototype._handleAddr = function handleAddr(addrs) {
ts: ts, ts: ts,
services: addr.services, services: addr.services,
host: host, host: host,
port: addr.port || network.port, port: addr.port || this.network.port,
network: addr.network, network: addr.network,
bloom: addr.bloom, bloom: addr.bloom,
getutxo: addr.getutxo, getutxo: addr.getutxo,
@ -1274,11 +1273,12 @@ Peer.prototype._handleGetAddr = function handleGetAddr() {
hosts[ip] = true; hosts[ip] = true;
items.push({ items.push({
network: this.network,
ts: peer.ts, ts: peer.ts,
services: peer.version ? peer.version.services : null, services: peer.version ? peer.version.services : null,
ipv4: version === 4 ? ip : null, ipv4: version === 4 ? ip : null,
ipv6: version === 6 ? ip : null, ipv6: version === 6 ? ip : null,
port: peer.socket.remotePort || network.port port: peer.socket.remotePort || this.network.port
}); });
if (items.length === 1000) if (items.length === 1000)
@ -1339,7 +1339,7 @@ Peer.prototype._handleAlert = function handleAlert(details) {
var hash = utils.dsha256(details.payload); var hash = utils.dsha256(details.payload);
var signature = details.signature; var signature = details.signature;
if (!bcoin.ec.verify(hash, signature, network.alertKey)) { if (!bcoin.ec.verify(hash, signature, this.network.alertKey)) {
bcoin.debug('Peer %s sent a phony alert packet.', this.host); bcoin.debug('Peer %s sent a phony alert packet.', this.host);
// Let's look at it because why not? // Let's look at it because why not?
bcoin.debug(details); bcoin.debug(details);
@ -1445,5 +1445,4 @@ Peer.prototype.sendReject = function sendReject(obj, code, reason, score) {
return this.pool.reject(this, obj, code, reason, score); return this.pool.reject(this, obj, code, reason, score);
}; };
return Peer; module.exports = Peer;
};

View File

@ -5,12 +5,10 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var VerifyError = bcoin.errors.VerifyError; var VerifyError = bcoin.errors.VerifyError;
@ -84,6 +82,8 @@ function Pool(options) {
assert(this.chain, 'Pool requires a blockchain.'); assert(this.chain, 'Pool requires a blockchain.');
this.network = this.chain.network;
if (options.relay == null) { if (options.relay == null) {
if (options.spv) if (options.spv)
options.relay = false; options.relay = false;
@ -98,7 +98,7 @@ function Pool(options) {
options.headers = false; options.headers = false;
} }
seeds = (options.seeds || network.seeds).slice(); seeds = (options.seeds || this.network.seeds).slice();
if (process.env.BCOIN_SEED) if (process.env.BCOIN_SEED)
seeds.unshift(process.env.BCOIN_SEED); seeds.unshift(process.env.BCOIN_SEED);
@ -417,7 +417,7 @@ Pool.prototype.startServer = function startServer(callback) {
data.address, data.port); data.address, data.port);
}); });
this.server.listen(network.port, '0.0.0.0', callback); this.server.listen(this.network.port, '0.0.0.0', callback);
}; };
/** /**
@ -2119,7 +2119,7 @@ Pool.prototype.addSeed = function addSeed(seed) {
this.seeds.push({ this.seeds.push({
host: seed.host, host: seed.host,
port: seed.port || network.port port: seed.port || this.network.port
}); });
this.hosts[seed.host] = true; this.hosts[seed.host] = true;
@ -2321,5 +2321,4 @@ LoadRequest.prototype.finish = function finish() {
} }
}; };
return Pool; module.exports = Pool;
};

View File

@ -5,21 +5,25 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) {
/** /**
* @exports profiler * @exports profiler
*/ */
var profiler = {}; var profiler = exports;
var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var fs, v8profiler; var fs, v8profiler;
if (bcoin.profile && !bcoin.isBrowser) { function ensure() {
v8profiler = require('v8-' + 'profiler'); if (v8profiler)
fs = require('f' + 's'); return;
if (bcoin.profile && !bcoin.isBrowser) {
v8profiler = require('v8-' + 'profiler');
fs = require('f' + 's');
}
} }
/** /**
@ -30,7 +34,7 @@ if (bcoin.profile && !bcoin.isBrowser) {
*/ */
function Profile(name) { function Profile(name) {
if (v8profiler) { if (v8profiler && bcoin.profile) {
name = 'profile-' + (name ? name + '-' : '') + Profile.uid++; name = 'profile-' + (name ? name + '-' : '') + Profile.uid++;
bcoin.debug('Starting CPU profile: %s', name); bcoin.debug('Starting CPU profile: %s', name);
this.profile = v8profiler.startProfiling(name, true); this.profile = v8profiler.startProfiling(name, true);
@ -106,7 +110,7 @@ Profile.prototype.save = function save(callback) {
*/ */
function Snapshot(name) { function Snapshot(name) {
if (v8profiler) { if (v8profiler && bcoin.profile) {
name = 'snapshot-' + (name ? name + '-' : '') + Snapshot.uid++; name = 'snapshot-' + (name ? name + '-' : '') + Snapshot.uid++;
bcoin.debug('Taking heap snapshot: %s', name); bcoin.debug('Taking heap snapshot: %s', name);
this.snapshot = v8profiler.takeSnapshot(name); this.snapshot = v8profiler.takeSnapshot(name);
@ -197,6 +201,7 @@ Snapshot.prototype.save = function save(callback) {
*/ */
profiler.startProfiling = function startProfiling(name) { profiler.startProfiling = function startProfiling(name) {
ensure();
return new Profile(name); return new Profile(name);
}; };
@ -207,6 +212,7 @@ profiler.startProfiling = function startProfiling(name) {
*/ */
profiler.takeSnapshot = function takeSnapshot(name) { profiler.takeSnapshot = function takeSnapshot(name) {
ensure();
return new Snapshot(name); return new Snapshot(name);
}; };
@ -219,6 +225,8 @@ profiler.takeSnapshot = function takeSnapshot(name) {
profiler.snapshot = function snapshot(name, callback) { profiler.snapshot = function snapshot(name, callback) {
var snapshot, mem; var snapshot, mem;
ensure();
if (typeof name === 'function') { if (typeof name === 'function') {
callback = name; callback = name;
name = null; name = null;
@ -233,12 +241,9 @@ profiler.snapshot = function snapshot(name, callback) {
utils.mb(mem.rss - mem.heapTotal)); utils.mb(mem.rss - mem.heapTotal));
} }
if (!v8profiler) if (!v8profiler || !bcoin.profile)
return callback ? utils.nextTick(callback) : null; return callback ? utils.nextTick(callback) : null;
snapshot = new Snapshot(name); snapshot = new Snapshot(name);
snapshot.save(callback); snapshot.save(callback);
}; };
return profiler;
};

View File

@ -5,9 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../../bcoin');
var network = bcoin.protocol.network;
var constants = require('./constants'); var constants = require('./constants');
var utils = require('../utils'); var utils = require('../utils');
var assert = utils.assert; var assert = utils.assert;
@ -27,9 +25,11 @@ function Framer(options) {
if (!(this instanceof Framer)) if (!(this instanceof Framer))
return new Framer(options); return new Framer(options);
options = options || {}; if (!options)
options = {};
this.options = options; this.options = options;
this.network = bcoin.network.get(options.network);
this.agent = new Buffer(options.USER_AGENT || constants.USER_AGENT, 'ascii'); this.agent = new Buffer(options.USER_AGENT || constants.USER_AGENT, 'ascii');
} }
@ -51,7 +51,7 @@ Framer.prototype.header = function header(cmd, payload) {
assert(payload.length <= 0xffffffff); assert(payload.length <= 0xffffffff);
// Magic value // Magic value
utils.writeU32(h, network.magic, 0); utils.writeU32(h, this.network.magic, 0);
// Command // Command
len = cmd.copy(h, 4); len = cmd.copy(h, 4);
@ -95,6 +95,7 @@ Framer.prototype.version = function version(options) {
options = {}; options = {};
options.agent = this.agent; options.agent = this.agent;
options.network = this.network;
return this.packet('version', Framer.version(options)); return this.packet('version', Framer.version(options));
}; };
@ -386,6 +387,7 @@ Framer.prototype.addr = function addr(peers) {
Framer.address = function address(data, full, writer) { Framer.address = function address(data, full, writer) {
var p = new BufferWriter(writer); var p = new BufferWriter(writer);
var network = bcoin.network.get(data.network);
if (full) { if (full) {
if (!data.ts) if (!data.ts)
@ -434,6 +436,12 @@ Framer.version = function version(options, writer) {
if (typeof agent === 'string') if (typeof agent === 'string')
agent = new Buffer(agent, 'ascii'); agent = new Buffer(agent, 'ascii');
if (local.network == null)
local.network = options.network;
if (remote.network == null)
remote.network = options.network;
if (local.services == null) if (local.services == null)
local.services = constants.LOCAL_SERVICES; local.services = constants.LOCAL_SERVICES;
@ -1127,6 +1135,7 @@ Framer.addr = function addr(peers, writer) {
for (i = 0; i < peers.length; i++) { for (i = 0; i < peers.length; i++) {
peer = peers[i]; peer = peers[i];
Framer.address({ Framer.address({
network: peer.network,
ts: peer.ts, ts: peer.ts,
services: peer.services, services: peer.services,
ipv6: peer.ipv6, ipv6: peer.ipv6,
@ -1148,10 +1157,12 @@ Framer.addr = function addr(peers, writer) {
* @returns {Buffer} Returns a BufferWriter if `writer` was passed in. * @returns {Buffer} Returns a BufferWriter if `writer` was passed in.
*/ */
Framer.alert = function alert(data, writer) { Framer.alert = function alert(data, network, writer) {
var p, i, payload; var p, i, payload;
var key = data.key; var key = data.key;
network = bcoin.network.get(network);
if (!key && network.alertPrivateKey) if (!key && network.alertPrivateKey)
key = network.alertPrivateKey; key = network.alertPrivateKey;
@ -1507,5 +1518,4 @@ Framer.tx.cost = function txCost(tx) {
return base * (scale - 1) + sizes.size; return base * (scale - 1) + sizes.size;
}; };
return Framer; module.exports = Framer;
};

View File

@ -5,13 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { exports.constants = require('./constants');
bcoin.protocol = {}; exports.network = require('./network');
exports.framer = require('./framer');
bcoin.protocol.constants = require('./constants'); exports.parser = require('./parser');
bcoin.protocol.network = require('./network').get(bcoin.networkType);
bcoin.protocol.framer = require('./framer')(bcoin);
bcoin.protocol.parser = require('./parser')(bcoin);
return bcoin.protocol;
};

View File

@ -25,18 +25,6 @@ var main, testnet, regtest, segnet3, segnet4;
network.types = ['main', 'testnet', 'regtest', 'segnet3', 'segnet4']; network.types = ['main', 'testnet', 'regtest', 'segnet3', 'segnet4'];
/**
* Get a new network object by type.
* @memberof module:network
* @param {String} type - Network type.
* @returns {Object}
*/
network.get = function get(type) {
assert(network[type], 'Network not found.');
return utils.merge({}, network, network[type]);
};
/** /**
* Main * Main
* @static * @static

View File

@ -5,13 +5,11 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('../utils'); var utils = require('../utils');
var assert = utils.assert; var assert = utils.assert;
var constants = require('./constants'); var constants = require('./constants');
var network = bcoin.protocol.network;
var BufferReader = require('../reader'); var BufferReader = require('../reader');
/** /**
@ -23,9 +21,12 @@ var BufferReader = require('../reader');
* @emits Parser#packet * @emits Parser#packet
*/ */
function Parser() { function Parser(options) {
if (!(this instanceof Parser)) if (!(this instanceof Parser))
return new Parser(); return new Parser(options);
if (!options)
options = {};
EventEmitter.call(this); EventEmitter.call(this);
@ -33,6 +34,7 @@ function Parser() {
this.pendingTotal = 0; this.pendingTotal = 0;
this.waiting = 24; this.waiting = 24;
this.packet = null; this.packet = null;
this.network = bcoin.network.get(options.network);
} }
utils.inherits(Parser, EventEmitter); utils.inherits(Parser, EventEmitter);
@ -126,7 +128,7 @@ Parser.prototype.parseHeader = function parseHeader(h) {
magic = utils.readU32(h, 0); magic = utils.readU32(h, 0);
if (magic !== network.magic) if (magic !== this.network.magic)
return this._error('Invalid magic value: ' + magic.toString(16)); return this._error('Invalid magic value: ' + magic.toString(16));
// Count length of the cmd // Count length of the cmd
@ -1225,5 +1227,4 @@ Parser.parseAlert = function parseAlert(p) {
}; };
}; };
return Parser; module.exports = Parser;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var utils = require('./utils'); var utils = require('./utils');
@ -117,8 +116,8 @@ Witness.prototype.getInputType = function getInputType() {
* @returns {String|null} * @returns {String|null}
*/ */
Witness.prototype.getInputAddress = function getInputAddress() { Witness.prototype.getInputAddress = function getInputAddress(network) {
return Script.getInputAddress(this.items, true); return Script.getInputAddress(this.items, network, true);
}; };
Witness.prototype.getInputHash = function getInputHash() { Witness.prototype.getInputHash = function getInputHash() {
@ -2359,11 +2358,11 @@ Script.prototype.getSize = function getSize() {
* @returns {Base58Address|null} * @returns {Base58Address|null}
*/ */
Script.prototype.getInputAddress = function getInputAddress() { Script.prototype.getInputAddress = function getInputAddress(network) {
return Script.getInputAddress(this.code, false); return Script.getInputAddress(this.code, network, false);
}; };
Script.getInputAddress = function getInputAddress(code, isWitness) { Script.getInputAddress = function getInputAddress(code, network, isWitness) {
if (Script.isPubkeyInput(code)) if (Script.isPubkeyInput(code))
return; return;
@ -2372,9 +2371,10 @@ Script.getInputAddress = function getInputAddress(code, isWitness) {
return bcoin.address.compileData( return bcoin.address.compileData(
code[1], code[1],
'witnesspubkeyhash', 'witnesspubkeyhash',
0); 0,
network);
} }
return bcoin.address.compileData(code[1], 'pubkeyhash'); return bcoin.address.compileData(code[1], 'pubkeyhash', null, network);
} }
if (Script.isMultisigInput(code, isWitness)) if (Script.isMultisigInput(code, isWitness))
@ -2385,9 +2385,10 @@ Script.getInputAddress = function getInputAddress(code, isWitness) {
return bcoin.address.compileData( return bcoin.address.compileData(
code[code.length - 1], code[code.length - 1],
'witnessscripthash', 'witnessscripthash',
0); 0,
network);
} }
return bcoin.address.compileData(code[code.length - 1], 'scripthash'); return bcoin.address.compileData(code[code.length - 1], 'scripthash', null, network);
} }
}; };
@ -2398,7 +2399,7 @@ Script.getInputAddress = function getInputAddress(code, isWitness) {
* @returns {Base58Address|null} * @returns {Base58Address|null}
*/ */
Script.prototype.getAddress = function getAddress() { Script.prototype.getAddress = function getAddress(network) {
var program; var program;
if (this.isWitnessProgram()) { if (this.isWitnessProgram()) {
@ -2408,22 +2409,23 @@ Script.prototype.getAddress = function getAddress() {
return bcoin.address.compileHash( return bcoin.address.compileHash(
program.data, program.data,
program.type, program.type,
program.version); program.version,
network);
} }
// Convert p2pk to p2pkh addresses // Convert p2pk to p2pkh addresses
if (this.isPubkey()) if (this.isPubkey())
return bcoin.address.compileData(this.code[0], 'pubkeyhash'); return bcoin.address.compileData(this.code[0], 'pubkeyhash', null, network);
if (this.isPubkeyhash()) if (this.isPubkeyhash())
return bcoin.address.compileHash(this.code[2], 'pubkeyhash'); return bcoin.address.compileHash(this.code[2], 'pubkeyhash', null, network);
// Convert bare multisig to scripthash address // Convert bare multisig to scripthash address
if (this.isMultisig()) if (this.isMultisig())
return bcoin.address.compileData(this.encode(), 'scripthash'); return bcoin.address.compileData(this.encode(), 'scripthash', null, network);
if (this.isScripthash()) if (this.isScripthash())
return bcoin.address.compileHash(this.code[1], 'scripthash'); return bcoin.address.compileHash(this.code[1], 'scripthash', null, network);
}; };
/** /**
@ -4323,8 +4325,7 @@ Script.isScript = function isScript(obj) {
&& typeof obj.getSubscript === 'function'; && typeof obj.getSubscript === 'function';
}; };
Script.witness = Witness; Script.Witness = Witness;
Script.stack = Stack; Script.Stack = Stack;
return Script; module.exports = Script;
};

View File

@ -5,11 +5,9 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var network = bcoin.protocol.network;
/** /**
* Create an spv node which only maintains * Create an spv node which only maintains
@ -53,28 +51,32 @@ SPVNode.prototype._init = function _init() {
this.wallet = null; this.wallet = null;
this.chain = new bcoin.chain({ this.chain = new bcoin.chain({
network: this.network,
preload: this.options.preload, preload: this.options.preload,
useCheckpoints: this.options.useCheckpoints, useCheckpoints: this.options.useCheckpoints,
spv: true spv: true
}); });
this.pool = new bcoin.pool({ this.pool = new bcoin.pool({
network: this.network,
chain: this.chain, chain: this.chain,
witness: network.witness, witness: this.network.witness,
selfish: true, selfish: true,
listen: false, listen: false,
spv: true spv: true
}); });
this.walletdb = new bcoin.walletdb({ this.walletdb = new bcoin.walletdb({
network: this.network,
verify: true verify: true
}); });
this.http = new bcoin.http.server({ this.http = new bcoin.http.server({
network: this.network,
node: this, node: this,
key: this.options.sslKey, key: this.options.sslKey,
cert: this.options.sslCert, cert: this.options.sslCert,
port: this.options.httpPort || network.rpcPort, port: this.options.httpPort || this.network.rpcPort,
host: '0.0.0.0' host: '0.0.0.0'
}); });
@ -294,5 +296,4 @@ SPVNode.prototype.getWallet = function getWallet(id, passphrase, callback) {
return this.walletdb.get(id, passphrase, callback); return this.walletdb.get(id, passphrase, callback);
}; };
return SPVNode; module.exports = SPVNode;
};

View File

@ -5,8 +5,7 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
@ -108,5 +107,4 @@ function compare(a, b) {
return a - b; return a - b;
} }
return TimeData; module.exports = TimeData;
};

View File

@ -5,15 +5,13 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var Script = bcoin.script; var Script = bcoin.script;
var Stack = bcoin.script.stack; var Stack = bcoin.stack;
var BufferReader = require('./reader'); var BufferReader = require('./reader');
var BufferWriter = require('./writer'); var BufferWriter = require('./writer');
@ -696,13 +694,13 @@ TX.prototype.getOutputValue = function getOutputValue() {
* @returns {Base58Address[]} addresses * @returns {Base58Address[]} addresses
*/ */
TX.prototype.getInputAddresses = function getInputAddresses() { TX.prototype.getInputAddresses = function getInputAddresses(network) {
var table = {}; var table = {};
var addresses = []; var addresses = [];
var i, address; var i, address;
for (i = 0; i < this.inputs.length; i++) { for (i = 0; i < this.inputs.length; i++) {
address = this.inputs[i].getAddress(); address = this.inputs[i].getAddress(network);
if (address && !table[address]) { if (address && !table[address]) {
table[address] = true; table[address] = true;
addresses.push(address); addresses.push(address);
@ -719,13 +717,13 @@ TX.prototype.getInputAddresses = function getInputAddresses() {
* @returns {Base58Address[]} addresses * @returns {Base58Address[]} addresses
*/ */
TX.prototype.getOutputAddresses = function getOutputAddresses() { TX.prototype.getOutputAddresses = function getOutputAddresses(network) {
var table = {}; var table = {};
var addresses = []; var addresses = [];
var i, address; var i, address;
for (i = 0; i < this.outputs.length; i++) { for (i = 0; i < this.outputs.length; i++) {
address = this.outputs[i].getAddress(); address = this.outputs[i].getAddress(network);
if (address && !table[address]) { if (address && !table[address]) {
table[address] = true; table[address] = true;
addresses.push(address); addresses.push(address);
@ -742,9 +740,9 @@ TX.prototype.getOutputAddresses = function getOutputAddresses() {
* @returns {Base58Address[]} addresses * @returns {Base58Address[]} addresses
*/ */
TX.prototype.getAddresses = function getAddresses() { TX.prototype.getAddresses = function getAddresses(network) {
var input = this.getInputAddresses(); var input = this.getInputAddresses(network);
var output = this.getOutputAddresses(); var output = this.getOutputAddresses(network);
var i; var i;
for (i = 0; i < output.length; i++) { for (i = 0; i < output.length; i++) {
@ -1365,7 +1363,7 @@ TX.prototype.getPriority = function getPriority(height, size) {
if (height == null) { if (height == null) {
height = this.height; height = this.height;
if (height === -1) if (height === -1)
height = network.height + 1; height = bcoin.network.get().height + 1;
} }
if (size == null) if (size == null)
@ -1414,7 +1412,7 @@ TX.prototype.isFree = function isFree(height, size) {
if (height == null) { if (height == null) {
height = this.height; height = this.height;
if (height === -1) if (height === -1)
height = network.height + 1; height = bcoin.network.get().height + 1;
} }
priority = this.getPriority(height, size).priority; priority = this.getPriority(height, size).priority;
@ -1484,7 +1482,7 @@ TX.prototype.getMaxFee = function getMaxFee(size, rate) {
TX.prototype.getConfirmations = function getConfirmations(height) { TX.prototype.getConfirmations = function getConfirmations(height) {
if (height == null) if (height == null)
height = network.height; height = bcoin.network.get().height;
if (this.height === -1) if (this.height === -1)
return 0; return 0;
@ -1848,5 +1846,4 @@ TX.isTX = function isTX(obj) {
&& typeof obj.getVirtualSize === 'function'; && typeof obj.getVirtualSize === 'function';
}; };
return TX; module.exports = TX;
};

View File

@ -5,8 +5,6 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) {
/* /*
* Database Layout: * Database Layout:
* t/[hash] -> extended tx * t/[hash] -> extended tx
@ -23,6 +21,7 @@ module.exports = function(bcoin) {
* C/[id]/[hash]/[index] -> dummy (coin by address) * C/[id]/[hash]/[index] -> dummy (coin by address)
*/ */
var bcoin = require('../bcoin');
var bn = require('bn.js'); var bn = require('bn.js');
var utils = require('./utils'); var utils = require('./utils');
var assert = bcoin.utils.assert; var assert = bcoin.utils.assert;
@ -56,6 +55,7 @@ function TXDB(db, options) {
this.db = db; this.db = db;
this.options = options; this.options = options;
this.network = bcoin.network.get(options.network);
this.busy = false; this.busy = false;
this.jobs = []; this.jobs = [];
this.locker = new bcoin.locker(this); this.locker = new bcoin.locker(this);
@ -82,8 +82,8 @@ TXDB.prototype.getMap = function getMap(tx, callback) {
if (!this.options.indexAddress) if (!this.options.indexAddress)
return callback(); return callback();
input = tx.getInputAddresses(); input = tx.getInputAddresses(this.network);
output = tx.getOutputAddresses(); output = tx.getOutputAddresses(this.network);
addresses = utils.uniq(input.concat(output)); addresses = utils.uniq(input.concat(output));
function cb(err, table) { function cb(err, table) {
@ -340,7 +340,7 @@ TXDB.prototype._add = function add(tx, map, callback, force) {
if (tx.isCoinbase()) if (tx.isCoinbase())
return next(); return next();
address = input.getAddress(); address = input.getAddress(self.network);
// Only add orphans if this input is ours. // Only add orphans if this input is ours.
if (self.options.mapAddress) { if (self.options.mapAddress) {
@ -434,7 +434,7 @@ TXDB.prototype._add = function add(tx, map, callback, force) {
// Add unspent outputs or resolve orphans // Add unspent outputs or resolve orphans
utils.forEachSerial(tx.outputs, function(output, next, i) { utils.forEachSerial(tx.outputs, function(output, next, i) {
var address = output.getAddress(); var address = output.getAddress(self.network);
var key, coin; var key, coin;
// Do not add unspents for outputs that aren't ours. // Do not add unspents for outputs that aren't ours.
@ -688,7 +688,7 @@ TXDB.prototype._confirm = function _confirm(tx, map, callback, force) {
} }
utils.forEachSerial(tx.outputs, function(output, next, i) { utils.forEachSerial(tx.outputs, function(output, next, i) {
var address = output.getAddress(); var address = output.getAddress(self.network);
// Only update coins if this output is ours. // Only update coins if this output is ours.
if (self.options.mapAddress) { if (self.options.mapAddress) {
@ -849,7 +849,7 @@ TXDB.prototype._remove = function remove(tx, map, callback, force) {
tx.inputs.forEach(function(input) { tx.inputs.forEach(function(input) {
var key = input.prevout.hash + '/' + input.prevout.index; var key = input.prevout.hash + '/' + input.prevout.index;
var address = input.getAddress(); var address = input.getAddress(self.network);
if (tx.isCoinbase()) if (tx.isCoinbase())
return; return;
@ -875,7 +875,7 @@ TXDB.prototype._remove = function remove(tx, map, callback, force) {
tx.outputs.forEach(function(output, i) { tx.outputs.forEach(function(output, i) {
var key = hash + '/' + i; var key = hash + '/' + i;
var address = output.getAddress(); var address = output.getAddress(self.network);
if (self.options.mapAddress) { if (self.options.mapAddress) {
if (!address || !map.table[address].length) if (!address || !map.table[address].length)
@ -1735,5 +1735,4 @@ TXDB.prototype.zap = function zap(address, now, age, callback, force) {
}); });
}; };
return TXDB; module.exports = TXDB;
};

View File

@ -5,13 +5,11 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var BufferWriter = require('./writer'); var BufferWriter = require('./writer');
/** /**
@ -68,10 +66,12 @@ function Wallet(options) {
options.master = bcoin.hd.fromAny(options.master); options.master = bcoin.hd.fromAny(options.master);
} }
if (!options.master)
options.master = bcoin.hd.fromSeed();
this.options = options; this.options = options;
this.network = bcoin.network.get(options.network);
if (!options.master)
options.master = bcoin.hd.fromSeed(null, this.network);
this.provider = options.provider || null; this.provider = options.provider || null;
this.master = options.master || null; this.master = options.master || null;
this.addressMap = options.addressMap || {}; this.addressMap = options.addressMap || {};
@ -487,6 +487,7 @@ Wallet.prototype.deriveAddress = function deriveAddress(change, index) {
key = this.accountKey.derive(data.path); key = this.accountKey.derive(data.path);
options = { options = {
network: this.network,
key: key, key: key,
change: data.change, change: data.change,
index: data.index, index: data.index,
@ -1010,7 +1011,7 @@ Wallet.prototype.getRedeem = function getRedeem(hash, prefix) {
return; return;
} }
addr = bcoin.address.compileHash(hash, prefix); addr = bcoin.address.compileHash(hash, prefix, null, this.network);
address = this.deriveAddress(addr); address = this.deriveAddress(addr);
if (!address) if (!address)
@ -1521,7 +1522,7 @@ Wallet.prototype.inspect = function inspect() {
return { return {
id: this.id, id: this.id,
type: this.type, type: this.type,
network: network.type, network: this.network.type,
m: this.m, m: this.m,
n: this.n, n: this.n,
keyAddress: this._initialized keyAddress: this._initialized
@ -1559,7 +1560,7 @@ Wallet.prototype.toJSON = function toJSON() {
return { return {
v: 3, v: 3,
name: 'wallet', name: 'wallet',
network: network.type, network: this.network.type,
id: this.id, id: this.id,
type: this.type, type: this.type,
m: this.m, m: this.m,
@ -1594,10 +1595,8 @@ Wallet.parseJSON = function parseJSON(json, passphrase) {
assert.equal(json.v, 3); assert.equal(json.v, 3);
assert.equal(json.name, 'wallet'); assert.equal(json.name, 'wallet');
if (json.network)
assert.equal(json.network, network.type);
return { return {
network: json.network,
id: json.id, id: json.id,
type: json.type, type: json.type,
m: json.m, m: json.m,
@ -1634,9 +1633,6 @@ Wallet._syncDepth = function _syncDepth(json, options) {
assert.equal(json.v, 3); assert.equal(json.v, 3);
assert.equal(json.name, 'wallet'); assert.equal(json.name, 'wallet');
if (json.network)
assert.equal(json.network, network.type);
master = json.master; master = json.master;
json.master = json.accountKey; json.master = json.accountKey;
wallet = new Wallet(json); wallet = new Wallet(json);
@ -1737,9 +1733,6 @@ Wallet._addKey = function _addKey(json, keys, remove) {
if (!Array.isArray(keys)) if (!Array.isArray(keys))
keys = [keys]; keys = [keys];
if (json.network)
assert.equal(json.network, network.type);
master = json.master; master = json.master;
json.master = json.accountKey; json.master = json.accountKey;
wallet = new Wallet(json); wallet = new Wallet(json);
@ -1793,5 +1786,4 @@ Wallet.isWallet = function isWallet(obj) {
&& obj.deriveAddress === 'function'; && obj.deriveAddress === 'function';
}; };
return Wallet; module.exports = Wallet;
};

View File

@ -5,8 +5,6 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) {
/* /*
* Database Layout: * Database Layout:
* (inherits all from txdb) * (inherits all from txdb)
@ -14,11 +12,11 @@ module.exports = function(bcoin) {
* w/[id] -> wallet * w/[id] -> wallet
*/ */
var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var utils = require('./utils'); var utils = require('./utils');
var assert = utils.assert; var assert = utils.assert;
var DUMMY = new Buffer([0]); var DUMMY = new Buffer([0]);
var network = bcoin.protocol.network;
/** /**
* WalletDB * WalletDB
@ -100,6 +98,7 @@ WalletDB.prototype._init = function _init() {
return; return;
this.db = bcoin.ldb({ this.db = bcoin.ldb({
network: this.network,
name: this.options.name || 'wallet', name: this.options.name || 'wallet',
location: this.options.location, location: this.options.location,
db: this.options.db, db: this.options.db,
@ -116,6 +115,7 @@ WalletDB.prototype._init = function _init() {
}); });
this.tx = new bcoin.txdb(this.db, { this.tx = new bcoin.txdb(this.db, {
network: this.network,
indexExtra: true, indexExtra: true,
indexAddress: true, indexAddress: true,
mapAddress: true, mapAddress: true,
@ -616,7 +616,7 @@ WalletDB.prototype.create = function create(id, options, callback) {
if (json) if (json)
return callback(new Error('`' + id + '` already exists.'), null, json); return callback(new Error('`' + id + '` already exists.'), null, json);
if (network.witness) if (self.network.witness)
options.witness = options.witness !== false; options.witness = options.witness !== false;
options.provider = new Provider(self); options.provider = new Provider(self);
@ -1169,5 +1169,4 @@ Provider.prototype.zap = function zap(now, age, callback) {
WalletDB.Provider = Provider; WalletDB.Provider = Provider;
return WalletDB; module.exports = WalletDB;
};

View File

@ -5,24 +5,26 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
var penv, env; var bcoin, env;
if (typeof importScripts !== 'undefined') { if (typeof importScripts !== 'undefined') {
self.importScripts('/bcoin.js'); self.importScripts('/bcoin.js');
bcoin = self.bcoin;
self.onmessage = function onmessage(event) { self.onmessage = function onmessage(event) {
self.onmessage = function() {}; self.onmessage = function() {};
penv = JSON.parse(event.data); env = JSON.parse(event.data);
env = self.bcoin.env(penv.BCOIN_WORKER_NETWORK); bcoin.network.set(env.BCOIN_WORKER_NETWORK);
env.workers.listen(+penv.BCOIN_WORKER_ID, { bcoin.workers.listen(+env.BCOIN_WORKER_ID, {
debug: +penv.BCOIN_WORKER_DEBUG === 1 debug: +env.BCOIN_WORKER_DEBUG === 1
}); });
}; };
} else { } else {
penv = process.env; env = process.env;
env = require('./env')(penv.BCOIN_WORKER_NETWORK); bcoin = require('../bcoin');
env.workers.listen(+penv.BCOIN_WORKER_ID, { bcoin.network.set(env.BCOIN_WORKER_NETWORK);
debug: +penv.BCOIN_WORKER_DEBUG === 1 bcoin.workers.listen(+env.BCOIN_WORKER_ID, {
debug: +env.BCOIN_WORKER_DEBUG === 1
}); });
} }

View File

@ -5,12 +5,10 @@
* https://github.com/indutny/bcoin * https://github.com/indutny/bcoin
*/ */
module.exports = function(bcoin) { var bcoin = require('../bcoin');
var EventEmitter = require('events').EventEmitter; var EventEmitter = require('events').EventEmitter;
var bn = require('bn.js'); var bn = require('bn.js');
var constants = bcoin.protocol.constants; var constants = bcoin.protocol.constants;
var network = bcoin.protocol.network;
var utils = require('./utils'); var utils = require('./utils');
var global = utils.global; var global = utils.global;
var assert = utils.assert; var assert = utils.assert;
@ -39,6 +37,7 @@ function Workers(options) {
this.uid = 0; this.uid = 0;
this.size = options.size || Workers.CORES; this.size = options.size || Workers.CORES;
this.timeout = options.timeout || 60000; this.timeout = options.timeout || 60000;
this.network = bcoin.network.get(options.network);
this.children = []; this.children = [];
} }
@ -63,7 +62,7 @@ Workers.prototype.spawn = function spawn(id) {
bcoin.debug('Spawning worker process: %d', id); bcoin.debug('Spawning worker process: %d', id);
child = new Worker(id); child = new Worker(this, id);
child.on('error', function(err) { child.on('error', function(err) {
bcoin.debug('Worker %d error: %s', child.id, err.message); bcoin.debug('Worker %d error: %s', child.id, err.message);
@ -213,23 +212,24 @@ Workers.prototype.mine = function mine(attempt, callback) {
* @property {Number} id * @property {Number} id
*/ */
function Worker(id) { function Worker(pool, id) {
var self = this; var self = this;
var penv, cp; var penv, cp;
if (!(this instanceof Worker)) if (!(this instanceof Worker))
return new Worker(id); return new Worker(pool, id);
EventEmitter.call(this); EventEmitter.call(this);
this.id = id; this.id = id;
this.pool = pool;
this.framer = new Framer(); this.framer = new Framer();
this.parser = new Parser(); this.parser = new Parser();
this.setMaxListeners(utils.MAX_SAFE_INTEGER); this.setMaxListeners(utils.MAX_SAFE_INTEGER);
penv = { penv = {
BCOIN_WORKER_ID: id + '', BCOIN_WORKER_ID: id + '',
BCOIN_WORKER_NETWORK: network.type, BCOIN_WORKER_NETWORK: this.pool.network.type,
BCOIN_WORKER_DEBUG: (bcoin.debugLogs || bcoin.debugFile) ? '1' : '0' BCOIN_WORKER_DEBUG: (bcoin.debugLogs || bcoin.debugFile) ? '1' : '0'
}; };
@ -881,12 +881,10 @@ function getCores() {
return os.cpus().length; return os.cpus().length;
} }
Workers.workers = Workers; Workers.Worker = Worker;
Workers.worker = Worker; Workers.Master = Master;
Workers.master = Master; Workers.Framer = Framer;
Workers.framer = Framer; Workers.Parser = Parser;
Workers.parser = Parser;
Workers.listen = Master.listen; Workers.listen = Master.listen;
return Workers; module.exports = Workers;
};