Merge pull request #60 from braydonf/bug/magicnumber
Messages Magic Number Reference
This commit is contained in:
commit
da52b73796
@ -122,7 +122,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
|
|||||||
hash: new Buffer(Random.getRandomBuffer(32)) // needs to be random for repeatability
|
hash: new Buffer(Random.getRandomBuffer(32)) // needs to be random for repeatability
|
||||||
}];
|
}];
|
||||||
peer.once('getdata', function(message) {
|
peer.once('getdata', function(message) {
|
||||||
message.inventory.should.deep.equal(inv);
|
message.inventory[0].should.deep.equal(inv[0]);
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
var message = messages.Inventory(inv);
|
var message = messages.Inventory(inv);
|
||||||
@ -145,7 +145,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
|
|||||||
connect(function(peer) {
|
connect(function(peer) {
|
||||||
var expected = messages.NotFound.forTransaction(fakeHash);
|
var expected = messages.NotFound.forTransaction(fakeHash);
|
||||||
peer.once('notfound', function(message) {
|
peer.once('notfound', function(message) {
|
||||||
(message instanceof messages.NotFound).should.equal(true);
|
message.command.should.equal('notfound');
|
||||||
message.inventory[0].type.should.equal(Inventory.TYPE.TX);
|
message.inventory[0].type.should.equal(Inventory.TYPE.TX);
|
||||||
var expectedHash = expected.inventory[0].hash.toString('hex');
|
var expectedHash = expected.inventory[0].hash.toString('hex');
|
||||||
message.inventory[0].hash.toString('hex').should.equal(expectedHash);
|
message.inventory[0].hash.toString('hex').should.equal(expectedHash);
|
||||||
@ -160,7 +160,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
|
|||||||
it('gets headers', function(cb) {
|
it('gets headers', function(cb) {
|
||||||
connect(function(peer) {
|
connect(function(peer) {
|
||||||
peer.once('headers', function(message) {
|
peer.once('headers', function(message) {
|
||||||
(message instanceof messages.Headers).should.equal(true);
|
message.command.should.equal('headers');
|
||||||
message.headers.length.should.equal(3);
|
message.headers.length.should.equal(3);
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -63,9 +63,33 @@ function builder(options) {
|
|||||||
commands: {}
|
commands: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
for (var key in exported.commandsMap) {
|
Object.keys(exported.commandsMap).forEach(function(key) {
|
||||||
exported.commands[key] = require('./commands/' + key)(options);
|
|
||||||
}
|
var Command = require('./commands/' + key);
|
||||||
|
|
||||||
|
exported.commands[key] = function(obj) {
|
||||||
|
if (!obj) {
|
||||||
|
obj = {};
|
||||||
|
}
|
||||||
|
// pass factory options
|
||||||
|
obj.Block = options.Block;
|
||||||
|
obj.BlockHeader = options.BlockHeader;
|
||||||
|
obj.Transaction = options.Transaction;
|
||||||
|
obj.MerkleBlock = options.MerkleBlock;
|
||||||
|
obj.magicNumber = options.magicNumber;
|
||||||
|
obj.version = options.protocolVersion;
|
||||||
|
return new Command(obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
exported.commands[key]._constructor = Command;
|
||||||
|
|
||||||
|
exported.commands[key].fromBuffer = function(buffer) {
|
||||||
|
var message = exported.commands[key]();
|
||||||
|
message.setPayload(buffer);
|
||||||
|
return message;
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
exported.inventoryCommands.forEach(function(command) {
|
exported.inventoryCommands.forEach(function(command) {
|
||||||
|
|
||||||
|
|||||||
@ -7,46 +7,37 @@ var utils = require('../utils');
|
|||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Array=} options.addresses - An array of addrs
|
* @param {Array=} options.addresses - An array of addrs
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function AddrMessage(options) {
|
function AddrMessage(options) {
|
||||||
if (!(this instanceof AddrMessage)) {
|
|
||||||
return new AddrMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'addr';
|
this.command = 'addr';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.addresses = options.addresses;
|
this.addresses = options.addresses;
|
||||||
}
|
}
|
||||||
inherits(AddrMessage, Message);
|
inherits(AddrMessage, Message);
|
||||||
|
|
||||||
AddrMessage.fromBuffer = function(payload) {
|
AddrMessage.prototype.setPayload = function(payload) {
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
|
|
||||||
var addrCount = parser.readVarintNum();
|
var addrCount = parser.readVarintNum();
|
||||||
|
|
||||||
var obj = {};
|
this.addresses = [];
|
||||||
obj.addresses = [];
|
|
||||||
for (var i = 0; i < addrCount; i++) {
|
for (var i = 0; i < addrCount; i++) {
|
||||||
// todo: time only available on versions >=31402
|
// todo: time only available on versions >=31402
|
||||||
var time = new Date(parser.readUInt32LE() * 1000);
|
var time = new Date(parser.readUInt32LE() * 1000);
|
||||||
|
|
||||||
var addr = utils.parseAddr(parser);
|
var addr = utils.parseAddr(parser);
|
||||||
addr.time = time;
|
addr.time = time;
|
||||||
obj.addresses.push(addr);
|
this.addresses.push(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new AddrMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
AddrMessage.prototype.getPayload = function() {
|
AddrMessage.prototype.getPayload = function() {
|
||||||
@ -62,7 +53,4 @@ AddrMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = AddrMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return AddrMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -7,24 +7,17 @@ var utils = require('../utils');
|
|||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Buffer=} options.payload
|
* @param {Buffer=} options.payload
|
||||||
* @param {Buffer=} options.signature
|
* @param {Buffer=} options.signature
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function AlertMessage(options) {
|
function AlertMessage(options) {
|
||||||
if (!(this instanceof AlertMessage)) {
|
|
||||||
return new AlertMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'alert';
|
this.command = 'alert';
|
||||||
|
|
||||||
this.payload = options.payload || new Buffer(32);
|
this.payload = options.payload || new Buffer(32);
|
||||||
@ -32,13 +25,11 @@ function AlertMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(AlertMessage, Message);
|
inherits(AlertMessage, Message);
|
||||||
|
|
||||||
AlertMessage.fromBuffer = function(payload) {
|
AlertMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
obj.payload = parser.readVarLengthBuffer();
|
this.payload = parser.readVarLengthBuffer();
|
||||||
obj.signature = parser.readVarLengthBuffer();
|
this.signature = parser.readVarLengthBuffer();
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new AlertMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
AlertMessage.prototype.getPayload = function() {
|
AlertMessage.prototype.getPayload = function() {
|
||||||
@ -52,7 +43,4 @@ AlertMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = AlertMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return AlertMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -2,30 +2,23 @@
|
|||||||
|
|
||||||
var Message = require('../message');
|
var Message = require('../message');
|
||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var bitcore = require('bitcore');
|
|
||||||
|
|
||||||
var Block = bitcore.Block;
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object|Block=} options - If is an instance of Block will use as options.block
|
* @param {Object|Block=} options - If is an instance of Block will use as options.block
|
||||||
* @param {Block=} options.block - An instance of a Block
|
* @param {Block=} options.block - An instance of a Block
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
|
* @param {Function} options.Block - A block constructor
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function BlockMessage(options) {
|
function BlockMessage(options) {
|
||||||
if (!(this instanceof BlockMessage)) {
|
|
||||||
return new BlockMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
|
this.Block = options.Block;
|
||||||
this.command = 'block';
|
this.command = 'block';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
|
||||||
var block;
|
var block;
|
||||||
if (options instanceof Block) {
|
if (options instanceof this.Block) {
|
||||||
block = options;
|
block = options;
|
||||||
} else {
|
} else {
|
||||||
block = options.block;
|
block = options.block;
|
||||||
@ -35,17 +28,12 @@ function BlockMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(BlockMessage, Message);
|
inherits(BlockMessage, Message);
|
||||||
|
|
||||||
BlockMessage.fromBuffer = function(payload) {
|
BlockMessage.prototype.setPayload = function(payload) {
|
||||||
var block = Block.fromBuffer(payload);
|
this.block = this.Block.fromBuffer(payload);
|
||||||
return new BlockMessage({block: block});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockMessage.prototype.getPayload = function() {
|
BlockMessage.prototype.getPayload = function() {
|
||||||
return this.block.toBuffer();
|
return this.block.toBuffer();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = BlockMessage;
|
||||||
Block = options.Block || Block;
|
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return BlockMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -9,36 +9,27 @@ var BufferWriter = bitcore.encoding.BufferWriter;
|
|||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request peer to add data to a bloom filter already set by 'filterload'
|
* Request peer to add data to a bloom filter already set by 'filterload'
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Buffer=} options.data - Array of bytes representing bloom filter data
|
* @param {Buffer=} options.data - Array of bytes representing bloom filter data
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function FilteraddMessage(options) {
|
function FilteraddMessage(options) {
|
||||||
if (!(this instanceof FilteraddMessage)) {
|
|
||||||
return new FilteraddMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'filteradd';
|
this.command = 'filteradd';
|
||||||
this.data = options.data || BufferUtil.EMPTY_BUFFER;
|
this.data = options.data || BufferUtil.EMPTY_BUFFER;
|
||||||
}
|
}
|
||||||
inherits(FilteraddMessage, Message);
|
inherits(FilteraddMessage, Message);
|
||||||
|
|
||||||
FilteraddMessage.fromBuffer = function(payload) {
|
FilteraddMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
$.checkArgument(payload);
|
$.checkArgument(payload);
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
obj.data = parser.readVarLengthBuffer();
|
this.data = parser.readVarLengthBuffer();
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new FilteraddMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FilteraddMessage.prototype.getPayload = function() {
|
FilteraddMessage.prototype.getPayload = function() {
|
||||||
@ -48,7 +39,4 @@ FilteraddMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = FilteraddMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return FilteraddMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -5,35 +5,23 @@ var inherits = require('util').inherits;
|
|||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var BufferUtil = bitcore.util.buffer;
|
var BufferUtil = bitcore.util.buffer;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request peer to clear data for a bloom filter
|
* Request peer to clear data for a bloom filter
|
||||||
* @extends Message
|
* @extends Message
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function FilterclearMessage(options) {
|
function FilterclearMessage(options) {
|
||||||
if (!(this instanceof FilterclearMessage)) {
|
|
||||||
return new FilterclearMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'filterclear';
|
this.command = 'filterclear';
|
||||||
}
|
}
|
||||||
inherits(FilterclearMessage, Message);
|
inherits(FilterclearMessage, Message);
|
||||||
|
|
||||||
FilterclearMessage.fromBuffer = function(payload) {
|
FilterclearMessage.prototype.setPayload = function() {};
|
||||||
return new FilterclearMessage({});
|
|
||||||
};
|
|
||||||
|
|
||||||
FilterclearMessage.prototype.getPayload = function() {
|
FilterclearMessage.prototype.getPayload = function() {
|
||||||
return BufferUtil.EMPTY_BUFFER;
|
return BufferUtil.EMPTY_BUFFER;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = FilterclearMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return FilterclearMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -8,34 +8,27 @@ var BloomFilter = require('../../bloomfilter');
|
|||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
var _ = bitcore.deps._;
|
var _ = bitcore.deps._;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request peer to send inv messages based on a bloom filter
|
* Request peer to send inv messages based on a bloom filter
|
||||||
* @param {BloomFilter=} options.filter - An instance of BloomFilter
|
* @param {BloomFilter=} options.filter - An instance of BloomFilter
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function FilterloadMessage(options) {
|
function FilterloadMessage(options) {
|
||||||
if (!(this instanceof FilterloadMessage)) {
|
|
||||||
return new FilterloadMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'filterload';
|
this.command = 'filterload';
|
||||||
$.checkArgument(_.isUndefined(options.filter) || options.filter instanceof BloomFilter,
|
$.checkArgument(
|
||||||
'BloomFilter object or undefined required for FilterLoad');
|
_.isUndefined(options.filter) || options.filter instanceof BloomFilter,
|
||||||
|
'An instance of BloomFilter or undefined is expected'
|
||||||
|
);
|
||||||
this.filter = options.filter;
|
this.filter = options.filter;
|
||||||
}
|
}
|
||||||
inherits(FilterloadMessage, Message);
|
inherits(FilterloadMessage, Message);
|
||||||
|
|
||||||
FilterloadMessage.fromBuffer = function(payload) {
|
FilterloadMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
this.filter = BloomFilter.fromBuffer(payload);
|
||||||
obj.filter = BloomFilter.fromBuffer(payload);
|
|
||||||
return new FilterloadMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FilterloadMessage.prototype.getPayload = function() {
|
FilterloadMessage.prototype.getPayload = function() {
|
||||||
@ -46,7 +39,4 @@ FilterloadMessage.prototype.getPayload = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = FilterloadMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return FilterloadMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -5,35 +5,23 @@ var inherits = require('util').inherits;
|
|||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var BufferUtil = bitcore.util.buffer;
|
var BufferUtil = bitcore.util.buffer;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request information about active peers
|
* Request information about active peers
|
||||||
* @extends Message
|
* @extends Message
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function GetaddrMessage(options) {
|
function GetaddrMessage(options) {
|
||||||
if (!(this instanceof GetaddrMessage)) {
|
|
||||||
return new GetaddrMessage(options);
|
|
||||||
}
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'getaddr';
|
this.command = 'getaddr';
|
||||||
}
|
}
|
||||||
inherits(GetaddrMessage, Message);
|
inherits(GetaddrMessage, Message);
|
||||||
|
|
||||||
GetaddrMessage.fromBuffer = function() {
|
GetaddrMessage.prototype.setPayload = function() {};
|
||||||
return new GetaddrMessage({});
|
|
||||||
};
|
|
||||||
|
|
||||||
GetaddrMessage.prototype.getPayload = function() {
|
GetaddrMessage.prototype.getPayload = function() {
|
||||||
return BufferUtil.EMPTY_BUFFER;
|
return BufferUtil.EMPTY_BUFFER;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = GetaddrMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return GetaddrMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -8,9 +8,6 @@ var BufferReader = bitcore.encoding.BufferReader;
|
|||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
|
|
||||||
var protocolVersion = 70000;
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query another peer about blocks. It can query for multiple block hashes,
|
* Query another peer about blocks. It can query for multiple block hashes,
|
||||||
* and the response will contain all the chains of blocks starting from those
|
* and the response will contain all the chains of blocks starting from those
|
||||||
@ -18,18 +15,15 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Array=} options.starts - Array of buffers or strings with the starting block hashes
|
* @param {Array=} options.starts - Array of buffers or strings with the starting block hashes
|
||||||
* @param {Buffer=} options.stop - Hash of the last block
|
* @param {Buffer=} options.stop - Hash of the last block
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
|
* @extends Message
|
||||||
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function GetblocksMessage(options) {
|
function GetblocksMessage(options) {
|
||||||
if (!(this instanceof GetblocksMessage)) {
|
|
||||||
return new GetblocksMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'getblocks';
|
this.command = 'getblocks';
|
||||||
this.version = protocolVersion;
|
this.version = options.version;
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
|
||||||
options = utils.sanitizeStartStop(options);
|
options = utils.sanitizeStartStop(options);
|
||||||
this.starts = options.starts;
|
this.starts = options.starts;
|
||||||
@ -37,21 +31,19 @@ function GetblocksMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(GetblocksMessage, Message);
|
inherits(GetblocksMessage, Message);
|
||||||
|
|
||||||
GetblocksMessage.fromBuffer = function(payload) {
|
GetblocksMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
$.checkArgument(!parser.finished(), 'No data received in payload');
|
$.checkArgument(!parser.finished(), 'No data received in payload');
|
||||||
|
|
||||||
obj.version = parser.readUInt32LE();
|
this.version = parser.readUInt32LE();
|
||||||
var startCount = parser.readVarintNum();
|
var startCount = parser.readVarintNum();
|
||||||
|
|
||||||
obj.starts = [];
|
this.starts = [];
|
||||||
for (var i = 0; i < startCount; i++) {
|
for (var i = 0; i < startCount; i++) {
|
||||||
obj.starts.push(parser.read(32));
|
this.starts.push(parser.read(32));
|
||||||
}
|
}
|
||||||
obj.stop = parser.read(32);
|
this.stop = parser.read(32);
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new GetblocksMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GetblocksMessage.prototype.getPayload = function() {
|
GetblocksMessage.prototype.getPayload = function() {
|
||||||
@ -68,8 +60,4 @@ GetblocksMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = GetblocksMessage;
|
||||||
protocolVersion = options.protocolVersion || protocolVersion;
|
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return GetblocksMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -8,24 +8,17 @@ var BufferReader = bitcore.encoding.BufferReader;
|
|||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
var _ = bitcore.deps._;
|
var _ = bitcore.deps._;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object|Array=} - options - If options is an array will use as "inventory"
|
* @param {Object|Array=} - options - If options is an array will use as "inventory"
|
||||||
* @param {Array=} options.inventory - An array of inventory items
|
* @param {Array=} options.inventory - An array of inventory items
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function GetdataMessage(options) {
|
function GetdataMessage(options) {
|
||||||
if (!(this instanceof GetdataMessage)) {
|
|
||||||
return new GetdataMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'getdata';
|
this.command = 'getdata';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
|
||||||
var inventory;
|
var inventory;
|
||||||
if (_.isArray(options)) {
|
if (_.isArray(options)) {
|
||||||
@ -39,21 +32,18 @@ function GetdataMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(GetdataMessage, Message);
|
inherits(GetdataMessage, Message);
|
||||||
|
|
||||||
GetdataMessage.fromBuffer = function(payload) {
|
GetdataMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {
|
this.inventory = [];
|
||||||
inventory: []
|
|
||||||
};
|
|
||||||
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
var count = parser.readVarintNum();
|
var count = parser.readVarintNum();
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
var type = parser.readUInt32LE();
|
var type = parser.readUInt32LE();
|
||||||
var hash = parser.read(32);
|
var hash = parser.read(32);
|
||||||
obj.inventory.push({type: type, hash: hash});
|
this.inventory.push({type: type, hash: hash});
|
||||||
}
|
}
|
||||||
|
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new GetdataMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GetdataMessage.prototype.getPayload = function() {
|
GetdataMessage.prototype.getPayload = function() {
|
||||||
@ -62,7 +52,4 @@ GetdataMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = GetdataMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return GetdataMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -8,9 +8,6 @@ var BufferReader = bitcore.encoding.BufferReader;
|
|||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
|
|
||||||
var protocolVersion = 70000;
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query another peer about block headers. It can query for multiple block hashes,
|
* Query another peer about block headers. It can query for multiple block hashes,
|
||||||
* and the response will contain all the chains of blocks starting from those
|
* and the response will contain all the chains of blocks starting from those
|
||||||
@ -18,18 +15,15 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Array=} options.starts - Array of buffers or strings with the starting block hashes
|
* @param {Array=} options.starts - Array of buffers or strings with the starting block hashes
|
||||||
* @param {Buffer=} options.stop - Hash of the last block
|
* @param {Buffer=} options.stop - Hash of the last block
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
|
* @extends Message
|
||||||
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function GetheadersMessage(options) {
|
function GetheadersMessage(options) {
|
||||||
if (!(this instanceof GetheadersMessage)) {
|
|
||||||
return new GetheadersMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'getheaders';
|
this.command = 'getheaders';
|
||||||
this.version = protocolVersion;
|
this.version = options.version;
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
|
||||||
options = utils.sanitizeStartStop(options);
|
options = utils.sanitizeStartStop(options);
|
||||||
this.starts = options.starts;
|
this.starts = options.starts;
|
||||||
@ -37,21 +31,19 @@ function GetheadersMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(GetheadersMessage, Message);
|
inherits(GetheadersMessage, Message);
|
||||||
|
|
||||||
GetheadersMessage.fromBuffer = function(payload) {
|
GetheadersMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
$.checkArgument(!parser.finished(), 'No data received in payload');
|
$.checkArgument(!parser.finished(), 'No data received in payload');
|
||||||
|
|
||||||
obj.version = parser.readUInt32LE();
|
this.version = parser.readUInt32LE();
|
||||||
var startCount = Math.min(parser.readVarintNum(), 500);
|
var startCount = Math.min(parser.readVarintNum(), 500);
|
||||||
|
|
||||||
obj.starts = [];
|
this.starts = [];
|
||||||
for (var i = 0; i < startCount; i++) {
|
for (var i = 0; i < startCount; i++) {
|
||||||
obj.starts.push(parser.read(32));
|
this.starts.push(parser.read(32));
|
||||||
}
|
}
|
||||||
obj.stop = parser.read(32);
|
this.stop = parser.read(32);
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new GetheadersMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GetheadersMessage.prototype.getPayload = function() {
|
GetheadersMessage.prototype.getPayload = function() {
|
||||||
@ -68,8 +60,4 @@ GetheadersMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = GetheadersMessage;
|
||||||
protocolVersion = options.protocolVersion || protocolVersion;
|
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return GetheadersMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -8,46 +8,38 @@ var BufferReader = bitcore.encoding.BufferReader;
|
|||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
var $ = bitcore.util.preconditions;
|
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
|
* Sent in response to a `getheaders` message. It contains information about
|
||||||
* block headers.
|
* block headers.
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Array=} options.headers - array of block headers
|
* @param {Array=} options.headers - array of block headers
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
|
* @param {Function} options.BlockHeader - a BlockHeader constructor
|
||||||
|
* @extends Message
|
||||||
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function HeadersMessage(options) {
|
function HeadersMessage(options) {
|
||||||
if (!(this instanceof HeadersMessage)) {
|
|
||||||
return new HeadersMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.BlockHeader = options.BlockHeader;
|
||||||
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'headers';
|
this.command = 'headers';
|
||||||
this.headers = options.headers;
|
this.headers = options.headers;
|
||||||
}
|
}
|
||||||
inherits(HeadersMessage, Message);
|
inherits(HeadersMessage, Message);
|
||||||
|
|
||||||
HeadersMessage.fromBuffer = function(payload) {
|
HeadersMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
|
|
||||||
$.checkArgument(payload && payload.length > 0, 'No data found to create Headers message');
|
$.checkArgument(payload && payload.length > 0, 'No data found to create Headers message');
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
var count = parser.readVarintNum();
|
var count = parser.readVarintNum();
|
||||||
|
|
||||||
obj.headers = [];
|
this.headers = [];
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
var header = BlockHeader.fromBufferReader(parser);
|
var header = this.BlockHeader.fromBufferReader(parser);
|
||||||
obj.headers.push(header);
|
this.headers.push(header);
|
||||||
var txn_count = parser.readUInt8();
|
var txn_count = parser.readUInt8();
|
||||||
$.checkState(txn_count === 0, 'txn_count should always be 0');
|
$.checkState(txn_count === 0, 'txn_count should always be 0');
|
||||||
}
|
}
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
|
|
||||||
return new HeadersMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
HeadersMessage.prototype.getPayload = function() {
|
HeadersMessage.prototype.getPayload = function() {
|
||||||
@ -61,7 +53,4 @@ HeadersMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = HeadersMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return HeadersMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -6,27 +6,19 @@ var bitcore = require('bitcore');
|
|||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
var Inventory = require('../../inventory');
|
|
||||||
var _ = bitcore.deps._;
|
var _ = bitcore.deps._;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object|Array=} - options - If options is an array will use as "inventory"
|
* @param {Object|Array=} - options - If options is an array will use as "inventory"
|
||||||
* @param {Array=} options.inventory - An array of inventory items
|
* @param {Array=} options.inventory - An array of inventory items
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function InvMessage(options) {
|
function InvMessage(options) {
|
||||||
if (!(this instanceof InvMessage)) {
|
|
||||||
return new InvMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'inv';
|
this.command = 'inv';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
|
||||||
var inventory;
|
var inventory;
|
||||||
if (_.isArray(options)) {
|
if (_.isArray(options)) {
|
||||||
@ -39,30 +31,24 @@ function InvMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(InvMessage, Message);
|
inherits(InvMessage, Message);
|
||||||
|
|
||||||
InvMessage.prototype.getPayload = function() {
|
InvMessage.prototype.setPayload = function(payload) {
|
||||||
var bw = new BufferWriter();
|
this.inventory = [];
|
||||||
utils.writeInventory(this.inventory, bw);
|
|
||||||
return bw.concat();
|
|
||||||
};
|
|
||||||
|
|
||||||
InvMessage.fromBuffer = function(payload) {
|
|
||||||
var obj = {
|
|
||||||
inventory: []
|
|
||||||
};
|
|
||||||
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
var count = parser.readVarintNum();
|
var count = parser.readVarintNum();
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
var type = parser.readUInt32LE();
|
var type = parser.readUInt32LE();
|
||||||
var hash = parser.read(32);
|
var hash = parser.read(32);
|
||||||
obj.inventory.push({type: type, hash: hash});
|
this.inventory.push({type: type, hash: hash});
|
||||||
}
|
}
|
||||||
|
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new InvMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
InvMessage.prototype.getPayload = function() {
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
var bw = new BufferWriter();
|
||||||
return InvMessage;
|
utils.writeInventory(this.inventory, bw);
|
||||||
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module.exports = InvMessage;
|
||||||
|
|||||||
@ -5,37 +5,25 @@ var inherits = require('util').inherits;
|
|||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var BufferUtil = bitcore.util.buffer;
|
var BufferUtil = bitcore.util.buffer;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mempool message sends a request to a node asking for information about
|
* The mempool message sends a request to a node asking for information about
|
||||||
* transactions it has verified but which have not yet confirmed.
|
* transactions it has verified but which have not yet confirmed.
|
||||||
* @see https://en.bitcoin.it/wiki/Protocol_documentation#mempool
|
* @see https://en.bitcoin.it/wiki/Protocol_documentation#mempool
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function MempoolMessage(options) {
|
function MempoolMessage(options) {
|
||||||
if (!(this instanceof MempoolMessage)) {
|
|
||||||
return new MempoolMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'mempool';
|
this.command = 'mempool';
|
||||||
}
|
}
|
||||||
inherits(MempoolMessage, Message);
|
inherits(MempoolMessage, Message);
|
||||||
|
|
||||||
MempoolMessage.fromBuffer = function(payload) {
|
MempoolMessage.prototype.setPayload = function() {};
|
||||||
return new MempoolMessage({});
|
|
||||||
};
|
|
||||||
|
|
||||||
MempoolMessage.prototype.getPayload = function() {
|
MempoolMessage.prototype.getPayload = function() {
|
||||||
return BufferUtil.EMPTY_BUFFER;
|
return BufferUtil.EMPTY_BUFFER;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = MempoolMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return MempoolMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -7,46 +7,36 @@ var BufferUtil = bitcore.util.buffer;
|
|||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
var _ = bitcore.deps._;
|
var _ = bitcore.deps._;
|
||||||
|
|
||||||
var MerkleBlock = bitcore.MerkleBlock;
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains information about a MerkleBlock
|
* Contains information about a MerkleBlock
|
||||||
* @see https://en.bitcoin.it/wiki/Protocol_documentation
|
* @see https://en.bitcoin.it/wiki/Protocol_documentation
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {MerkleBlock=} options.merkleBlock
|
* @param {MerkleBlock=} options.merkleBlock
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
|
* @param {Function} options.MerkleBlock - a MerkleBlock constructor
|
||||||
|
* @extends Message
|
||||||
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function MerkleblockMessage(options) {
|
function MerkleblockMessage(options) {
|
||||||
if (!(this instanceof MerkleblockMessage)) {
|
|
||||||
return new MerkleblockMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.MerkleBlock = options.MerkleBlock; // constructor
|
||||||
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'merkleblock';
|
this.command = 'merkleblock';
|
||||||
$.checkArgument(
|
$.checkArgument(
|
||||||
_.isUndefined(options.merkleBlock) ||
|
_.isUndefined(options.merkleBlock) || options.merkleBlock instanceof this.MerkleBlock,
|
||||||
options.merkleBlock instanceof MerkleBlock
|
'An instance of MerkleBlock or undefined is expected'
|
||||||
);
|
);
|
||||||
this.merkleBlock = options.merkleBlock;
|
this.merkleBlock = options.merkleBlock;
|
||||||
}
|
}
|
||||||
inherits(MerkleblockMessage, Message);
|
inherits(MerkleblockMessage, Message);
|
||||||
|
|
||||||
MerkleblockMessage.fromBuffer = function(payload) {
|
MerkleblockMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
$.checkArgument(BufferUtil.isBuffer(payload));
|
$.checkArgument(BufferUtil.isBuffer(payload));
|
||||||
obj.merkleBlock = MerkleBlock.fromBuffer(payload);
|
this.merkleBlock = this.MerkleBlock.fromBuffer(payload);
|
||||||
return new MerkleblockMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MerkleblockMessage.prototype.getPayload = function() {
|
MerkleblockMessage.prototype.getPayload = function() {
|
||||||
return this.merkleBlock ? this.merkleBlock.toBuffer() : BufferUtil.EMPTY_BUFFER;
|
return this.merkleBlock ? this.merkleBlock.toBuffer() : BufferUtil.EMPTY_BUFFER;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = MerkleblockMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
MerkleBlock = options.MerkleBlock || MerkleBlock;
|
|
||||||
return MerkleblockMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -6,27 +6,19 @@ var bitcore = require('bitcore');
|
|||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
var BufferWriter = bitcore.encoding.BufferWriter;
|
var BufferWriter = bitcore.encoding.BufferWriter;
|
||||||
var Inventory = require('../../inventory');
|
|
||||||
var _ = bitcore.deps._;
|
var _ = bitcore.deps._;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object|Array=} options - If options is an array will use as "inventory"
|
* @param {Object|Array=} options - If options is an array will use as "inventory"
|
||||||
* @param {Array=} options.inventory - An array of inventory items
|
* @param {Array=} options.inventory - An array of inventory items
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function NotfoundMessage(options) {
|
function NotfoundMessage(options) {
|
||||||
if (!(this instanceof NotfoundMessage)) {
|
|
||||||
return new NotfoundMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'notfound';
|
this.command = 'notfound';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
|
||||||
var inventory;
|
var inventory;
|
||||||
if (_.isArray(options)) {
|
if (_.isArray(options)) {
|
||||||
@ -39,21 +31,18 @@ function NotfoundMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(NotfoundMessage, Message);
|
inherits(NotfoundMessage, Message);
|
||||||
|
|
||||||
NotfoundMessage.fromBuffer = function(payload) {
|
NotfoundMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {
|
this.inventory = [];
|
||||||
inventory: []
|
|
||||||
};
|
|
||||||
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
var count = parser.readVarintNum();
|
var count = parser.readVarintNum();
|
||||||
for (var i = 0; i < count; i++) {
|
for (var i = 0; i < count; i++) {
|
||||||
var type = parser.readUInt32LE();
|
var type = parser.readUInt32LE();
|
||||||
var hash = parser.read(32);
|
var hash = parser.read(32);
|
||||||
obj.inventory.push({type: type, hash: hash});
|
this.inventory.push({type: type, hash: hash});
|
||||||
}
|
}
|
||||||
|
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new NotfoundMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
NotfoundMessage.prototype.getPayload = function() {
|
NotfoundMessage.prototype.getPayload = function() {
|
||||||
@ -62,7 +51,4 @@ NotfoundMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = NotfoundMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return NotfoundMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -6,43 +6,31 @@ var bitcore = require('bitcore');
|
|||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A message to confirm that a connection is still valid.
|
* A message to confirm that a connection is still valid.
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Buffer=} options.nonce
|
* @param {Buffer=} options.nonce
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function PingMessage(options) {
|
function PingMessage(options) {
|
||||||
if (!(this instanceof PingMessage)) {
|
|
||||||
return new PingMessage(options);
|
|
||||||
}
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'ping';
|
this.command = 'ping';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.nonce = options.nonce || utils.getNonce();
|
this.nonce = options.nonce || utils.getNonce();
|
||||||
}
|
}
|
||||||
inherits(PingMessage, Message);
|
inherits(PingMessage, Message);
|
||||||
|
|
||||||
|
PingMessage.prototype.setPayload = function(payload) {
|
||||||
|
var parser = new BufferReader(payload);
|
||||||
|
this.nonce = parser.read(8);
|
||||||
|
|
||||||
|
utils.checkFinished(parser);
|
||||||
|
};
|
||||||
|
|
||||||
PingMessage.prototype.getPayload = function() {
|
PingMessage.prototype.getPayload = function() {
|
||||||
return this.nonce;
|
return this.nonce;
|
||||||
};
|
};
|
||||||
|
|
||||||
PingMessage.fromBuffer = function(payload) {
|
module.exports = PingMessage;
|
||||||
var obj = {};
|
|
||||||
var parser = new BufferReader(payload);
|
|
||||||
obj.nonce = parser.read(8);
|
|
||||||
|
|
||||||
utils.checkFinished(parser);
|
|
||||||
return new PingMessage(obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = function(options) {
|
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return PingMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -6,43 +6,31 @@ var bitcore = require('bitcore');
|
|||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var BufferReader = bitcore.encoding.BufferReader;
|
var BufferReader = bitcore.encoding.BufferReader;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A message in response to a ping message.
|
* A message in response to a ping message.
|
||||||
* @param {Object=} options
|
* @param {Object=} options
|
||||||
* @param {Buffer=} options.nonce
|
* @param {Buffer=} options.nonce
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function PongMessage(options) {
|
function PongMessage(options) {
|
||||||
if (!(this instanceof PongMessage)) {
|
|
||||||
return new PongMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'pong';
|
this.command = 'pong';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.nonce = options.nonce;
|
this.nonce = options.nonce;
|
||||||
}
|
}
|
||||||
inherits(PongMessage, Message);
|
inherits(PongMessage, Message);
|
||||||
|
|
||||||
PongMessage.fromBuffer = function(payload) {
|
PongMessage.prototype.setPayload = function(payload) {
|
||||||
var obj = {};
|
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
obj.nonce = parser.read(8);
|
this.nonce = parser.read(8);
|
||||||
|
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
return new PongMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
PongMessage.prototype.getPayload = function() {
|
PongMessage.prototype.getPayload = function() {
|
||||||
return this.nonce;
|
return this.nonce;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = PongMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return PongMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -5,32 +5,18 @@ var inherits = require('util').inherits;
|
|||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var BufferUtil = bitcore.util.buffer;
|
var BufferUtil = bitcore.util.buffer;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
// todo: add payload: https://en.bitcoin.it/wiki/Protocol_documentation#reject
|
// todo: add payload: https://en.bitcoin.it/wiki/Protocol_documentation#reject
|
||||||
function RejectMessage(options) {
|
function RejectMessage(options) {
|
||||||
if (!(this instanceof RejectMessage)) {
|
|
||||||
return new RejectMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'reject';
|
this.command = 'reject';
|
||||||
}
|
}
|
||||||
inherits(RejectMessage, Message);
|
inherits(RejectMessage, Message);
|
||||||
|
|
||||||
RejectMessage.fromBuffer = function(payload) {
|
RejectMessage.prototype.setPayload = function() {};
|
||||||
var obj = {};
|
|
||||||
return new RejectMessage(obj);
|
|
||||||
};
|
|
||||||
|
|
||||||
RejectMessage.prototype.getPayload = function() {
|
RejectMessage.prototype.getPayload = function() {
|
||||||
return BufferUtil.EMPTY_BUFFER;
|
return BufferUtil.EMPTY_BUFFER;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = RejectMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return RejectMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -2,30 +2,22 @@
|
|||||||
|
|
||||||
var Message = require('../message');
|
var Message = require('../message');
|
||||||
var inherits = require('util').inherits;
|
var inherits = require('util').inherits;
|
||||||
var bitcore = require('bitcore');
|
|
||||||
|
|
||||||
var Transaction = bitcore.Transaction;
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object|Transaction=} options - If is an instance of Transaction will use as options.transaction
|
* @param {Object|Transaction=} options - If is an instance of Transaction will use as options.transaction
|
||||||
* @param {Transaction=} options.transaction - An instance of a Transaction
|
* @param {Transaction=} options.transaction - An instance of a Transaction
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function TransactionMessage(options) {
|
function TransactionMessage(options) {
|
||||||
if (!(this instanceof TransactionMessage)) {
|
|
||||||
return new TransactionMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.command = 'tx';
|
this.command = 'tx';
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
|
this.Transaction = options.Transaction;
|
||||||
|
|
||||||
var transaction;
|
var transaction;
|
||||||
if(options instanceof Transaction) {
|
if(options instanceof this.Transaction) {
|
||||||
transaction = options;
|
transaction = options;
|
||||||
} else {
|
} else {
|
||||||
transaction = options.transaction;
|
transaction = options.transaction;
|
||||||
@ -35,22 +27,16 @@ function TransactionMessage(options) {
|
|||||||
}
|
}
|
||||||
inherits(TransactionMessage, Message);
|
inherits(TransactionMessage, Message);
|
||||||
|
|
||||||
TransactionMessage.fromBuffer = function(payload) {
|
TransactionMessage.prototype.setPayload = function(payload) {
|
||||||
var transaction;
|
if (this.Transaction.prototype.fromBuffer) {
|
||||||
if (Transaction.prototype.fromBuffer) {
|
this.transaction = new this.Transaction().fromBuffer(payload);
|
||||||
transaction = new Transaction().fromBuffer(payload);
|
|
||||||
} else {
|
} else {
|
||||||
transaction = Transaction.fromBuffer(payload);
|
this.transaction = this.Transaction.fromBuffer(payload);
|
||||||
}
|
}
|
||||||
return new TransactionMessage({transaction: transaction});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TransactionMessage.prototype.getPayload = function() {
|
TransactionMessage.prototype.getPayload = function() {
|
||||||
return this.transaction.toBuffer();
|
return this.transaction.toBuffer();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = TransactionMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
Transaction = options.Transaction || Transaction;
|
|
||||||
return TransactionMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -5,35 +5,23 @@ var inherits = require('util').inherits;
|
|||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var BufferUtil = bitcore.util.buffer;
|
var BufferUtil = bitcore.util.buffer;
|
||||||
|
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A message in response to a version message.
|
* A message in response to a version message.
|
||||||
|
* @param {Number} options.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function VerackMessage(options) {
|
function VerackMessage(options) {
|
||||||
if (!(this instanceof VerackMessage)) {
|
|
||||||
return new VerackMessage(options);
|
|
||||||
}
|
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
Message.call(this, options);
|
Message.call(this, options);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
this.command = 'verack';
|
this.command = 'verack';
|
||||||
}
|
}
|
||||||
inherits(VerackMessage, Message);
|
inherits(VerackMessage, Message);
|
||||||
|
|
||||||
VerackMessage.fromBuffer = function(payload) {
|
VerackMessage.prototype.setPayload = function() {};
|
||||||
return new VerackMessage({});
|
|
||||||
};
|
|
||||||
|
|
||||||
VerackMessage.prototype.getPayload = function() {
|
VerackMessage.prototype.getPayload = function() {
|
||||||
return BufferUtil.EMPTY_BUFFER;
|
return BufferUtil.EMPTY_BUFFER;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = VerackMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
return VerackMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -9,8 +9,6 @@ var _ = bitcore.deps._;
|
|||||||
var BN = bitcore.crypto.BN;
|
var BN = bitcore.crypto.BN;
|
||||||
|
|
||||||
var utils = require('../utils');
|
var utils = require('../utils');
|
||||||
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
var protocolVersion = 70000;
|
|
||||||
var packageInfo = require('../../../package.json');
|
var packageInfo = require('../../../package.json');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -25,56 +23,51 @@ var packageInfo = require('../../../package.json');
|
|||||||
* @param {BN=} obj.services
|
* @param {BN=} obj.services
|
||||||
* @param {Date=} obj.timestamp
|
* @param {Date=} obj.timestamp
|
||||||
* @param {Number=} obj.startHeight
|
* @param {Number=} obj.startHeight
|
||||||
|
* @param {Number} obj.magicNumber
|
||||||
* @extends Message
|
* @extends Message
|
||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function VersionMessage(obj) {
|
function VersionMessage(obj) {
|
||||||
if (!(this instanceof VersionMessage)) {
|
|
||||||
return new VersionMessage(obj);
|
|
||||||
}
|
|
||||||
/* jshint maxcomplexity: 10 */
|
/* jshint maxcomplexity: 10 */
|
||||||
Message.call(this, obj);
|
Message.call(this, obj);
|
||||||
this.command = 'version';
|
this.command = 'version';
|
||||||
_.assign(this, obj);
|
_.assign(this, obj);
|
||||||
this.magicNumber = magicNumber;
|
this.magicNumber = obj.magicNumber;
|
||||||
|
this.version = obj.version;
|
||||||
this.nonce = this.nonce || utils.getNonce();
|
this.nonce = this.nonce || utils.getNonce();
|
||||||
this.services = this.services || new BN(1, 10);
|
this.services = this.services || new BN(1, 10);
|
||||||
this.timestamp = this.timestamp || new Date();
|
this.timestamp = this.timestamp || new Date();
|
||||||
this.version = this.version || protocolVersion;
|
|
||||||
this.subversion = this.subversion || '/bitcore:' + packageInfo.version + '/';
|
this.subversion = this.subversion || '/bitcore:' + packageInfo.version + '/';
|
||||||
this.startHeight = this.startHeight || 0;
|
this.startHeight = this.startHeight || 0;
|
||||||
}
|
}
|
||||||
inherits(VersionMessage, Message);
|
inherits(VersionMessage, Message);
|
||||||
|
|
||||||
VersionMessage.fromBuffer = function(payload) {
|
VersionMessage.prototype.setPayload = function(payload) {
|
||||||
var parser = new BufferReader(payload);
|
var parser = new BufferReader(payload);
|
||||||
var obj = {};
|
this.version = parser.readUInt32LE();
|
||||||
obj.version = parser.readUInt32LE();
|
this.services = parser.readUInt64LEBN();
|
||||||
obj.services = parser.readUInt64LEBN();
|
this.timestamp = new Date(parser.readUInt64LEBN().toNumber() * 1000);
|
||||||
obj.timestamp = new Date(parser.readUInt64LEBN().toNumber() * 1000);
|
|
||||||
|
|
||||||
obj.addrMe = {
|
this.addrMe = {
|
||||||
services: parser.readUInt64LEBN(),
|
services: parser.readUInt64LEBN(),
|
||||||
ip: utils.parseIP(parser),
|
ip: utils.parseIP(parser),
|
||||||
port: parser.readUInt16BE()
|
port: parser.readUInt16BE()
|
||||||
};
|
};
|
||||||
obj.addrYou = {
|
this.addrYou = {
|
||||||
services: parser.readUInt64LEBN(),
|
services: parser.readUInt64LEBN(),
|
||||||
ip: utils.parseIP(parser),
|
ip: utils.parseIP(parser),
|
||||||
port: parser.readUInt16BE()
|
port: parser.readUInt16BE()
|
||||||
};
|
};
|
||||||
obj.nonce = parser.read(8);
|
this.nonce = parser.read(8);
|
||||||
obj.subversion = parser.readVarLengthBuffer().toString();
|
this.subversion = parser.readVarLengthBuffer().toString();
|
||||||
obj.startHeight = parser.readUInt32LE();
|
this.startHeight = parser.readUInt32LE();
|
||||||
|
|
||||||
if(parser.finished()) {
|
if(parser.finished()) {
|
||||||
obj.relay = true;
|
this.relay = true;
|
||||||
} else {
|
} else {
|
||||||
obj.relay = !!parser.readUInt8();
|
this.relay = !!parser.readUInt8();
|
||||||
}
|
}
|
||||||
utils.checkFinished(parser);
|
utils.checkFinished(parser);
|
||||||
|
|
||||||
return new VersionMessage(obj);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
VersionMessage.prototype.getPayload = function() {
|
VersionMessage.prototype.getPayload = function() {
|
||||||
@ -97,8 +90,4 @@ VersionMessage.prototype.getPayload = function() {
|
|||||||
return bw.concat();
|
return bw.concat();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(options) {
|
module.exports = VersionMessage;
|
||||||
magicNumber = options.magicNumber || magicNumber;
|
|
||||||
protocolVersion = options.protocolVersion || protocolVersion;
|
|
||||||
return VersionMessage;
|
|
||||||
};
|
|
||||||
|
|||||||
@ -13,9 +13,6 @@ var Hash = bitcore.crypto.Hash;
|
|||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function Message(options) {
|
function Message(options) {
|
||||||
if(!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
this.command = options.command;
|
this.command = options.command;
|
||||||
this.magicNumber = options.magicNumber;
|
this.magicNumber = options.magicNumber;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,14 +3,8 @@
|
|||||||
var should = require('chai').should();
|
var should = require('chai').should();
|
||||||
var P2P = require('../../');
|
var P2P = require('../../');
|
||||||
var builder = P2P.Messages.builder;
|
var builder = P2P.Messages.builder;
|
||||||
var commandData = require('../data/messages.json');
|
|
||||||
var Data = require('../data/messages');//todo merge with commandData
|
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
|
|
||||||
function getPayloadBuffer(messageBuffer) {
|
|
||||||
return new Buffer(messageBuffer.slice(48), 'hex');
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('Messages Builder', function() {
|
describe('Messages Builder', function() {
|
||||||
|
|
||||||
describe('@constructor', function() {
|
describe('@constructor', function() {
|
||||||
@ -33,82 +27,4 @@ describe('Messages Builder', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Commands', function() {
|
|
||||||
|
|
||||||
var b = builder();
|
|
||||||
|
|
||||||
describe('#fromBuffer/#toBuffer round trip for all commands', function() {
|
|
||||||
Object.keys(b.commands).forEach(function(command) {
|
|
||||||
|
|
||||||
it(command, function(done) {
|
|
||||||
var payloadBuffer = getPayloadBuffer(commandData[command].message);
|
|
||||||
should.exist(b.commands[command]);
|
|
||||||
var message = b.commands[command].fromBuffer(payloadBuffer);
|
|
||||||
var outputBuffer = message.getPayload();
|
|
||||||
outputBuffer.toString('hex').should.equal(payloadBuffer.toString('hex'));
|
|
||||||
outputBuffer.should.deep.equal(payloadBuffer);
|
|
||||||
var expectedBuffer = new Buffer(commandData[command].message, 'hex');
|
|
||||||
message.toBuffer().should.deep.equal(expectedBuffer);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('version', function() {
|
|
||||||
it('#fromBuffer works w/o fRelay arg', function() {
|
|
||||||
var payloadBuffer = getPayloadBuffer(Data.version.messagenofrelay);
|
|
||||||
var message = b.commands.version.fromBuffer(payloadBuffer);
|
|
||||||
message.relay.should.equal(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('#relay setting works', function() {
|
|
||||||
[true,false].forEach(function(relay) {
|
|
||||||
var message = new b.commands.version({relay: relay});
|
|
||||||
message.relay.should.equal(relay);
|
|
||||||
var messageBuf = message.getPayload();
|
|
||||||
var newMessage = b.commands.version.fromBuffer(messageBuf);
|
|
||||||
newMessage.relay.should.equal(relay);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Inventory helpers for: ' + b.inventoryCommands.join(', '), function() {
|
|
||||||
|
|
||||||
var constructors = b.inventoryCommands;
|
|
||||||
var fakeHash = 'e2dfb8afe1575bfacae1a0b4afc49af7ddda69285857267bae0e22be15f74a3a';
|
|
||||||
|
|
||||||
describe('#forTransaction', function() {
|
|
||||||
constructors.forEach(function(name) {
|
|
||||||
it(name, function() {
|
|
||||||
should.exist(b.commands[name].forTransaction);
|
|
||||||
var message = b.commands[name].forTransaction(fakeHash);
|
|
||||||
should.exist(message);
|
|
||||||
message.should.be.instanceof(b.commands[name]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#forBlock', function() {
|
|
||||||
constructors.forEach(function(name) {
|
|
||||||
it(name, function() {
|
|
||||||
var message = b.commands[name].forBlock(fakeHash);
|
|
||||||
should.exist(message);
|
|
||||||
message.should.be.instanceof(b.commands[name]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#forFilteredBlock', function() {
|
|
||||||
constructors.forEach(function(name) {
|
|
||||||
it(name, function() {
|
|
||||||
var message = b.commands[name].forFilteredBlock(fakeHash);
|
|
||||||
should.exist(message);
|
|
||||||
message.should.be.instanceof(b.commands[name]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -9,29 +9,6 @@ var bitcore = require('bitcore');
|
|||||||
describe('Command Messages', function() {
|
describe('Command Messages', function() {
|
||||||
|
|
||||||
var messages = new Messages();
|
var messages = new Messages();
|
||||||
var commandsMap = {
|
|
||||||
version: 'Version',
|
|
||||||
verack: 'VerAck',
|
|
||||||
ping: 'Ping',
|
|
||||||
pong: 'Pong',
|
|
||||||
block: 'Block',
|
|
||||||
tx: 'Transaction',
|
|
||||||
getdata: 'GetData',
|
|
||||||
headers: 'Headers',
|
|
||||||
notfound: 'NotFound',
|
|
||||||
inv: 'Inventory',
|
|
||||||
addr: 'Address',
|
|
||||||
alert: 'Alert',
|
|
||||||
reject: 'Reject',
|
|
||||||
merkleblock: 'MerkleBlock',
|
|
||||||
filterload: 'FilterLoad',
|
|
||||||
filteradd: 'FilterAdd',
|
|
||||||
filterclear: 'FilterClear',
|
|
||||||
getblocks: 'GetBlocks',
|
|
||||||
getheaders: 'GetHeaders',
|
|
||||||
mempool: 'MemPool',
|
|
||||||
getaddr: 'GetAddr'
|
|
||||||
};
|
|
||||||
|
|
||||||
describe('Transaction', function() {
|
describe('Transaction', function() {
|
||||||
|
|
||||||
@ -65,6 +42,12 @@ describe('Command Messages', function() {
|
|||||||
payload.should.be.instanceof(Buffer);
|
payload.should.be.instanceof(Buffer);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should error if filter is not a bloom filter', function() {
|
||||||
|
(function() {
|
||||||
|
var message = messages.FilterLoad({filter: 'not a bloom filter'});
|
||||||
|
}).should.throw('An instance of BloomFilter');
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Transaction', function() {
|
describe('Transaction', function() {
|
||||||
@ -141,18 +124,10 @@ describe('Command Messages', function() {
|
|||||||
payload.length.should.equal(0);
|
payload.length.should.equal(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
it('should error if merkleBlock is not a MerkleBlock', function() {
|
||||||
|
(function() {
|
||||||
|
var message = messages.MerkleBlock({merkleBlock: 'not a merkle block'});
|
||||||
describe('Default Magic Number', function() {
|
}).should.throw('An instance of MerkleBlock');
|
||||||
|
|
||||||
Object.keys(commandsMap).forEach(function(command) {
|
|
||||||
it(command, function() {
|
|
||||||
var messageConstructor = require('../../../lib/messages/commands/' + command)({});
|
|
||||||
var message = new messageConstructor();
|
|
||||||
var defaultMagic = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
|
||||||
message.magicNumber.should.equal(defaultMagic);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -8,6 +8,12 @@ var P2P = require('../../');
|
|||||||
var Messages = P2P.Messages;
|
var Messages = P2P.Messages;
|
||||||
var messages = new Messages();
|
var messages = new Messages();
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
|
var Data = require('../data/messages');//todo merge with commandData
|
||||||
|
var commandData = require('../data/messages.json');
|
||||||
|
|
||||||
|
function getPayloadBuffer(messageBuffer) {
|
||||||
|
return new Buffer(messageBuffer.slice(48), 'hex');
|
||||||
|
}
|
||||||
|
|
||||||
describe('Messages', function() {
|
describe('Messages', function() {
|
||||||
|
|
||||||
@ -31,6 +37,16 @@ describe('Messages', function() {
|
|||||||
messages.builder.constructors.Transaction.should.equal(bitcore.Transaction);
|
messages.builder.constructors.Transaction.should.equal(bitcore.Transaction);
|
||||||
messages.magicNumber.should.equal(magicNumber);
|
messages.magicNumber.should.equal(magicNumber);
|
||||||
});
|
});
|
||||||
|
it('magicNumber should be unique for each set of messages', function() {
|
||||||
|
var messages = new Messages({magicNumber: 123456});
|
||||||
|
var messages2 = new Messages({magicNumber: 987654});
|
||||||
|
messages.magicNumber.should.equal(123456);
|
||||||
|
messages2.magicNumber.should.equal(987654);
|
||||||
|
var message1 = messages.Version();
|
||||||
|
message1.magicNumber.should.equal(123456);
|
||||||
|
var message2 = messages2.Version();
|
||||||
|
message2.magicNumber.should.equal(987654);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('@constructor for all command messages', function() {
|
describe('@constructor for all command messages', function() {
|
||||||
@ -39,15 +55,107 @@ describe('Messages', function() {
|
|||||||
var name = messages.builder.commandsMap[command];
|
var name = messages.builder.commandsMap[command];
|
||||||
it('message.' + name, function(done) {
|
it('message.' + name, function(done) {
|
||||||
should.exist(messages[name]);
|
should.exist(messages[name]);
|
||||||
messages[name].super_.should.equal(Messages.Message);
|
|
||||||
var message = messages[name]();
|
var message = messages[name]();
|
||||||
should.exist(message);
|
should.exist(message);
|
||||||
message.should.be.instanceof(messages[name]);
|
message.should.be.instanceof(messages[name]._constructor);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#fromBuffer/#toBuffer round trip for all commands', function() {
|
||||||
|
var messages = new Messages();
|
||||||
|
Object.keys(messages.builder.commandsMap).forEach(function(command) {
|
||||||
|
var name = messages.builder.commandsMap[command];
|
||||||
|
it(name, function(done) {
|
||||||
|
var payloadBuffer = getPayloadBuffer(commandData[command].message);
|
||||||
|
should.exist(messages[name]);
|
||||||
|
var message = messages[name].fromBuffer(payloadBuffer);
|
||||||
|
var outputBuffer = message.getPayload();
|
||||||
|
outputBuffer.toString('hex').should.equal(payloadBuffer.toString('hex'));
|
||||||
|
outputBuffer.should.deep.equal(payloadBuffer);
|
||||||
|
var expectedBuffer = new Buffer(commandData[command].message, 'hex');
|
||||||
|
message.toBuffer().should.deep.equal(expectedBuffer);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Default Magic Number', function() {
|
||||||
|
var messages = new Messages();
|
||||||
|
Object.keys(messages.builder.commandsMap).forEach(function(command) {
|
||||||
|
var name = messages.builder.commandsMap[command];
|
||||||
|
it(name, function() {
|
||||||
|
var message = messages[name]();
|
||||||
|
var defaultMagic = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
|
||||||
|
message.magicNumber.should.equal(defaultMagic);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('messages.Version', function() {
|
||||||
|
var messages = new Messages();
|
||||||
|
it('#fromBuffer works w/o fRelay arg', function() {
|
||||||
|
var payloadBuffer = getPayloadBuffer(Data.version.messagenofrelay);
|
||||||
|
var message = messages.Version.fromBuffer(payloadBuffer);
|
||||||
|
message.relay.should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('#relay setting works', function() {
|
||||||
|
[true,false].forEach(function(relay) {
|
||||||
|
var message = messages.Version({relay: relay});
|
||||||
|
message.relay.should.equal(relay);
|
||||||
|
var messageBuf = message.getPayload();
|
||||||
|
var newMessage = messages.Version.fromBuffer(messageBuf);
|
||||||
|
newMessage.relay.should.equal(relay);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Inventory Helpers', function() {
|
||||||
|
|
||||||
|
var messages = new Messages();
|
||||||
|
|
||||||
|
var constructors = messages.builder.inventoryCommands;
|
||||||
|
var fakeHash = 'e2dfb8afe1575bfacae1a0b4afc49af7ddda69285857267bae0e22be15f74a3a';
|
||||||
|
|
||||||
|
describe('#forTransaction', function() {
|
||||||
|
constructors.forEach(function(command) {
|
||||||
|
var name = messages.builder.commandsMap[command];
|
||||||
|
it(name, function() {
|
||||||
|
should.exist(messages[name].forTransaction);
|
||||||
|
var message = messages[name].forTransaction(fakeHash);
|
||||||
|
should.exist(message);
|
||||||
|
message.should.be.instanceof(messages[name]._constructor);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#forBlock', function() {
|
||||||
|
constructors.forEach(function(command) {
|
||||||
|
var name = messages.builder.commandsMap[command];
|
||||||
|
it(name, function() {
|
||||||
|
var message = messages[name].forBlock(fakeHash);
|
||||||
|
should.exist(message);
|
||||||
|
message.should.be.instanceof(messages[name]._constructor);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#forFilteredBlock', function() {
|
||||||
|
constructors.forEach(function(command) {
|
||||||
|
var name = messages.builder.commandsMap[command];
|
||||||
|
it(name, function() {
|
||||||
|
var message = messages[name].forFilteredBlock(fakeHash);
|
||||||
|
should.exist(message);
|
||||||
|
message.should.be.instanceof(messages[name]._constructor);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
describe('#parseBuffer', function() {
|
describe('#parseBuffer', function() {
|
||||||
it('fails with invalid command', function() {
|
it('fails with invalid command', function() {
|
||||||
var invalidCommand = 'f9beb4d96d616c6963696f757300000025000000bd5e830c' +
|
var invalidCommand = 'f9beb4d96d616c6963696f757300000025000000bd5e830c' +
|
||||||
|
|||||||
@ -28,6 +28,12 @@ describe('Message Utils', function() {
|
|||||||
utils.sanitizeStartStop({starts: ['0000'], stop: stop});
|
utils.sanitizeStartStop({starts: ['0000'], stop: stop});
|
||||||
}).should.throw('Invalid hash');
|
}).should.throw('Invalid hash');
|
||||||
});
|
});
|
||||||
|
it('should keep buffers as buffers', function() {
|
||||||
|
/*jshint immed: false */
|
||||||
|
var starts = [new Buffer(Array(32))];
|
||||||
|
var obj = utils.sanitizeStartStop({starts: starts});
|
||||||
|
obj.starts[0].should.deep.equal(starts[0]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user