diff --git a/lib/bcoin/mtx.js b/lib/bcoin/mtx.js index be6055ca..c1435947 100644 --- a/lib/bcoin/mtx.js +++ b/lib/bcoin/mtx.js @@ -86,6 +86,7 @@ function MTX(options) { this._hashPrevouts = null; this._hashSequence = null; this._hashOutputs = null; + this._lastWitnessSize = 0; if (options.inputs) { for (i = 0; i < options.inputs.length; i++) @@ -100,6 +101,10 @@ function MTX(options) { utils.inherits(MTX, bcoin.tx); +MTX.fromOptions = function fromOptions(options) { + return new MTX(options); +}; + /** * Clone the transaction. * @returns {MTX} diff --git a/lib/bcoin/tx.js b/lib/bcoin/tx.js index 6dd7bc8c..38b69342 100644 --- a/lib/bcoin/tx.js +++ b/lib/bcoin/tx.js @@ -124,41 +124,39 @@ TX.fromOptions = function fromOptions(data) { */ TX.prototype.clone = function clone() { - var copy, i; + var copy = new TX(); + var i, input, output; - copy = { - version: this.version, - flag: this.flag, - inputs: [], - outputs: [], - locktime: this.locktime, - ts: this.ts, - block: this.block, - index: this.index, - height: this.height - }; + copy.ts = this.ts; + copy.block = this.block; + copy.index = this.index; + copy.height = this.height; + + copy.version = this.version; + copy.flag = this.flag; for (i = 0; i < this.inputs.length; i++) { - copy.inputs.push({ - prevout: { - hash: this.inputs[i].prevout.hash, - index: this.inputs[i].prevout.index - }, - coin: this.inputs[i].coin, - script: this.inputs[i].script, - witness: this.inputs[i].witness, - sequence: this.inputs[i].sequence - }); + input = new bcoin.input(); + input.prevout = new bcoin.outpoint(); + input.prevout.hash = this.inputs[i].prevout.hash; + input.prevout.index = this.inputs[i].prevout.index; + input.coin = this.inputs[i].coin; + input.script = this.inputs[i].script; + input.witness = this.inputs[i].witness; + input.sequence = this.inputs[i].sequence; + copy.inputs.push(input); } for (i = 0; i < this.outputs.length; i++) { - copy.outputs.push({ - value: this.outputs[i].value, - script: this.outputs[i].script - }); + output = new bcoin.output(); + output.value = this.outputs[i].value; + output.script = this.outputs[i].script; + copy.outputs.push(output); } - return new TX(copy); + copy.locktime = this.locktime; + + return copy; }; /** @@ -437,7 +435,9 @@ TX.prototype.signatureHash = function signatureHash(index, prev, type, version) TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { var p = new BufferWriter(); - var i, copy; + var empty = new Script(); + var witness = new bcoin.witness(); + var i, copy, input, output; if (typeof index !== 'number') index = this.inputs.indexOf(index); @@ -449,32 +449,31 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { assert(prev instanceof Script); // Clone the transaction. - copy = { - version: this.version, - flag: 1, - inputs: [], - outputs: [], - locktime: this.locktime - }; + copy = new TX(); + + copy.version = this.version; for (i = 0; i < this.inputs.length; i++) { - copy.inputs.push({ - prevout: this.inputs[i].prevout, - script: this.inputs[i].script, - sequence: this.inputs[i].sequence - }); + input = new bcoin.input(); + input.prevout = this.inputs[i].prevout; + input.script = this.inputs[i].script; + input.sequence = this.inputs[i].sequence; + input.witness = witness; + copy.inputs.push(input); } for (i = 0; i < this.outputs.length; i++) { - copy.outputs.push({ - value: this.outputs[i].value, - script: this.outputs[i].script - }); + output = new bcoin.output(); + output.value = this.outputs[i].value; + output.script = this.outputs[i].script; + copy.outputs.push(output); } + copy.locktime = this.locktime; + // Remove all signatures. for (i = 0; i < copy.inputs.length; i++) - copy.inputs[i].script = new Script(); + copy.inputs[i].script = empty; // Remove all code separators. prev = prev.removeSeparators(); @@ -503,7 +502,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { // Null outputs that are not the at current input index. for (i = 0; i < copy.outputs.length; i++) { if (i !== index) { - copy.outputs[i].script = new Script(); + copy.outputs[i].script = empty; copy.outputs[i].value = -1; } } @@ -522,7 +521,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { } // Render the copy and append the hashtype. - TX(copy).toRaw(p); + copy.toRaw(p); p.writeU32(type); return utils.dsha256(p.render());