diff --git a/lib/bcoin/protocol/framer.js b/lib/bcoin/protocol/framer.js index 661be249..fd28a6de 100644 --- a/lib/bcoin/protocol/framer.js +++ b/lib/bcoin/protocol/framer.js @@ -516,7 +516,7 @@ Framer.witnessTX = function _witnessTX(tx) { + 2 + utils.sizeIntv(tx.inputs.length) + inputSize + utils.sizeIntv(tx.outputs.length) + outputSize - + utils.sizeIntv(witnesses.length) + witnessSize + + witnessSize + 4); off += utils.write32(p, tx.version, off); @@ -554,9 +554,8 @@ Framer.witnessBlockSize = function witnessBlockSize(block) { var size = 0; var i; - for (i = 0; i < block.txs.length; i++) { + for (i = 0; i < block.txs.length; i++) size += Framer.witnessTXSize(block.txs[i]); - } return size; }; @@ -564,7 +563,10 @@ Framer.witnessBlockSize = function witnessBlockSize(block) { Framer.witnessTXSize = function witnessTXSize(tx) { var off = 0; var size = 0; - var i, witness; + var i, j, witness; + + if (!tx.hasWitness()) + return size; for (i = 0; i < tx.inputs.length; i++) { witness = tx.inputs[i].witness; @@ -574,13 +576,13 @@ Framer.witnessTXSize = function witnessTXSize(tx) { size += utils.sizeIntv(witness.items.length); - for (i = 0; i < witness.items.length; i++) { - chunk = witness.items[i]; + for (j = 0; j < witness.items.length; j++) { + chunk = witness.items[j]; size += utils.sizeIntv(chunk.length) + chunk.length; } } - return size; + return size + 2; }; Framer.witness = function _witness(witness) { diff --git a/lib/bcoin/protocol/parser.js b/lib/bcoin/protocol/parser.js index ece7e462..e422cbbe 100644 --- a/lib/bcoin/protocol/parser.js +++ b/lib/bcoin/protocol/parser.js @@ -480,13 +480,11 @@ Parser.parseTX = function parseTX(p) { var inCount, txIn, tx; var outCount, txOut; var version, locktime, i; - var raw, block; + var raw; p = new BufferReader(p); p.start(); - block = p.offset !== 0; - if (Parser.isWitnessTX(p)) return Parser.parseWitnessTX(p); @@ -510,18 +508,29 @@ Parser.parseTX = function parseTX(p) { locktime = p.readU32(); + // raw = p.endData(); + return { version: version, + flag: 1, inputs: txIn, outputs: txOut, locktime: locktime, _witnessSize: 0, // _raw: raw, + // _size: raw.length _size: p.end() }; }; Parser.isWitnessTX = function isWitnessTX(p) { + if (Buffer.isBuffer(p)) { + if (p.length < 12) + return false; + + return p[4] === 0 && p[5] !== 0; + } + p = new BufferReader(p); if (p.left() < 12) @@ -536,13 +545,11 @@ Parser.parseWitnessTX = function parseWitnessTX(p) { var marker, flag; var version, locktime, i; var witnessSize = 0; - var raw, block; + var raw; p = new BufferReader(p); p.start(); - block = p.offset !== 0; - version = p.readU32(); marker = p.readU8(); flag = p.readU8(); @@ -577,14 +584,16 @@ Parser.parseWitnessTX = function parseWitnessTX(p) { locktime = p.readU32(); + // raw = p.endData(); + return { version: version, - marker: marker, flag: flag, inputs: txIn, outputs: txOut, locktime: locktime, // _raw: raw, + // _size: raw.length, _size: p.end(), _witnessSize: witnessSize + 2 }; diff --git a/lib/bcoin/tx.js b/lib/bcoin/tx.js index 3b4ddb5a..3ddefbe0 100644 --- a/lib/bcoin/tx.js +++ b/lib/bcoin/tx.js @@ -25,6 +25,7 @@ function TX(data, block, index) { this.type = 'tx'; this.version = data.version || 1; + this.flag = data.flag || 1; this.inputs = []; this.outputs = []; this.locktime = data.locktime || 0;