net: add priority nodes.

This commit is contained in:
Christopher Jeffrey 2017-01-16 04:28:46 -08:00
parent db49f44c8a
commit f2d092f23c
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD
7 changed files with 123 additions and 21 deletions

View File

@ -49,6 +49,7 @@ bip150: false
identity-key: 74b4147957813b62cc8987f2b711ddb31f8cb46dcbf71502033da66053c8780a
auth-peers: ./authorized-peers
known-peers: ./known-peers
# nodes: 127.0.0.1,127.0.0.2
# Miner
# payout-address: 1111111111111111111114oLvT2

View File

@ -634,6 +634,8 @@ AuthDB.prototype.populate = co(function* populate(addr, key) {
try {
hosts = yield this.resolve(addr.host, this.proxyServer);
} catch (e) {
if (this.logger)
this.logger.error(e);
return;
}

View File

@ -36,8 +36,10 @@ function HostList(options) {
this.resolve = dns.resolve;
this.banTime = common.BAN_TIME;
this.rawSeeds = this.network.seeds;
this.rawNodes = [];
this.seeds = [];
this.nodes = [];
this.banned = {};
this.map = {};
@ -103,6 +105,11 @@ HostList.prototype._initOptions = function initOptions(options) {
assert(Array.isArray(options.seeds));
this.rawSeeds = options.seeds;
}
if (options.nodes) {
assert(Array.isArray(options.nodes));
this.setNodes(options.nodes);
}
};
/**
@ -665,12 +672,40 @@ HostList.prototype.setSeeds = function setSeeds(seeds) {
/**
* Add a preferred seed.
* @param {String} hostname
* @param {String} host
*/
HostList.prototype.addSeed = function addSeed(host) {
var addr = IP.parseHost(host, this.network.port);
return this.seeds.push(addr);
this.seeds.push(addr);
return addr;
};
/**
* Set priority nodes.
* @param {String[]} nodes
*/
HostList.prototype.setNodes = function setNodes(nodes) {
var i, node;
this.rawNodes.length = 0;
for (i = 0; i < nodes.length; i++) {
node = nodes[i];
this.addNode(node);
}
};
/**
* Add a priority node.
* @param {String} host
*/
HostList.prototype.addNode = function addNode(host) {
var addr = IP.parseHost(host, this.network.port);
this.rawNodes.push(addr);
return addr;
};
/**
@ -680,7 +715,12 @@ HostList.prototype.addSeed = function addSeed(host) {
HostList.prototype.discover = co(function* discover() {
var jobs = [];
var i, seed;
var i, node, seed;
for (i = 0; i < this.rawNodes.length; i++) {
node = this.rawNodes[i];
jobs.push(this.lookupNode(node));
}
for (i = 0; i < this.seeds.length; i++) {
seed = this.seeds[i];
@ -690,6 +730,22 @@ HostList.prototype.discover = co(function* discover() {
yield Promise.all(jobs);
});
/**
* Lookup node's domain.
* @param {Object} addr
* @returns {Promise}
*/
HostList.prototype.lookupNode = co(function* lookupNode(addr) {
var addrs = yield this.lookup(addr);
if (addrs.length === 0)
return;
this.nodes.push(addrs[0]);
this.add(addrs[0]);
});
/**
* Populate from seed.
* @param {Object} seed
@ -697,30 +753,49 @@ HostList.prototype.discover = co(function* discover() {
*/
HostList.prototype.populate = co(function* populate(seed) {
var addrs = yield this.lookup(seed);
var i, addr;
for (i = 0; i < addrs.length; i++) {
addr = addrs[i];
this.add(addr);
}
});
/**
* Lookup hosts from dns host.
* @param {Object} target
* @returns {Promise}
*/
HostList.prototype.lookup = co(function* lookup(target) {
var addrs = [];
var i, addr, hosts, host;
if (seed.version !== -1) {
addr = NetAddress.fromHost(seed.host, seed.port, this.network);
this.add(addr);
return;
if (target.version !== -1) {
addr = NetAddress.fromHost(target.host, target.port, this.network);
addrs.push(addr);
return addrs;
}
if (this.logger)
this.logger.info('Resolving hosts from seed: %s.', seed.host);
this.logger.info('Resolving host: %s.', target.host);
try {
hosts = yield this.resolve(seed.host, this.proxyServer);
hosts = yield this.resolve(target.host, this.proxyServer);
} catch (e) {
if (this.logger)
this.logger.error(e);
return;
return addrs;
}
for (i = 0; i < hosts.length; i++) {
host = hosts[i];
addr = NetAddress.fromHost(host, seed.port, this.network);
this.add(addr);
addr = NetAddress.fromHost(host, target.port, this.network);
addrs.push(addr);
}
return addrs;
});
/**

View File

@ -1295,6 +1295,15 @@ Pool.prototype.getHost = function getHost(unique) {
var now = this.network.now();
var i, entry, addr;
for (i = 0; i < this.hosts.nodes.length; i++) {
addr = this.hosts.nodes[i];
if (this.peers.has(addr.hostname))
continue;
return addr;
}
for (i = 0; i < 100; i++) {
entry = this.hosts.getHost();
@ -1929,7 +1938,7 @@ function PoolOptions(options) {
this.feeRate = -1;
this.noDiscovery = false;
this.seeds = this.network.seeds;
this.preferredSeed = null;
this.nodes = [];
this.invTimeout = 60000;
this.services = common.LOCAL_SERVICES;
this.requiredServices = common.REQUIRED_SERVICES;
@ -2116,9 +2125,9 @@ PoolOptions.prototype.fromOptions = function fromOptions(options) {
this.seeds = options.seeds;
}
if (options.preferredSeed) {
assert(typeof options.preferredSeed === 'string');
this.seeds = [options.preferredSeed];
if (options.nodes) {
assert(Array.isArray(options.nodes));
this.nodes = options.nodes;
}
if (options.invTimeout != null) {

View File

@ -28,10 +28,12 @@ function config(options) {
config.alias = {
conf: {},
env: {
'seed': 'preferredseed'
'seed': 'seeds',
'node': 'nodes'
},
arg: {
'seed': 'preferredseed',
'seed': 'seeds',
'node': 'nodes',
'n': 'network'
}
};
@ -192,7 +194,8 @@ config.parseData = function parseData(data, prefix, dirname) {
options.bip150 = bool(data.bip150);
options.identityKey = key(data.identitykey);
options.proxyServer = str(data.proxyserver);
options.preferredSeed = str(data.preferredseed);
options.seeds = list(data.seeds);
options.nodes = list(data.nodes);
options.maxOutbound = num(data.maxoutbound);
options.maxInbound = num(data.maxinbound);
options.noDiscovery = bool(data.nodiscovery);
@ -635,6 +638,16 @@ function str(value) {
return value;
}
function list(value) {
if (!value)
return null;
if (typeof value !== 'string')
return null;
return value.trim().split(/\s*,\s*/);
}
function key(value) {
var key;

View File

@ -113,7 +113,8 @@ function FullNode(options) {
maxOutbound: this.options.maxOutbound,
maxInbound: this.options.maxInbound,
proxyServer: this.options.proxyServer,
preferredSeed: this.options.preferredSeed,
seeds: this.options.seeds,
nodes: this.options.nodes,
noDiscovery: this.options.noDiscovery,
port: this.options.port,
listen: this.options.listen

View File

@ -64,7 +64,8 @@ function SPVNode(options) {
chain: this.chain,
witness: this.options.witness,
proxyServer: this.options.proxyServer,
preferredSeed: this.options.preferredSeed,
seeds: this.options.seeds,
nodes: this.options.nodes,
bip151: this.options.bip151,
bip150: this.options.bip150,
authPeers: this.options.authPeers,