Skip to content

Commit

Permalink
add support for peer discovery to PeerManager and example of usage to…
Browse files Browse the repository at this point in the history
… examples/
  • Loading branch information
Gordon Hall committed Apr 19, 2014
1 parent 6e8589e commit ba8542d
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 2 deletions.
57 changes: 57 additions & 0 deletions PeerManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,61 @@ PeerManager.prototype.getActiveConnections = function () {
return this.connections.slice(0);
};

PeerManager.prototype.discoverPeers = function(callback) {
var self = this;
var async = imports.async || require('async');
var dns = imports.dns || require('dns');
var networks = imports.networks || require('./networks')[this.config.network];
var seeds = networks.dnsSeeds;

// keep track of tried seeds and results
self.seeds = {
resolved: [],
failed: [],
results: {}
};

var dnsExecutor = seeds.map(function(seed) {
return function(done) {
// have we already resolved this seed?
if (~self.seeds.resolved.indexOf(seed)) {
// if so, just pass back cached peer list
return done(null, self.seeds.results[seed]);
}
// has this seed failed to resolve?
if (~self.seeds.resolved.indexOf(seed)) {
// if so, pass back empty results
return done(null, []);
}
// otherwise resolve the dns seed to get some peers
dns.resolve(seed, function(err, peers) {
if (err) {
self.seeds.failed.push(seed);
return done(null, []);
}
self.seeds.resolved.push(seed);
self.seeds.results[seed] = peers;
return done(null, peers);
});
};
});

// try resolving all seeds
async.parallel(dnsExecutor, function(err, results) {
var peers = [];

// consolidate all resolved peers into one list
results.forEach(function(peerlist) {
peers = peers.concat(peerlist);
});

// transform that list into a list of Peer instances
peers = peers.map(function(ip) {
return new Peer(ip, networks.defaultClientPort);
});

callback(null, peers);
});
};

module.exports = require('soop')(PeerManager);
15 changes: 15 additions & 0 deletions examples/PeerDiscovery.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
var PeerManager = require('../PeerManager');
var peerman = new PeerManager();

peerman.discoverPeers(function(err, peers) {
// we get an array of peer instances
console.log(peers);
// the peer manager caches the tried seeds and any results
console.log(peerman.seeds);
// we can use this array of peers to add to the manager
peers.forEach(function(p) {
peerman.addPeer(p);
});
// then we can start the manager
peerman.start();
});
18 changes: 16 additions & 2 deletions networks.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,16 @@ exports.livenet = {
prev_hash: buffertools.fill(new Buffer(32), 0),
timestamp: 1231006505,
bits: 486604799,
}
},
dnsSeeds: [
'seed.bitcoin.sipa.be',
'dnsseed.bluematt.me',
'dnsseed.bitcoin.dashjr.org',
'seed.bitcoinstats.com',
'seed.bitnodes.io',
'bitseed.xf2.org'
],
defaultClientPort: 8333
};

exports.testnet = {
Expand All @@ -39,5 +48,10 @@ exports.testnet = {
prev_hash: buffertools.fill(new Buffer(32), 0),
timestamp: 1296688602,
bits: 486604799,
}
},
dnsSeeds: [
'testnet-seed.bitcoin.petertodd.org',
'testnet-seed.bluematt.me'
],
defaultClientPort: 18333
};

0 comments on commit ba8542d

Please sign in to comment.