flocore-p2p/lib/messages/commands/getheaders.js

79 lines
2.1 KiB
JavaScript

'use strict';
var Message = require('../message');
var inherits = require('util').inherits;
var bitcore = require('bitcore');
var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter;
var $ = bitcore.util.preconditions;
var protocolVersion = 70000;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
/**
* Request block headers starting from a hash
*
* @param{Array} starts - array of buffers with the starting block hashes
* @param{Buffer} [stop] - hash of the last block
*/
function GetheadersMessage(options) {
if (!(this instanceof GetheadersMessage)) {
return new GetheadersMessage(options);
}
if(!options) {
options = {};
}
Message.call(this, options);
this.command = 'getheaders';
this.version = protocolVersion;
this.magicNumber = magicNumber;
options = utils.sanitizeStartStop(options);
this.starts = options.starts;
this.stop = options.stop;
}
inherits(GetheadersMessage, Message);
GetheadersMessage.fromObject = function(obj) {
return new GetheadersMessage(obj);
};
GetheadersMessage.fromBuffer = function(payload) {
var obj = {};
var parser = new BufferReader(payload);
$.checkArgument(!parser.finished(), 'No data received in payload');
obj.version = parser.readUInt32LE();
var startCount = Math.min(parser.readVarintNum(), 500);
obj.starts = [];
for (var i = 0; i < startCount; i++) {
obj.starts.push(parser.read(32));
}
obj.stop = parser.read(32);
utils.checkFinished(parser);
return GetheadersMessage.fromObject(obj);
};
GetheadersMessage.prototype.getPayload = function() {
var bw = new BufferWriter();
bw.writeUInt32LE(this.version);
bw.writeVarintNum(this.starts.length);
for (var i = 0; i < this.starts.length; i++) {
bw.write(this.starts[i]);
}
if (this.stop.length !== 32) {
throw new Error('Invalid hash length: ' + this.stop.length);
}
bw.write(this.stop);
return bw.concat();
};
module.exports = function(options) {
protocolVersion = options.protocolVersion || protocolVersion;
magicNumber = options.magicNumber || magicNumber;
return GetheadersMessage;
};