bip152: fixes and tests.
This commit is contained in:
parent
2feef87331
commit
0ffafa3238
@ -51,7 +51,7 @@ CompactBlock.prototype._verify = function _verify(ret) {
|
||||
};
|
||||
|
||||
CompactBlock.prototype.fromOptions = function fromOptions(options) {
|
||||
assert(bn.isBN(options.keyNonce));
|
||||
assert(Buffer.isBuffer(options.keyNonce));
|
||||
assert(Array.isArray(options.ids));
|
||||
assert(Array.isArray(options.ptx));
|
||||
|
||||
@ -92,7 +92,7 @@ CompactBlock.prototype.fromRaw = function fromRaw(data) {
|
||||
this.bits = p.readU32();
|
||||
this.nonce = p.readU32();
|
||||
|
||||
this.keyNonce = p.readU64();
|
||||
this.keyNonce = p.readBytes(8);
|
||||
|
||||
this.initKey();
|
||||
|
||||
@ -120,7 +120,9 @@ CompactBlock.prototype.fromRaw = function fromRaw(data) {
|
||||
return this;
|
||||
};
|
||||
|
||||
CompactBlock.fromRaw = function fromRaw(data) {
|
||||
CompactBlock.fromRaw = function fromRaw(data, enc) {
|
||||
if (typeof data === 'string')
|
||||
data = new Buffer(data, enc);
|
||||
return new CompactBlock().fromRaw(data);
|
||||
};
|
||||
|
||||
@ -135,7 +137,7 @@ CompactBlock.prototype.toRaw = function toRaw(witness, writer) {
|
||||
p.writeU32(this.bits);
|
||||
p.writeU32(this.nonce);
|
||||
|
||||
p.writeU64(this.keyNonce);
|
||||
p.writeBytes(this.keyNonce);
|
||||
|
||||
p.writeVarint2(this.ids.length);
|
||||
|
||||
@ -239,8 +241,8 @@ CompactBlock.prototype.sid = function sid(hash) {
|
||||
|
||||
hash = siphash(hash, this.k0, this.k1);
|
||||
|
||||
return hash.readUInt32LE(2, true)
|
||||
+ hash.readUInt16LE(6, true)
|
||||
return hash.readUInt32LE(0, true)
|
||||
+ hash.readUInt16LE(4, true)
|
||||
* 0x100000000;
|
||||
};
|
||||
|
||||
@ -249,8 +251,7 @@ CompactBlock.prototype.hasIndex = function hasIndex(index) {
|
||||
};
|
||||
|
||||
CompactBlock.prototype.initKey = function initKey() {
|
||||
var nonce = this.keyNonce.toArrayLike(Buffer, 'be', 8);
|
||||
var data = Buffer.concat([this.abbr(), nonce]);
|
||||
var data = Buffer.concat([this.abbr(), this.keyNonce]);
|
||||
var hash = utils.sha256(data);
|
||||
this.k0 = hash.slice(0, 8);
|
||||
this.k1 = hash.slice(8, 16);
|
||||
@ -322,7 +323,7 @@ CompactBlock.prototype.toBlock = function toBlock() {
|
||||
return block;
|
||||
};
|
||||
|
||||
CompactBlock.prototype.fromBlock = function fromBlock(block) {
|
||||
CompactBlock.prototype.fromBlock = function fromBlock(block, nonce) {
|
||||
var i, tx, id;
|
||||
|
||||
this.version = block.version;
|
||||
@ -333,7 +334,10 @@ CompactBlock.prototype.fromBlock = function fromBlock(block) {
|
||||
this.nonce = block.nonce;
|
||||
this.totalTX = block.totalTX;
|
||||
|
||||
this.keyNonce = utils.nonce();
|
||||
if (!nonce)
|
||||
nonce = utils.nonce().toArrayLike(Buffer, 'be', 8);
|
||||
|
||||
this.keyNonce = nonce;
|
||||
|
||||
this.initKey();
|
||||
|
||||
@ -348,8 +352,8 @@ CompactBlock.prototype.fromBlock = function fromBlock(block) {
|
||||
return this;
|
||||
};
|
||||
|
||||
CompactBlock.fromBlock = function fromBlock(block) {
|
||||
return new CompactBlock().fromBlock(block);
|
||||
CompactBlock.fromBlock = function fromBlock(block, nonce) {
|
||||
return new CompactBlock().fromBlock(block, nonce);
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@ -7,6 +7,9 @@ var constants = bcoin.protocol.constants;
|
||||
var network = bcoin.protocol.network;
|
||||
var assert = require('assert');
|
||||
var block300025 = require('./data/block300025.json');
|
||||
var fs = require('fs');
|
||||
var cmpct = fs.readFileSync(__dirname + '/data/compactblock.hex', 'utf8').trim().split('\n');
|
||||
var bip152 = require('../lib/bcoin/bip152');
|
||||
|
||||
describe('Block', function() {
|
||||
var parser = bcoin.protocol.parser;
|
||||
@ -204,4 +207,39 @@ describe('Block', function() {
|
||||
var headers = new bcoin.headers(block);
|
||||
assert(headers.verify());
|
||||
});
|
||||
|
||||
it('should handle compact block', function(cb) {
|
||||
var cblock = bip152.CompactBlock.fromRaw(cmpct[0], 'hex');
|
||||
var block = bcoin.block.fromRaw(cmpct[1], 'hex');
|
||||
var map = {};
|
||||
|
||||
assert.equal(cblock.toRaw().toString('hex'), cmpct[0]);
|
||||
var cblock2 = bip152.CompactBlock.fromBlock(block, cblock.keyNonce);
|
||||
assert.equal(cblock2.toRaw().toString('hex'), cmpct[0]);
|
||||
|
||||
for (var i = 0; i < block.txs.length; i++) {
|
||||
var tx = block.txs[i];
|
||||
map[tx.hash('hex')] = tx;
|
||||
}
|
||||
|
||||
var fakeMempool = {
|
||||
getSnapshot: function(callback) {
|
||||
callback(null, Object.keys(map));
|
||||
},
|
||||
getTX: function(hash, callback) {
|
||||
callback(null, map[hash]);
|
||||
}
|
||||
};
|
||||
|
||||
var realID = 125673511480291;
|
||||
assert(cblock.sid(block.txs[1].hash('hex')) === realID);
|
||||
|
||||
cblock.fillMempool(fakeMempool, function(err, result) {
|
||||
assert.ifError(err);
|
||||
assert(result);
|
||||
for (var i = 0; i < cblock.available.length; i++)
|
||||
assert(cblock.available[i]);
|
||||
cb();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
2
test/data/compactblock.hex
Normal file
2
test/data/compactblock.hex
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user