|
|
@ -14,22 +14,25 @@ function spec() { |
|
|
|
|
|
|
|
|
|
|
|
PeerSync.prototype.init = function(config, cb) { |
|
|
|
|
|
|
|
if (!config) config = {}; |
|
|
|
var that = this; |
|
|
|
|
|
|
|
var network = config && (config.network || 'testnet'); |
|
|
|
|
|
|
|
that.peerdb = undefined; |
|
|
|
that.sync = new Sync({ |
|
|
|
this.verbose = config.verbose; |
|
|
|
this.peerdb = undefined; |
|
|
|
this.sync = new Sync({ |
|
|
|
networkName: network |
|
|
|
}); |
|
|
|
that.sync.init(config, function() { |
|
|
|
that.PeerManager = require('bitcore/PeerManager').createClass({ |
|
|
|
config: { |
|
|
|
network: network |
|
|
|
} |
|
|
|
}); |
|
|
|
that.load_peers(); |
|
|
|
|
|
|
|
this.PeerManager = require('bitcore/PeerManager').createClass({ |
|
|
|
config: { |
|
|
|
network: network |
|
|
|
} |
|
|
|
}); |
|
|
|
this.peerman = new this.PeerManager(); |
|
|
|
this.load_peers(); |
|
|
|
this.sync.init(config, function() { |
|
|
|
return cb(); |
|
|
|
}); |
|
|
|
}; |
|
|
@ -50,9 +53,12 @@ function spec() { |
|
|
|
}; |
|
|
|
|
|
|
|
PeerSync.prototype.handle_inv = function(info) { |
|
|
|
var self = this; |
|
|
|
var invs = info.message.invs; |
|
|
|
invs.forEach(function(inv) { |
|
|
|
console.log('[p2p_sync] Handle inv for a ' + CoinConst.MSG.to_str(inv.type)); |
|
|
|
if (self.verbose) { |
|
|
|
console.log('[p2p_sync] Handle inv for a ' + CoinConst.MSG.to_str(inv.type)); |
|
|
|
} |
|
|
|
}); |
|
|
|
// TODO: should limit the invs to objects we haven't seen yet
|
|
|
|
info.conn.sendGetData(invs); |
|
|
@ -60,19 +66,22 @@ function spec() { |
|
|
|
|
|
|
|
PeerSync.prototype.handle_tx = function(info) { |
|
|
|
var tx = info.message.tx.getStandardizedObject(); |
|
|
|
console.log('[p2p_sync] Handle tx: ' + tx.hash); |
|
|
|
if (this.verbose) { |
|
|
|
console.log('[p2p_sync] Handle tx: ' + tx.hash); |
|
|
|
} |
|
|
|
this.sync.storeTxs([tx.hash], null, function(err) { |
|
|
|
if (err) { |
|
|
|
console.log('[p2p_sync] Error in handle TX: ' + err); |
|
|
|
console.log('[p2p_sync] Error in handle TX: ' + JSON.stringify(err)); |
|
|
|
} |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
PeerSync.prototype.handle_block = function(info) { |
|
|
|
var self = this; |
|
|
|
var block = info.message.block; |
|
|
|
var blockHash = coinUtil.formatHashFull(block.calcHash()); |
|
|
|
console.log('[p2p_sync] Handle block: ' + blockHash); |
|
|
|
if (this.verbose) { |
|
|
|
console.log('[p2p_sync] Handle block: ' + blockHash); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var tx_hashes = block.txs.map(function(tx) { |
|
|
@ -94,26 +103,27 @@ function spec() { |
|
|
|
PeerSync.prototype.handle_connected = function(data) { |
|
|
|
var peerman = data.pm; |
|
|
|
var peers_n = peerman.peers.length; |
|
|
|
console.log('[p2p_sync] Connected to ' + peers_n + ' peer' + (peers_n !== 1 ? 's': '')); |
|
|
|
if (this.verbose) { |
|
|
|
console.log('[p2p_sync] Connected to ' + peers_n + ' peer' + (peers_n !== 1 ? 's': '')); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
PeerSync.prototype.run = function() { |
|
|
|
var self = this; |
|
|
|
var peerman = new this.PeerManager(); |
|
|
|
|
|
|
|
this.peerdb.forEach(function(datum) { |
|
|
|
var peer = new Peer(datum.ipv4, datum.port); |
|
|
|
peerman.addPeer(peer); |
|
|
|
self.peerman.addPeer(peer); |
|
|
|
}); |
|
|
|
|
|
|
|
peerman.on('connection', function(conn) { |
|
|
|
this.peerman.on('connection', function(conn) { |
|
|
|
conn.on('inv', self.handle_inv.bind(self)); |
|
|
|
conn.on('block', self.handle_block.bind(self)); |
|
|
|
conn.on('tx', self.handle_tx.bind(self)); |
|
|
|
}); |
|
|
|
peerman.on('connect', self.handle_connected.bind(self)); |
|
|
|
this.peerman.on('connect', self.handle_connected.bind(self)); |
|
|
|
|
|
|
|
peerman.start(); |
|
|
|
this.peerman.start(); |
|
|
|
}; |
|
|
|
|
|
|
|
PeerSync.prototype.close = function() { |
|
|
|