diff --git a/src/transaction.js b/src/transaction.js index f645dca..cbd316c 100644 --- a/src/transaction.js +++ b/src/transaction.js @@ -241,7 +241,7 @@ Transaction.prototype.hashForSignature = function (inIndex, prevOutScript, hashT // serialize and hash var buffer = new Buffer(txTmp.byteLength() + 4) buffer.writeInt32LE(hashType, buffer.length - 4) - txTmp.toBuffer().copy(buffer, 0) + txTmp.toBuffer(buffer, 0) return bcrypto.hash256(buffer) } @@ -255,10 +255,10 @@ Transaction.prototype.getId = function () { return bufferReverse(this.getHash()).toString('hex') } -Transaction.prototype.toBuffer = function () { - var buffer = new Buffer(this.byteLength()) +Transaction.prototype.toBuffer = function (buffer, initialOffset) { + if (!buffer) buffer = new Buffer(this.byteLength()) - var offset = 0 + var offset = initialOffset || 0 function writeSlice (slice) { slice.copy(buffer, offset) offset += slice.length @@ -304,6 +304,9 @@ Transaction.prototype.toBuffer = function () { writeUInt32(this.locktime) + // avoid slicing unless necessary + if (initialOffset !== undefined) return buffer.slice(initialOffset, offset) + return buffer } diff --git a/test/transaction.js b/test/transaction.js index d11ab29..b17dbf8 100644 --- a/test/transaction.js +++ b/test/transaction.js @@ -67,6 +67,24 @@ describe('Transaction', function () { assert.strictEqual(actual.toHex(), f.hex, actual.toHex()) }) }) + + it('accepts target Buffer and offset parameters', function () { + var f = fixtures.valid[0] + var actual = fromRaw(f.raw) + var byteLength = actual.byteLength() + + var target = new Buffer(byteLength * 2) + var a = actual.toBuffer(target, 0) + var b = actual.toBuffer(target, byteLength) + + assert.strictEqual(a.length, byteLength) + assert.strictEqual(b.length, byteLength) + assert.strictEqual(a.toString('hex'), f.hex) + assert.strictEqual(b.toString('hex'), f.hex) + assert.deepEqual(a, b) + assert.deepEqual(a, target.slice(0, byteLength)) + assert.deepEqual(b, target.slice(byteLength)) + }) }) describe('addInput', function () {