Browse Source

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

Networks: Added the ability to define a custom network. Closes #997
patch-2
Manuel Aráoz 10 years ago
parent
commit
32b257d74c
  1. 131
      lib/networks.js
  2. 28
      test/networks.js

131
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,

28
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){

Loading…
Cancel
Save