add BufferReader.readVarLengthBuffer
This commit is contained in:
parent
b9be679e09
commit
c664f211d2
@ -10,9 +10,10 @@ var BufferReader = function BufferReader(buf) {
|
|||||||
return new BufferReader(buf);
|
return new BufferReader(buf);
|
||||||
}
|
}
|
||||||
if (Buffer.isBuffer(buf)) {
|
if (Buffer.isBuffer(buf)) {
|
||||||
this.set({buf: buf});
|
this.set({
|
||||||
}
|
buf: buf
|
||||||
else if (buf) {
|
});
|
||||||
|
} else if (buf) {
|
||||||
var obj = buf;
|
var obj = buf;
|
||||||
this.set(obj);
|
this.set(obj);
|
||||||
}
|
}
|
||||||
@ -82,7 +83,9 @@ BufferReader.prototype.readUInt64BEBN = function() {
|
|||||||
|
|
||||||
BufferReader.prototype.readUInt64LEBN = function() {
|
BufferReader.prototype.readUInt64LEBN = function() {
|
||||||
var buf = this.buf.slice(this.pos, this.pos + 8);
|
var buf = this.buf.slice(this.pos, this.pos + 8);
|
||||||
var reversebuf = BufferReader({buf: buf}).readReverse();
|
var reversebuf = BufferReader({
|
||||||
|
buf: buf
|
||||||
|
}).readReverse();
|
||||||
var bn = BN.fromBuffer(reversebuf);
|
var bn = BN.fromBuffer(reversebuf);
|
||||||
this.pos = this.pos + 8;
|
this.pos = this.pos + 8;
|
||||||
return bn;
|
return bn;
|
||||||
@ -109,6 +112,17 @@ BufferReader.prototype.readVarintNum = function() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reads a length prepended buffer
|
||||||
|
*/
|
||||||
|
BufferReader.prototype.readVarLengthBuffer = function() {
|
||||||
|
var len = this.readVarintNum();
|
||||||
|
var buf = this.read(len);
|
||||||
|
$.checkState(buf.length === len, 'Invalid length while reading varlength buffer. ' +
|
||||||
|
'Expected to read: ' + len + ' and read ' + buf.length);
|
||||||
|
return buf;
|
||||||
|
};
|
||||||
|
|
||||||
BufferReader.prototype.readVarintBuf = function() {
|
BufferReader.prototype.readVarintBuf = function() {
|
||||||
var first = this.buf.readUInt8(this.pos);
|
var first = this.buf.readUInt8(this.pos);
|
||||||
switch (first) {
|
switch (first) {
|
||||||
|
|||||||
@ -56,7 +56,7 @@ Script.fromBuffer = function(buffer) {
|
|||||||
script.chunks = [];
|
script.chunks = [];
|
||||||
|
|
||||||
var br = new BufferReader(buffer);
|
var br = new BufferReader(buffer);
|
||||||
while (!br.eof()) {
|
while (!br.finished()) {
|
||||||
var opcodenum = br.readUInt8();
|
var opcodenum = br.readUInt8();
|
||||||
|
|
||||||
var len, buf;
|
var len, buf;
|
||||||
|
|||||||
@ -79,12 +79,7 @@ Input.fromBufferReader = function(br) {
|
|||||||
var input = new Input();
|
var input = new Input();
|
||||||
input.prevTxId = br.readReverse(32);
|
input.prevTxId = br.readReverse(32);
|
||||||
input.outputIndex = br.readUInt32LE();
|
input.outputIndex = br.readUInt32LE();
|
||||||
var scriptSize = br.readVarintNum();
|
input._scriptBuffer = br.readVarLengthBuffer();
|
||||||
if (scriptSize) {
|
|
||||||
input._scriptBuffer = br.read(scriptSize);
|
|
||||||
} else {
|
|
||||||
input._scriptBuffer = new buffer.Buffer([]);
|
|
||||||
}
|
|
||||||
input.sequenceNumber = br.readUInt32LE();
|
input.sequenceNumber = br.readUInt32LE();
|
||||||
return input;
|
return input;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -7,7 +7,7 @@ var BufferReader = bitcore.encoding.BufferReader;
|
|||||||
var BN = bitcore.crypto.BN;
|
var BN = bitcore.crypto.BN;
|
||||||
|
|
||||||
describe('BufferReader', function() {
|
describe('BufferReader', function() {
|
||||||
|
|
||||||
it('should make a new BufferReader', function() {
|
it('should make a new BufferReader', function() {
|
||||||
var br = new BufferReader();
|
var br = new BufferReader();
|
||||||
should.exist(br);
|
should.exist(br);
|
||||||
@ -25,7 +25,9 @@ describe('BufferReader', function() {
|
|||||||
describe('#set', function() {
|
describe('#set', function() {
|
||||||
|
|
||||||
it('should set pos', function() {
|
it('should set pos', function() {
|
||||||
should.exist(BufferReader().set({pos: 1}).pos);
|
should.exist(BufferReader().set({
|
||||||
|
pos: 1
|
||||||
|
}).pos);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -33,17 +35,19 @@ describe('BufferReader', function() {
|
|||||||
describe('#eof', function() {
|
describe('#eof', function() {
|
||||||
|
|
||||||
it('should return true for a blank br', function() {
|
it('should return true for a blank br', function() {
|
||||||
var br = new BufferReader({buf: new Buffer([])});
|
var br = new BufferReader({
|
||||||
|
buf: new Buffer([])
|
||||||
|
});
|
||||||
br.eof().should.equal(true);
|
br.eof().should.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('read', function() {
|
describe('read', function() {
|
||||||
|
|
||||||
it('should return the same buffer', function() {
|
it('should return the same buffer', function() {
|
||||||
var buf = new Buffer([0]);
|
var buf = new Buffer([0]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readAll().toString('hex').should.equal(buf.toString('hex'));
|
br.readAll().toString('hex').should.equal(buf.toString('hex'));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -53,10 +57,49 @@ describe('BufferReader', function() {
|
|||||||
var br = new BufferReader(buf);
|
var br = new BufferReader(buf);
|
||||||
var buf2 = br.read(2);
|
var buf2 = br.read(2);
|
||||||
buf2.length.should.equal(2);
|
buf2.length.should.equal(2);
|
||||||
br.eof().should.equal(false);
|
br.finished().should.equal(false);
|
||||||
br.pos.should.equal(2);
|
br.pos.should.equal(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should work with 0 length', function() {
|
||||||
|
var buf = new Buffer(10);
|
||||||
|
buf.fill(1);
|
||||||
|
var br = new BufferReader(buf);
|
||||||
|
var buf2 = br.read(0);
|
||||||
|
buf2.length.should.equal(0);
|
||||||
|
br.finished().should.equal(false);
|
||||||
|
buf2.toString('hex').should.equal('');
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('readVarLengthBuffer', function() {
|
||||||
|
|
||||||
|
it('returns correct buffer', function() {
|
||||||
|
var buf = new Buffer('73010000003766404f00000000b305434f00000000f203' +
|
||||||
|
'0000f1030000001027000048ee00000064000000004653656520626974636f696' +
|
||||||
|
'e2e6f72672f666562323020696620796f7520686176652074726f75626c652063' +
|
||||||
|
'6f6e6e656374696e6720616674657220323020466562727561727900473045022' +
|
||||||
|
'1008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b53' +
|
||||||
|
'eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e' +
|
||||||
|
'8a4f1', 'hex');
|
||||||
|
var br = new BufferReader(buf);
|
||||||
|
var b1 = br.readVarLengthBuffer();
|
||||||
|
b1.toString('hex').should.equal('010000003766404f00000000b305434f000' +
|
||||||
|
'00000f2030000f1030000001027000048ee000000640000000046536565206269' +
|
||||||
|
'74636f696e2e6f72672f666562323020696620796f7520686176652074726f756' +
|
||||||
|
'26c6520636f6e6e656374696e6720616674657220323020466562727561727900');
|
||||||
|
var b2 = br.readVarLengthBuffer();
|
||||||
|
b2.toString('hex').should.equal('30450221008389df45f0703f39ec8c1cc42' +
|
||||||
|
'c13810ffcae14995bb648340219e353b63b53eb022009ec65e1c1aaeec1fd334c' +
|
||||||
|
'6b684bde2b3f573060d5b70c3a46723326e4e8a4f1');
|
||||||
|
});
|
||||||
|
it('fails on length too big', function() {
|
||||||
|
var buf = new Buffer('0a00', 'hex');
|
||||||
|
var br = new BufferReader(buf);
|
||||||
|
br.readVarLengthBuffer.bind(br).should.throw('Invalid length while reading varlength buffer');
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#readUInt8', function() {
|
describe('#readUInt8', function() {
|
||||||
@ -64,7 +107,7 @@ describe('BufferReader', function() {
|
|||||||
it('should return 1', function() {
|
it('should return 1', function() {
|
||||||
var buf = new Buffer(1);
|
var buf = new Buffer(1);
|
||||||
buf.writeUInt8(1, 0);
|
buf.writeUInt8(1, 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt8().should.equal(1);
|
br.readUInt8().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -75,7 +118,7 @@ describe('BufferReader', function() {
|
|||||||
it('should return 1', function() {
|
it('should return 1', function() {
|
||||||
var buf = new Buffer(2);
|
var buf = new Buffer(2);
|
||||||
buf.writeUInt16BE(1, 0);
|
buf.writeUInt16BE(1, 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt16BE().should.equal(1);
|
br.readUInt16BE().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -86,7 +129,7 @@ describe('BufferReader', function() {
|
|||||||
it('should return 1', function() {
|
it('should return 1', function() {
|
||||||
var buf = new Buffer(2);
|
var buf = new Buffer(2);
|
||||||
buf.writeUInt16LE(1, 0);
|
buf.writeUInt16LE(1, 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt16LE().should.equal(1);
|
br.readUInt16LE().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -97,7 +140,7 @@ describe('BufferReader', function() {
|
|||||||
it('should return 1', function() {
|
it('should return 1', function() {
|
||||||
var buf = new Buffer(4);
|
var buf = new Buffer(4);
|
||||||
buf.writeUInt32BE(1, 0);
|
buf.writeUInt32BE(1, 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt32BE().should.equal(1);
|
br.readUInt32BE().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -108,7 +151,7 @@ describe('BufferReader', function() {
|
|||||||
it('should return 1', function() {
|
it('should return 1', function() {
|
||||||
var buf = new Buffer(4);
|
var buf = new Buffer(4);
|
||||||
buf.writeUInt32LE(1, 0);
|
buf.writeUInt32LE(1, 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt32LE().should.equal(1);
|
br.readUInt32LE().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -120,14 +163,14 @@ describe('BufferReader', function() {
|
|||||||
var buf = new Buffer(8);
|
var buf = new Buffer(8);
|
||||||
buf.fill(0);
|
buf.fill(0);
|
||||||
buf.writeUInt32BE(1, 4);
|
buf.writeUInt32BE(1, 4);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt64BEBN().toNumber().should.equal(1);
|
br.readUInt64BEBN().toNumber().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return 2^64', function() {
|
it('should return 2^64', function() {
|
||||||
var buf = new Buffer(8);
|
var buf = new Buffer(8);
|
||||||
buf.fill(0xff);
|
buf.fill(0xff);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt64BEBN().toNumber().should.equal(Math.pow(2, 64));
|
br.readUInt64BEBN().toNumber().should.equal(Math.pow(2, 64));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -139,7 +182,7 @@ describe('BufferReader', function() {
|
|||||||
var buf = new Buffer(8);
|
var buf = new Buffer(8);
|
||||||
buf.fill(0);
|
buf.fill(0);
|
||||||
buf.writeUInt32LE(1, 0);
|
buf.writeUInt32LE(1, 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt64LEBN().toNumber().should.equal(1);
|
br.readUInt64LEBN().toNumber().should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -147,21 +190,21 @@ describe('BufferReader', function() {
|
|||||||
var buf = new Buffer(8);
|
var buf = new Buffer(8);
|
||||||
buf.fill(0);
|
buf.fill(0);
|
||||||
buf.writeUInt32LE(Math.pow(2, 30), 0);
|
buf.writeUInt32LE(Math.pow(2, 30), 0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 30));
|
br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 30));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return 0', function() {
|
it('should return 0', function() {
|
||||||
var buf = new Buffer(8);
|
var buf = new Buffer(8);
|
||||||
buf.fill(0);
|
buf.fill(0);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt64LEBN().toNumber().should.equal(0);
|
br.readUInt64LEBN().toNumber().should.equal(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return 2^64', function() {
|
it('should return 2^64', function() {
|
||||||
var buf = new Buffer(8);
|
var buf = new Buffer(8);
|
||||||
buf.fill(0xff);
|
buf.fill(0xff);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 64));
|
br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 64));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -171,26 +214,26 @@ describe('BufferReader', function() {
|
|||||||
|
|
||||||
it('should read a 1 byte varint', function() {
|
it('should read a 1 byte varint', function() {
|
||||||
var buf = new Buffer([50]);
|
var buf = new Buffer([50]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBuf().length.should.equal(1);
|
br.readVarintBuf().length.should.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 3 byte varint', function() {
|
it('should read a 3 byte varint', function() {
|
||||||
var buf = new Buffer([253, 253, 0]);
|
var buf = new Buffer([253, 253, 0]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBuf().length.should.equal(3);
|
br.readVarintBuf().length.should.equal(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 5 byte varint', function() {
|
it('should read a 5 byte varint', function() {
|
||||||
var buf = new Buffer([254, 0, 0, 0, 0]);
|
var buf = new Buffer([254, 0, 0, 0, 0]);
|
||||||
buf.writeUInt32LE(50000, 1);
|
buf.writeUInt32LE(50000, 1);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBuf().length.should.equal(5);
|
br.readVarintBuf().length.should.equal(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 9 byte varint', function() {
|
it('should read a 9 byte varint', function() {
|
||||||
var buf = BufferWriter().writeVarintBN(BN(Math.pow(2, 54).toString())).concat();
|
var buf = BufferWriter().writeVarintBN(BN(Math.pow(2, 54).toString())).concat();
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBuf().length.should.equal(9);
|
br.readVarintBuf().length.should.equal(9);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -200,26 +243,26 @@ describe('BufferReader', function() {
|
|||||||
|
|
||||||
it('should read a 1 byte varint', function() {
|
it('should read a 1 byte varint', function() {
|
||||||
var buf = new Buffer([50]);
|
var buf = new Buffer([50]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintNum().should.equal(50);
|
br.readVarintNum().should.equal(50);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 3 byte varint', function() {
|
it('should read a 3 byte varint', function() {
|
||||||
var buf = new Buffer([253, 253, 0]);
|
var buf = new Buffer([253, 253, 0]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintNum().should.equal(253);
|
br.readVarintNum().should.equal(253);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 5 byte varint', function() {
|
it('should read a 5 byte varint', function() {
|
||||||
var buf = new Buffer([254, 0, 0, 0, 0]);
|
var buf = new Buffer([254, 0, 0, 0, 0]);
|
||||||
buf.writeUInt32LE(50000, 1);
|
buf.writeUInt32LE(50000, 1);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintNum().should.equal(50000);
|
br.readVarintNum().should.equal(50000);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error on a 9 byte varint over the javascript uint precision limit', function() {
|
it('should throw an error on a 9 byte varint over the javascript uint precision limit', function() {
|
||||||
var buf = BufferWriter().writeVarintBN(BN(Math.pow(2, 54).toString())).concat();
|
var buf = BufferWriter().writeVarintBN(BN(Math.pow(2, 54).toString())).concat();
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
(function() {
|
(function() {
|
||||||
br.readVarintNum();
|
br.readVarintNum();
|
||||||
}).should.throw('number too large to retain precision - use readVarintBN');
|
}).should.throw('number too large to retain precision - use readVarintBN');
|
||||||
@ -227,7 +270,7 @@ describe('BufferReader', function() {
|
|||||||
|
|
||||||
it('should not throw an error on a 9 byte varint not over the javascript uint precision limit', function() {
|
it('should not throw an error on a 9 byte varint not over the javascript uint precision limit', function() {
|
||||||
var buf = BufferWriter().writeVarintBN(BN(Math.pow(2, 53).toString())).concat();
|
var buf = BufferWriter().writeVarintBN(BN(Math.pow(2, 53).toString())).concat();
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
(function() {
|
(function() {
|
||||||
br.readVarintNum();
|
br.readVarintNum();
|
||||||
}).should.not.throw('number too large to retain precision - use readVarintBN');
|
}).should.not.throw('number too large to retain precision - use readVarintBN');
|
||||||
@ -239,36 +282,36 @@ describe('BufferReader', function() {
|
|||||||
|
|
||||||
it('should read a 1 byte varint', function() {
|
it('should read a 1 byte varint', function() {
|
||||||
var buf = new Buffer([50]);
|
var buf = new Buffer([50]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBN().toNumber().should.equal(50);
|
br.readVarintBN().toNumber().should.equal(50);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 3 byte varint', function() {
|
it('should read a 3 byte varint', function() {
|
||||||
var buf = new Buffer([253, 253, 0]);
|
var buf = new Buffer([253, 253, 0]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBN().toNumber().should.equal(253);
|
br.readVarintBN().toNumber().should.equal(253);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 5 byte varint', function() {
|
it('should read a 5 byte varint', function() {
|
||||||
var buf = new Buffer([254, 0, 0, 0, 0]);
|
var buf = new Buffer([254, 0, 0, 0, 0]);
|
||||||
buf.writeUInt32LE(50000, 1);
|
buf.writeUInt32LE(50000, 1);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBN().toNumber().should.equal(50000);
|
br.readVarintBN().toNumber().should.equal(50000);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 9 byte varint', function() {
|
it('should read a 9 byte varint', function() {
|
||||||
var buf = Buffer.concat([new Buffer([255]), new Buffer('ffffffffffffffff', 'hex')]);
|
var buf = Buffer.concat([new Buffer([255]), new Buffer('ffffffffffffffff', 'hex')]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.readVarintBN().toNumber().should.equal(Math.pow(2, 64));
|
br.readVarintBN().toNumber().should.equal(Math.pow(2, 64));
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#reverse', function() {
|
describe('#reverse', function() {
|
||||||
|
|
||||||
it('should reverse this [0, 1]', function() {
|
it('should reverse this [0, 1]', function() {
|
||||||
var buf = new Buffer([0, 1]);
|
var buf = new Buffer([0, 1]);
|
||||||
var br = new BufferReader({buf: buf});
|
var br = new BufferReader(buf);
|
||||||
br.reverse().readAll().toString('hex').should.equal('0100');
|
br.reverse().readAll().toString('hex').should.equal('0100');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user