Merge pull request #998 from braydonf/feature/custom-networks

Networks: Added the ability to define a custom network. Closes #997
This commit is contained in:
Manuel Aráoz 2015-01-23 11:43:49 -03:00
commit 32b257d74c
2 changed files with 128 additions and 63 deletions

View File

@ -2,6 +2,8 @@
var _ = require('lodash'); var _ = require('lodash');
var BufferUtil = require('./util/buffer'); var BufferUtil = require('./util/buffer');
var networks = [];
var networkMaps = {};
/** /**
* A network is merely a map containing values that correspond to version * A network is merely a map containing values that correspond to version
@ -15,79 +17,19 @@ Network.prototype.toString = function toString() {
return this.name; return this.name;
}; };
/**
* @instance
* @member Network#livenet
*/
var livenet = new Network();
_.extend(livenet, {
name: 'livenet',
alias: 'mainnet',
pubkeyhash: 0x00,
privatekey: 0x80,
scripthash: 0x05,
xpubkey: 0x0488b21e,
xprivkey: 0x0488ade4,
networkMagic: BufferUtil.integerAsBuffer(0xf9beb4d9),
port: 8333,
dnsSeeds: [
'seed.bitcoin.sipa.be',
'dnsseed.bluematt.me',
'dnsseed.bitcoin.dashjr.org',
'seed.bitcoinstats.com',
'seed.bitnodes.io',
'bitseed.xf2.org'
]
});
/**
* @instance
* @member Network#testnet
*/
var testnet = new Network();
_.extend(testnet, {
name: 'testnet',
alias: 'testnet',
pubkeyhash: 0x6f,
privatekey: 0xef,
scripthash: 0xc4,
xpubkey: 0x043587cf,
xprivkey: 0x04358394,
networkMagic: BufferUtil.integerAsBuffer(0x0b110907),
port: 18333,
dnsSeeds: [
'testnet-seed.bitcoin.petertodd.org',
'testnet-seed.bluematt.me'
],
});
var networkMaps = {};
_.each(_.values(livenet), function(value) {
if (!_.isObject(value)) {
networkMaps[value] = livenet;
}
});
_.each(_.values(testnet), function(value) {
if (!_.isObject(value)) {
networkMaps[value] = testnet;
}
});
/** /**
* @function * @function
* @member Network#getNetwork * @member Networks#get
* Retrieves the network associated with a magic number or string. * Retrieves the network associated with a magic number or string.
* @param {string|number|Network} arg * @param {string|number|Network} arg
* @param {string} key - if set, only check if the magic number associated with this name matches * @param {string} key - if set, only check if the magic number associated with this name matches
* @return Network * @return Network
*/ */
function getNetwork(arg, key) { function getNetwork(arg, key) {
if (arg === livenet || arg === testnet) { if (~networks.indexOf(arg)) {
return arg; return arg;
} }
if (key) { if (key) {
var networks = [livenet, testnet];
for (var index in networks) { for (var index in networks) {
if (networks[index][key] === arg) { if (networks[index][key] === arg) {
return networks[index]; return networks[index];
@ -99,9 +41,104 @@ function getNetwork(arg, key) {
} }
/** /**
* @namespace Network * @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,
privatekey: 0x80,
scripthash: 0x05,
xpubkey: 0x0488b21e,
xprivkey: 0x0488ade4,
networkMagic: 0xf9beb4d9,
port: 8333,
dnsSeeds: [
'seed.bitcoin.sipa.be',
'dnsseed.bluematt.me',
'dnsseed.bitcoin.dashjr.org',
'seed.bitcoinstats.com',
'seed.bitnodes.io',
'bitseed.xf2.org'
]
});
addNetwork({
name: 'testnet',
alias: 'testnet',
pubkeyhash: 0x6f,
privatekey: 0xef,
scripthash: 0xc4,
xpubkey: 0x043587cf,
xprivkey: 0x04358394,
networkMagic: 0x0b110907,
port: 18333,
dnsSeeds: [
'testnet-seed.bitcoin.petertodd.org',
'testnet-seed.bluematt.me'
],
});
/**
* @instance
* @member Networks#livenet
*/
var livenet = getNetwork('livenet');
/**
* @instance
* @member Networks#testnet
*/
var testnet = getNetwork('testnet');
/**
* @namespace Networks
*/ */
module.exports = { module.exports = {
add: addNetwork,
defaultNetwork: livenet, defaultNetwork: livenet,
livenet: livenet, livenet: livenet,
mainnet: livenet, mainnet: livenet,

View File

@ -13,6 +13,34 @@ describe('Networks', function() {
should.exist(networks.defaultNetwork); 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']; var constants = ['name', 'alias', 'pubkeyhash', 'scripthash', 'xpubkey', 'xprivkey'];
constants.forEach(function(key){ constants.forEach(function(key){