it('should fail to parse >53 bit values', () => { const [input] = createInput(Math.floor(consensus.MAX_MONEY / 2)); const tx = new TX({ version: 1, inputs: [input], outputs: [{ script: [], value: 0xdeadbeef }], locktime: 0 }); let raw = tx.toRaw(); assert.strictEqual(encoding.readU64(raw, 47), 0xdeadbeef); raw[54] = 0x7f; assert.throws(() => TX.fromRaw(raw)); tx.outputs[0].value = 0; tx.refresh(); raw = tx.toRaw(); assert.strictEqual(encoding.readU64(raw, 47), 0x00); raw[54] = 0x80; assert.throws(() => TX.fromRaw(raw)); });
function sizeScript(script) { if (script.isPubkeyhash(true)) return 21; if (script.isScripthash()) return 21; const pk = script.getPubkey(true); if (pk) { if (publicKeyVerify(pk)) return 33; } let size = 0; size += encoding.sizeVarint(script.raw.length + COMPRESS_TYPES); size += script.raw.length; return size; }
function sizeOutput(output) { let size = 0; size += encoding.sizeVarint(output.value); size += sizeScript(output.script); return size; }
it('should write/read new varints', () => { /* * 0: [0x00] 256: [0x81 0x00] * 1: [0x01] 16383: [0xFE 0x7F] * 127: [0x7F] 16384: [0xFF 0x00] * 128: [0x80 0x00] 16511: [0x80 0xFF 0x7F] * 255: [0x80 0x7F] 65535: [0x82 0xFD 0x7F] * 2^32: [0x8E 0xFE 0xFE 0xFF 0x00] */ let b = Buffer.alloc(1, 0xff); encoding.writeVarint2(b, 0, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 0); assert.strictEqual(b.toString('hex'), '00'); b = Buffer.alloc(1, 0xff); encoding.writeVarint2(b, 1, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 1); assert.strictEqual(b.toString('hex'), '01'); b = Buffer.alloc(1, 0xff); encoding.writeVarint2(b, 127, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 127); assert.strictEqual(b.toString('hex'), '7f'); b = Buffer.alloc(2, 0xff); encoding.writeVarint2(b, 128, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 128); assert.strictEqual(b.toString('hex'), '8000'); b = Buffer.alloc(2, 0xff); encoding.writeVarint2(b, 255, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 255); assert.strictEqual(b.toString('hex'), '807f'); b = Buffer.alloc(2, 0xff); encoding.writeVarint2(b, 16383, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 16383); assert.strictEqual(b.toString('hex'), 'fe7f'); b = Buffer.alloc(2, 0xff); encoding.writeVarint2(b, 16384, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 16384); assert.strictEqual(b.toString('hex'), 'ff00'); b = Buffer.alloc(3, 0xff); encoding.writeVarint2(b, 16511, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 16511); assert.strictEqual(b.slice(0, 2).toString('hex'), 'ff7f'); // assert.strictEqual(b.toString('hex'), '80ff7f'); b = Buffer.alloc(3, 0xff); encoding.writeVarint2(b, 65535, 0); assert.strictEqual(encoding.readVarint2(b, 0).value, 65535); assert.strictEqual(b.toString('hex'), '82fe7f'); // assert.strictEqual(b.toString('hex'), '82fd7f'); b = Buffer.alloc(5, 0xff); encoding.writeVarint2(b, Math.pow(2, 32), 0); assert.strictEqual(encoding.readVarint2(b, 0).value, Math.pow(2, 32)); assert.strictEqual(b.toString('hex'), '8efefeff00'); });