add data and tests for getheaders

This commit is contained in:
Manuel Araoz 2015-02-02 18:22:30 -03:00
parent e4741dc96e
commit e5fb2bba31
4 changed files with 54 additions and 23 deletions

View File

@ -26,6 +26,10 @@ var blockHash = {
'livenet': '000000000000000013413cf2536b491bf0988f52e90c476ffeb701c8bfdb1db9', 'livenet': '000000000000000013413cf2536b491bf0988f52e90c476ffeb701c8bfdb1db9',
'testnet': '0000000058cc069d964711cd25083c0a709f4df2b34c8ff9302ce71fe5b45786' 'testnet': '0000000058cc069d964711cd25083c0a709f4df2b34c8ff9302ce71fe5b45786'
}; };
var stopBlock = {
'livenet': '000000000000000006181d9d183e2191a5e704d6ed3513f29b0970198fb34d2e',
'testnet': '000000003d594c41db49d5a8b850344943438620acf79ce8aa88177f5b35e337'
};
var txHash = { var txHash = {
'livenet': '22231e8219a0617a0ded618b5dc713fdf9b0db8ebd5bb3322d3011a703119d3b', 'livenet': '22231e8219a0617a0ded618b5dc713fdf9b0db8ebd5bb3322d3011a703119d3b',
'testnet': '22231e8219a0617a0ded618b5dc713fdf9b0db8ebd5bb3322d3011a703119d3b' 'testnet': '22231e8219a0617a0ded618b5dc713fdf9b0db8ebd5bb3322d3011a703119d3b'
@ -152,4 +156,32 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
peer.sendMessage(message); peer.sendMessage(message);
}); });
}); });
var from = [blockHash[network.name]];
var stop = stopBlock[network.name];
it('can get headers', function(cb) {
connect(function(peer) {
peer.once('headers', function(message) {
(message instanceof Messages.Headers).should.equal(true);
message.headers.length.should.equal(2);
cb();
});
var message = new Messages.GetHeaders(from, stop);
peer.sendMessage(message);
});
});
it.skip('can get blocks', function(cb) {
connect(function(peer) {
peer.on('inv', function(message) {
(message instanceof Messages.Inventory).should.equal(true);
console.log('inv' + message.inventory.length);
if (message.inventory.length === 2) {
console.log(message);
message.inventory[0].type.should.equal(Messages.Inventory.TYPE.BLOCK);
cb();
}
});
var message = new Messages.GetBlocks(from, stop);
peer.sendMessage(message);
});
});
}); });

View File

@ -601,7 +601,7 @@ Headers.prototype.fromBuffer = function(payload) {
this.headers = []; this.headers = [];
for (var i = 0; i < count; i++) { for (var i = 0; i < count; i++) {
var header = BlockHeaderModel._fromBufferReader(parser); var header = BlockHeaderModel.fromBufferReader(parser);
this.headers.push(header); this.headers.push(header);
} }
@ -613,7 +613,9 @@ Headers.prototype.getPayload = function() {
put.varint(this.headers.length); put.varint(this.headers.length);
for (var i = 0; i < this.headers.length; i++) { for (var i = 0; i < this.headers.length; i++) {
var buffer = this.headers[i].toBuffer(); var buffer = this
.headers[i]
.toBuffer();
put.put(buffer); put.put(buffer);
} }
@ -685,24 +687,35 @@ module.exports.Transaction = Message.COMMANDS.tx = Transaction;
* hashes. * hashes.
* *
* @name P2P.Message.GetBlocks * @name P2P.Message.GetBlocks
* @param{Array} starts - array of buffers with the starting block hashes * @param{Array} starts - array of buffers or strings with the starting block hashes
* @param{Buffer} [stop] - hash of the last block * @param{Buffer} [stop] - hash of the last block
*/ */
function GetBlocks(starts, stop) { function GetBlocks(starts, stop) {
$.checkArgument(_.isUndefined(starts) || _.isArray(starts));
this.command = 'getblocks'; this.command = 'getblocks';
/** /**
* @type {number} * @type {number}
*/ */
this.version = PROTOCOL_VERSION; this.version = PROTOCOL_VERSION;
starts = starts ? starts.map(function(hash) {
return _.isString(hash) ? BufferUtil.reverse(new Buffer(hash, 'hex')) : hash;
}) : undefined;
/** /**
* @type {Array.Buffer} * @type {Array.Buffer}
*/ */
this.starts = starts || []; this.starts = starts || [];
for (var i = 0; i < this.starts.length; i++) {
if (this.starts[i].length !== 32) {
throw new Error('Invalid hash ' + i + ' length: ' + this.starts[i].length);
}
}
/** /**
* @type {Array.Buffer} * @type {Array.Buffer}
* @desc Hashes to limit the amount of blocks to be sent * @desc Hashes to limit the amount of blocks to be sent
*/ */
this.stop = stop || BufferUtil.NULL_HASH; this.stop = (_.isString(stop) ? BufferUtil.reverse(new Buffer(stop, 'hex')) : stop) || BufferUtil.NULL_HASH;
} }
util.inherits(GetBlocks, Message); util.inherits(GetBlocks, Message);
@ -727,14 +740,11 @@ GetBlocks.prototype.getPayload = function() {
put.varint(this.starts.length); put.varint(this.starts.length);
for (var i = 0; i < this.starts.length; i++) { for (var i = 0; i < this.starts.length; i++) {
if (this.starts[i].length !== 32) {
throw new Error('Invalid hash length');
}
put.put(this.starts[i]); put.put(this.starts[i]);
} }
if (this.stop.length !== 32) { if (this.stop.length !== 32) {
throw new Error('Invalid hash length'); throw new Error('Invalid hash length: ' + this.stop.length);
} }
put.put(this.stop); put.put(this.stop);
@ -751,19 +761,8 @@ module.exports.GetBlocks = Message.COMMANDS.getblocks = GetBlocks;
* @param{Buffer} [stop] - hash of the last block * @param{Buffer} [stop] - hash of the last block
*/ */
function GetHeaders(starts, stop) { function GetHeaders(starts, stop) {
GetBlocks.call(this, starts, stop);
this.command = 'getheaders'; this.command = 'getheaders';
/**
* @type {number}
*/
this.version = PROTOCOL_VERSION;
/**
* @type {Array.Buffer}
*/
this.starts = starts || [];
/**
* @type {Array.Buffer}
*/
this.stop = stop || BufferUtil.NULL_HASH;
} }
util.inherits(GetHeaders, GetBlocks); util.inherits(GetHeaders, GetBlocks);

View File

@ -32,8 +32,8 @@
"payload": "" "payload": ""
}, },
"HEADERS": { "HEADERS": {
"message": "", "message": "f9beb4d9686561646572730000000000a1000000ffd6770b0202000000b91ddbbfc801b7fe6f470ce9528f98f01b496b53f23c411300000000000000004901c9d18d0a468b20cc62ddf75aee58cf410440ea390300bf7a5f6848be350508d4cb54c0a31a18b9f661ec0002000000a02d6472e3e6fc9a1cebeaad14a90208a715e2bd234ea00600000000000000006f596f650fbbd5478489c66d651c9e3ea56f394d1f1481f90975cf0c8dda45fd3ad4cb54c0a31a1872e262",
"payload": "" "payload": "0202000000b91ddbbfc801b7fe6f470ce9528f98f01b496b53f23c411300000000000000004901c9d18d0a468b20cc62ddf75aee58cf410440ea390300bf7a5f6848be350508d4cb54c0a31a18b9f661ec0002000000a02d6472e3e6fc9a1cebeaad14a90208a715e2bd234ea00600000000000000006f596f650fbbd5478489c66d651c9e3ea56f394d1f1481f90975cf0c8dda45fd3ad4cb54c0a31a1872e262"
}, },
"TX": { "TX": {
"message": "", "message": "",

View File

@ -31,7 +31,7 @@ describe('Messages', function() {
NotFound: 'notfound' NotFound: 'notfound'
}; };
// TODO: add data for these // TODO: add data for these
var noPayload = ['Alert', 'Reject', 'GetBlocks', 'GetHeaders', 'GetData', 'Headers']; var noPayload = ['Alert', 'Reject', 'GetBlocks', 'GetHeaders', 'GetData'];
var names = Object.keys(commands); var names = Object.keys(commands);
describe('named', function() { describe('named', function() {
names.forEach(function(name) { names.forEach(function(name) {