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

72 lines
1.9 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 BlockHeader = bitcore.BlockHeader;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
/**
* Sent in response to a `getheaders` message. It contains information about
* block headers.
*
* @param{Array} blockheaders - array of block headers
*/
function HeadersMessage(options) {
if (!(this instanceof HeadersMessage)) {
return new HeadersMessage(options);
}
if(!options) {
options = {};
}
Message.call(this, options);
this.magicNumber = magicNumber;
this.command = 'headers';
this.headers = options.headers;
};
inherits(HeadersMessage, Message);
HeadersMessage.fromObject = function(options) {
return new HeadersMessage(options);
};
HeadersMessage.fromBuffer = function(payload) {
var obj = {};
$.checkArgument(payload && payload.length > 0, 'No data found to create Headers message');
var parser = new BufferReader(payload);
var count = parser.readVarintNum();
obj.headers = [];
for (var i = 0; i < count; i++) {
var header = BlockHeader.fromBufferReader(parser);
obj.headers.push(header);
var txn_count = parser.readUInt8();
$.checkState(txn_count === 0, 'txn_count should always be 0');
}
utils.checkFinished(parser);
return HeadersMessage.fromObject(obj);
};
HeadersMessage.prototype.getPayload = function() {
var bw = new BufferWriter();
bw.writeVarintNum(this.headers.length);
for (var i = 0; i < this.headers.length; i++) {
var buffer = this.headers[i].toBuffer();
bw.write(buffer);
bw.writeUInt8(0);
}
return bw.concat();
};
module.exports = function(options) {
magicNumber = options.magicNumber || magicNumber;
return HeadersMessage;
};