Merge pull request #5 from maraoz/feature/prototype-p2p

p2p handling of inv for blocks and transactions
This commit is contained in:
Matias Alejo Garcia 2014-01-09 08:38:42 -08:00
commit e1f958345e
2 changed files with 38 additions and 23 deletions

View File

@ -38,7 +38,7 @@ function ClassSpec(b) {
assert.equal(this.byHeight[0].toString(),
this.network.genesisBlock.hash.toString());
loc.push(this.byHeight[0]);
console.log("Requesting more headers. Current height: " + block.height );
//console.log('Requesting more headers. Current height: ' + block.height );
return loc;
};
@ -49,7 +49,7 @@ function ClassSpec(b) {
if (hash in this.blocks) {
var old = this.blocks[hash];
throw new Error("duplicate block (was at height " + old.height + ")");
throw new Error('duplicate block (was at height ' + old.height + ')');
}
var bestChain = false;
@ -63,7 +63,7 @@ function ClassSpec(b) {
if (this.cached_size == 0) {
if (this.network.genesisBlock.hash.toString() !=
hash.toString())
throw new Error("Invalid genesis block");
throw new Error('Invalid genesis block');
block.height = 0;
block.work = curWork;
@ -72,7 +72,7 @@ function ClassSpec(b) {
} else {
var prevBlock = this.blocks[block.prev_hash];
if (!prevBlock)
throw new Error("orphan block; prev not found");
throw new Error('orphan block; prev not found');
block.height = prevBlock.height + 1;
block.work = prevBlock.work + curWork;
@ -169,7 +169,7 @@ function ClassSpec(b) {
var fd = fs.openSync(filename, 'r');
var stats = fs.fstatSync(fd);
if (stats.size % 80 != 0)
throw new Error("Corrupted header db");
throw new Error('Corrupted header db');
while (1) {
var buf = new Buffer(80);
@ -180,7 +180,7 @@ function ClassSpec(b) {
this.addBuf(buf);
if ( ! ( this.cached_size % 1000 )) {
console.log("\tblock..." + this.cached_size ) ;
console.log('\tblock...' + this.cached_size ) ;
}
}

49
p2p.js
View File

@ -1,3 +1,5 @@
'use strict';
var fs = require('fs');
var HeaderDB = require('./HeaderDB').class();
var Block = require('bitcore/Block').class();
@ -19,8 +21,6 @@ var PeerManager = require('bitcore/PeerManager').createClass({
});
var Peer = require('bitcore/Peer').class();
var syncState = 'init';
function peerdb_load() {
try {
peerdb = JSON.parse(fs.readFileSync(peerdb_fn));
@ -57,8 +57,7 @@ function add_header(info, block) {
}
function handle_headers(info) {
console.log("handle headers");
var conn = info.conn;
console.log('handle headers');
var headers = info.message.headers;
headers.forEach(function(hdr) {
@ -72,16 +71,6 @@ function handle_headers(info) {
get_more_headers(info);
}
function handle_block(info) {
console.log("handle block")
var block = info.message.block;
add_header(info, block);
if (syncState === 'init') {
syncState = 'headers';
get_more_headers(info);
}
}
function handle_verack(info) {
var inv = {
@ -89,17 +78,41 @@ function handle_verack(info) {
hash : network.genesisBlock.hash,
};
var invs = [ inv ];
console.log('p2psync: Asking for the genesis block');
// Asks for the genesis block
// console.log('p2psync: Asking for the genesis block');
// info.conn.sendGetData(invs);
}
function handle_inv(info) {
console.log('handle inv');
// TODO: should limit the invs to objects we haven't seen yet
var invs = info.message.invs;
invs.forEach(function(inv) {
console.log('Received inv for a '+CoinConst.MSG.to_str(inv.type));
}
);
console.log('requesting getData');
info.conn.sendGetData(invs);
}
function handle_tx(info) {
var tx = info.message.tx.getStandardizedObject();
console.log('handle tx: '+JSON.stringify(tx));
}
function handle_block(info) {
console.log('handle block');
var block = info.message.block;
add_header(info, block);
}
function handle_connected(data) {
var peerman = data.pm;
var peers_n = peerman.peers.length;
console.log('p2psync: Connected to ' + peers_n + ' peer'
+ (peers_n != 1 ? 's' : ''));
console.log('p2psync: Connected to ' + peers_n + ' peer' + (peers_n !== 1 ? 's' : ''));
}
function p2psync() {
@ -114,6 +127,8 @@ function p2psync() {
conn.on('verack', handle_verack);
conn.on('block', handle_block);
conn.on('headers', handle_headers);
conn.on('inv', handle_inv);
conn.on('tx', handle_tx);
});
peerman.on('connect', handle_connected);