diff --git a/lib/networks.js b/lib/networks.js index 7994b38..e3280c4 100644 --- a/lib/networks.js +++ b/lib/networks.js @@ -2,6 +2,8 @@ var _ = require('lodash'); var BufferUtil = require('./util/buffer'); +var networks = []; +var networkMaps = {}; /** * A network is merely a map containing values that correspond to version @@ -16,11 +18,75 @@ Network.prototype.toString = function toString() { }; /** - * @instance - * @member Network#livenet + * @function + * @member Networks#get + * Retrieves the network associated with a magic number or string. + * @param {string|number|Network} arg + * @param {string} key - if set, only check if the magic number associated with this name matches + * @return Network */ -var livenet = new Network(); -_.extend(livenet, { +function getNetwork(arg, key) { + if (~networks.indexOf(arg)) { + return arg; + } + if (key) { + for (var index in networks) { + if (networks[index][key] === arg) { + return networks[index]; + } + } + return undefined; + } + return networkMaps[arg]; +} + +/** + * @function + * @member Networks#add + * Will add a custom Network + * @param {Object} data + * @param {String} data.name - The name of the network + * @param {String} data.alias - The aliased name of the network + * @param {Number} data.pubkeyhash - The publickey hash prefix + * @param {Number} data.privatekey - The privatekey prefix + * @param {Number} data.scripthash - The scripthash prefix + * @param {Number} data.xpubkey - The extended public key magic + * @param {Number} data.xprivkey - The extended private key magic + * @param {Number} data.networkMagic - The network magic number + * @param {Number} data.port - The network port + * @param {Array} data.dnsSeeds - An array of dns seeds + * @return Network + */ +function addNetwork(data) { + + var network = new Network(); + + _.extend(network, { + name: data.name, + alias: data.alias, + pubkeyhash: data.pubkeyhash, + privatekey: data.privatekey, + scripthash: data.scripthash, + xpubkey: data.xpubkey, + xprivkey: data.xprivkey, + networkMagic: BufferUtil.integerAsBuffer(data.networkMagic), + port: data.port, + dnsSeeds: data.dnsSeeds + }); + + _.each(_.values(network), function(value) { + if (!_.isObject(value)) { + networkMaps[value] = network; + } + }); + + networks.push(network); + + return network; + +} + +addNetwork({ name: 'livenet', alias: 'mainnet', pubkeyhash: 0x00, @@ -28,7 +94,7 @@ _.extend(livenet, { scripthash: 0x05, xpubkey: 0x0488b21e, xprivkey: 0x0488ade4, - networkMagic: BufferUtil.integerAsBuffer(0xf9beb4d9), + networkMagic: 0xf9beb4d9, port: 8333, dnsSeeds: [ 'seed.bitcoin.sipa.be', @@ -40,12 +106,7 @@ _.extend(livenet, { ] }); -/** - * @instance - * @member Network#testnet - */ -var testnet = new Network(); -_.extend(testnet, { +addNetwork({ name: 'testnet', alias: 'testnet', pubkeyhash: 0x6f, @@ -53,7 +114,7 @@ _.extend(testnet, { scripthash: 0xc4, xpubkey: 0x043587cf, xprivkey: 0x04358394, - networkMagic: BufferUtil.integerAsBuffer(0x0b110907), + networkMagic: 0x0b110907, port: 18333, dnsSeeds: [ 'testnet-seed.bitcoin.petertodd.org', @@ -61,47 +122,23 @@ _.extend(testnet, { ], }); -var networkMaps = {}; - -_.each(_.values(livenet), function(value) { - if (!_.isObject(value)) { - networkMaps[value] = livenet; - } -}); -_.each(_.values(testnet), function(value) { - if (!_.isObject(value)) { - networkMaps[value] = testnet; - } -}); +/** +* @instance +* @member Networks#livenet +*/ +var livenet = getNetwork('livenet'); /** - * @function - * @member Network#getNetwork - * Retrieves the network associated with a magic number or string. - * @param {string|number|Network} arg - * @param {string} key - if set, only check if the magic number associated with this name matches - * @return Network - */ -function getNetwork(arg, key) { - if (arg === livenet || arg === testnet) { - return arg; - } - if (key) { - var networks = [livenet, testnet]; - for (var index in networks) { - if (networks[index][key] === arg) { - return networks[index]; - } - } - return undefined; - } - return networkMaps[arg]; -} +* @instance +* @member Networks#testnet +*/ +var testnet = getNetwork('testnet'); /** - * @namespace Network + * @namespace Networks */ module.exports = { + add: addNetwork, defaultNetwork: livenet, livenet: livenet, mainnet: livenet, diff --git a/test/networks.js b/test/networks.js index a542c7b..ddcd07a 100644 --- a/test/networks.js +++ b/test/networks.js @@ -13,6 +13,34 @@ describe('Networks', function() { should.exist(networks.defaultNetwork); }); + it('should be able to define a custom Network', function() { + var custom = { + name: 'customnet', + alias: 'mynet', + pubkeyhash: 0x10, + privatekey: 0x90, + scripthash: 0x08, + xpubkey: 0x0278b20e, + xprivkey: 0x0278ade4, + networkMagic: 0xe7beb4d4, + port: 20001, + dnsSeeds: [ + 'localhost', + 'mynet.localhost' + ] + }; + networks.add(custom); + var customnet = networks.get('customnet'); + for (var key in custom) { + if (key !== 'networkMagic') { + customnet[key].should.equal(custom[key]); + } else { + var expected = new Buffer('e7beb4d4', 'hex'); + customnet[key].should.deep.equal(expected); + } + } + }); + var constants = ['name', 'alias', 'pubkeyhash', 'scripthash', 'xpubkey', 'xprivkey']; constants.forEach(function(key){