Merge pull request #42 from throughnothing/merkleblock

Merkleblock Message
This commit is contained in:
Braydon Fuller 2015-03-02 13:21:31 -05:00
commit 7166f220a2
4 changed files with 50 additions and 2 deletions

View File

@ -14,6 +14,7 @@ var _ = bitcore.deps._;
var BlockHeaderModel = bitcore.BlockHeader;
var BlockModel = bitcore.Block;
var MerkleBlockModel = bitcore.MerkleBlock;
var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter;
var BufferUtil = bitcore.util.buffer;
@ -315,7 +316,7 @@ function Inventory(inventory) {
}
util.inherits(Inventory, Message);
// https://en.bitcoin.it/wiki/Protocol_specification#Inventory_Vectors
// https://en.bitcoin.it/wiki/Protocol_specification#Inventory_Vectors
Inventory.TYPE = {};
Inventory.TYPE.ERROR = 0;
Inventory.TYPE.TX = 1;
@ -720,6 +721,37 @@ Block.prototype.getPayload = function() {
module.exports.Block = Message.COMMANDS.block = Block;
/**
* Contains information about a MerkleBlock
*
* @name P2P.Message.MerkleBlock
* @param {MerkleBlock} block
*/
function MerkleBlock(block) {
$.checkArgument(_.isUndefined(block) || block instanceof MerkleBlockModel);
this.command = 'merkleblock';
/**
* @type {Block}
* @desc The block received
*/
this.merkleBlock = block;
}
util.inherits(MerkleBlock, Message);
MerkleBlock.prototype.fromBuffer = function(payload) {
$.checkArgument(BufferUtil.isBuffer(payload));
var block = MerkleBlockModel(payload);
return new MerkleBlock(block);
};
MerkleBlock.prototype.getPayload = function() {
return this.merkleBlock ? this.merkleBlock.toBuffer() : new Buffer(0);
};
module.exports.MerkleBlock = Message.COMMANDS.merkleblock = MerkleBlock;
/**
* Contains information about a transaction
*
@ -941,5 +973,7 @@ Buffers.prototype.skip = function(i) {
[Inventory, GetData, NotFound].forEach(function(clazz) {
clazz.forBlock = creatorForItem(clazz, Inventory.TYPE.BLOCK);
clazz.forFilteredBlock = clazz.forMerkleBlock =
creatorForItem(clazz, Inventory.TYPE.FILTERED_BLOCK);
clazz.forTransaction = creatorForItem(clazz, Inventory.TYPE.TX);
});

View File

@ -105,7 +105,7 @@ util.inherits(Pool, EventEmitter);
Pool.MaxConnectedPeers = 8;
Pool.RetrySeconds = 30;
Pool.PeerEvents = ['version', 'inv', 'getdata', 'ping', 'pong', 'addr',
'getaddr', 'verack', 'reject', 'alert', 'headers', 'block',
'getaddr', 'verack', 'reject', 'alert', 'headers', 'block', 'merkleblock',
'tx', 'getblocks', 'getheaders', 'error', 'filterload', 'filteradd',
'filterclear'
];

View File

@ -77,5 +77,9 @@
"FILTERCLEAR": {
"message": "f9beb4d966696c7465726c6365617200000000005df6e0e2",
"payload": ""
},
"MERKLEBLOCK": {
"message": "f9beb4d96d65726b6c65626c6f636b00d7000000365913480100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b852907000000043612262624047ee87660be1a707519a443b1c1ce3d248cbfc6c15870f6c5daa2019f5b01d4195ecbc9398fbf3c3b1fa9bb3183301d7a1fb3bd174fcfa40a2b6541ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d06820d2a7bc994987302e5b1ac80fc425fe25f8b63169ea78e68fbaaefa59379bbf011d",
"payload": "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b852907000000043612262624047ee87660be1a707519a443b1c1ce3d248cbfc6c15870f6c5daa2019f5b01d4195ecbc9398fbf3c3b1fa9bb3183301d7a1fb3bd174fcfa40a2b6541ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d06820d2a7bc994987302e5b1ac80fc425fe25f8b63169ea78e68fbaaefa59379bbf011d"
}
}

View File

@ -27,6 +27,7 @@ describe('Messages', function() {
Alert: 'alert',
Reject: 'reject',
Block: 'block',
MerkleBlock: 'merkleblock',
FilterLoad: 'filterload',
FilterAdd: 'filteradd',
FilterClear: 'filterclear',
@ -111,10 +112,13 @@ describe('Messages', function() {
var hash = 'eb951630aba498b9a0d10f72b5ea9e39d5ff04b03dc2231e662f52057f948aa1';
[Messages.Inventory, Messages.GetData, Messages.NotFound].forEach(function(clazz) {
var b = clazz.forBlock(hash);
var mb = clazz.forMerkleBlock(hash);
(b instanceof clazz).should.equal(true);
var t = clazz.forTransaction(hash);
(t instanceof clazz).should.equal(true);
clazz.forBlock(BufferUtils.reverse(new Buffer(hash, 'hex'))).should.deep.equal(b);
clazz.forMerkleBlock(BufferUtils.reverse(new Buffer(hash, 'hex'))).should.deep.equal(mb);
clazz.forFilteredBlock(BufferUtils.reverse(new Buffer(hash, 'hex'))).should.deep.equal(mb);
clazz.forTransaction(BufferUtils.reverse(new Buffer(hash, 'hex'))).should.deep.equal(t);
});
});
@ -141,4 +145,10 @@ describe('Messages', function() {
msg.getPayload().toString('hex').should.equal(testPayload);
});
it('MerkleBlock#fromBuffer method works', function() {
var testPayload = Data.MERKLEBLOCK.payload;
var msg = new Messages.MerkleBlock().fromBuffer(new Buffer(testPayload, 'hex'));
msg.getPayload().toString('hex').should.equal(testPayload);
});
});