Merge pull request #309 from bitcoinjs/txstring

Transaction function re-order
This commit is contained in:
Wei Lu 2014-11-09 10:03:06 +08:00
commit 787215e5da

View file

@ -22,6 +22,66 @@ Transaction.SIGHASH_NONE = 0x02
Transaction.SIGHASH_SINGLE = 0x03 Transaction.SIGHASH_SINGLE = 0x03
Transaction.SIGHASH_ANYONECANPAY = 0x80 Transaction.SIGHASH_ANYONECANPAY = 0x80
Transaction.fromBuffer = function(buffer) {
var offset = 0
function readSlice(n) {
offset += n
return buffer.slice(offset - n, offset)
}
function readUInt32() {
var i = buffer.readUInt32LE(offset)
offset += 4
return i
}
function readUInt64() {
var i = bufferutils.readUInt64LE(buffer, offset)
offset += 8
return i
}
function readVarInt() {
var vi = bufferutils.readVarInt(buffer, offset)
offset += vi.size
return vi.number
}
function readScript() {
return Script.fromBuffer(readSlice(readVarInt()))
}
var tx = new Transaction()
tx.version = readUInt32()
var vinLen = readVarInt()
for (var i = 0; i < vinLen; ++i) {
tx.ins.push({
hash: readSlice(32),
index: readUInt32(),
script: readScript(),
sequence: readUInt32()
})
}
var voutLen = readVarInt()
for (i = 0; i < voutLen; ++i) {
tx.outs.push({
value: readUInt64(),
script: readScript(),
})
}
tx.locktime = readUInt32()
assert.equal(offset, buffer.length, 'Transaction has unexpected data')
return tx
}
Transaction.fromHex = function(hex) {
return Transaction.fromBuffer(new Buffer(hex, 'hex'))
}
/** /**
* Create a new txin. * Create a new txin.
* *
@ -91,69 +151,28 @@ Transaction.prototype.addOutput = function(scriptPubKey, value) {
}) - 1) }) - 1)
} }
Transaction.prototype.toBuffer = function () { Transaction.prototype.clone = function () {
var txInSize = this.ins.reduce(function(a, x) { var newTx = new Transaction()
return a + (40 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length) newTx.version = this.version
}, 0) newTx.locktime = this.locktime
var txOutSize = this.outs.reduce(function(a, x) { newTx.ins = this.ins.map(function(txin) {
return a + (8 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length) return {
}, 0) hash: txin.hash,
index: txin.index,
var buffer = new Buffer( script: txin.script,
8 + sequence: txin.sequence
bufferutils.varIntSize(this.ins.length) +
bufferutils.varIntSize(this.outs.length) +
txInSize +
txOutSize
)
var offset = 0
function writeSlice(slice) {
slice.copy(buffer, offset)
offset += slice.length
} }
function writeUInt32(i) {
buffer.writeUInt32LE(i, offset)
offset += 4
}
function writeUInt64(i) {
bufferutils.writeUInt64LE(buffer, i, offset)
offset += 8
}
function writeVarInt(i) {
var n = bufferutils.writeVarInt(buffer, i, offset)
offset += n
}
writeUInt32(this.version)
writeVarInt(this.ins.length)
this.ins.forEach(function(txin) {
writeSlice(txin.hash)
writeUInt32(txin.index)
writeVarInt(txin.script.buffer.length)
writeSlice(txin.script.buffer)
writeUInt32(txin.sequence)
}) })
writeVarInt(this.outs.length) newTx.outs = this.outs.map(function(txout) {
this.outs.forEach(function(txout) { return {
writeUInt64(txout.value) script: txout.script,
writeVarInt(txout.script.buffer.length) value: txout.value
writeSlice(txout.script.buffer) }
}) })
writeUInt32(this.locktime) return newTx
return buffer
}
Transaction.prototype.toHex = function() {
return this.toBuffer().toString('hex')
} }
/** /**
@ -220,88 +239,69 @@ Transaction.prototype.getId = function () {
return bufferutils.reverse(this.getHash()).toString('hex') return bufferutils.reverse(this.getHash()).toString('hex')
} }
Transaction.prototype.clone = function () { Transaction.prototype.toBuffer = function () {
var newTx = new Transaction() var txInSize = this.ins.reduce(function(a, x) {
newTx.version = this.version return a + (40 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
newTx.locktime = this.locktime }, 0)
newTx.ins = this.ins.map(function(txin) { var txOutSize = this.outs.reduce(function(a, x) {
return { return a + (8 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
hash: txin.hash, }, 0)
index: txin.index,
script: txin.script,
sequence: txin.sequence
}
})
newTx.outs = this.outs.map(function(txout) { var buffer = new Buffer(
return { 8 +
script: txout.script, bufferutils.varIntSize(this.ins.length) +
value: txout.value bufferutils.varIntSize(this.outs.length) +
} txInSize +
}) txOutSize
)
return newTx
}
Transaction.fromBuffer = function(buffer) {
var offset = 0 var offset = 0
function readSlice(n) { function writeSlice(slice) {
offset += n slice.copy(buffer, offset)
return buffer.slice(offset - n, offset) offset += slice.length
} }
function readUInt32() { function writeUInt32(i) {
var i = buffer.readUInt32LE(offset) buffer.writeUInt32LE(i, offset)
offset += 4 offset += 4
return i
} }
function readUInt64() { function writeUInt64(i) {
var i = bufferutils.readUInt64LE(buffer, offset) bufferutils.writeUInt64LE(buffer, i, offset)
offset += 8 offset += 8
return i
} }
function readVarInt() { function writeVarInt(i) {
var vi = bufferutils.readVarInt(buffer, offset) var n = bufferutils.writeVarInt(buffer, i, offset)
offset += vi.size offset += n
return vi.number
} }
function readScript() { writeUInt32(this.version)
return Script.fromBuffer(readSlice(readVarInt())) writeVarInt(this.ins.length)
}
var tx = new Transaction() this.ins.forEach(function(txin) {
tx.version = readUInt32() writeSlice(txin.hash)
writeUInt32(txin.index)
var vinLen = readVarInt() writeVarInt(txin.script.buffer.length)
for (var i = 0; i < vinLen; ++i) { writeSlice(txin.script.buffer)
tx.ins.push({ writeUInt32(txin.sequence)
hash: readSlice(32),
index: readUInt32(),
script: readScript(),
sequence: readUInt32()
}) })
}
var voutLen = readVarInt() writeVarInt(this.outs.length)
for (i = 0; i < voutLen; ++i) { this.outs.forEach(function(txout) {
tx.outs.push({ writeUInt64(txout.value)
value: readUInt64(), writeVarInt(txout.script.buffer.length)
script: readScript(), writeSlice(txout.script.buffer)
}) })
writeUInt32(this.locktime)
return buffer
} }
tx.locktime = readUInt32() Transaction.prototype.toHex = function() {
assert.equal(offset, buffer.length, 'Transaction has unexpected data') return this.toBuffer().toString('hex')
return tx
}
Transaction.fromHex = function(hex) {
return Transaction.fromBuffer(new Buffer(hex, 'hex'))
} }
Transaction.prototype.setInputScript = function(index, script) { Transaction.prototype.setInputScript = function(index, script) {