Merge pull request #507 from bitcoinjs/locktime

txbuilder: add setLockTime
This commit is contained in:
JP Richardson 2016-01-27 08:29:00 -06:00
commit 4ee194e840
4 changed files with 54 additions and 8 deletions

View file

@ -4,6 +4,8 @@ var bscript = require('./script')
var bufferEquals = require('buffer-equals') var bufferEquals = require('buffer-equals')
var networks = require('./networks') var networks = require('./networks')
var ops = require('./opcodes') var ops = require('./opcodes')
var typeforce = require('typeforce')
var types = require('./types')
var ECPair = require('./ecpair') var ECPair = require('./ecpair')
var ECSignature = require('./ecsignature') var ECSignature = require('./ecsignature')
@ -135,6 +137,21 @@ function TransactionBuilder (network) {
this.tx = new Transaction() this.tx = new Transaction()
} }
TransactionBuilder.prototype.setLockTime = function (locktime) {
typeforce(types.UInt32, locktime)
// if any signatures exist, throw
if (this.inputs.some(function (input) {
if (!input.signatures) return false
return input.signatures.some(function (s) { return s })
})) {
throw new Error('No, this would invalidate signatures')
}
this.tx.locktime = locktime
}
TransactionBuilder.fromTransaction = function (transaction, network) { TransactionBuilder.fromTransaction = function (transaction, network) {
var txb = new TransactionBuilder(network) var txb = new TransactionBuilder(network)

View file

@ -263,6 +263,28 @@
"value": 10000 "value": 10000
} }
] ]
},
{
"description": "Transaction w/ nLockTime, pubKeyHash -> pubKeyHash",
"txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006b483045022100a3b254e1c10b5d039f36c05f323995d6e5a367d98dd78a13d5bbc3991b35720e022022fccea3897d594de0689601fbd486588d5bfa6915be2386db0397ee9a6e80b601210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588acffff0000",
"locktime": 65535,
"inputs": [
{
"txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"vout": 0,
"signs": [
{
"keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn"
}
]
}
],
"outputs": [
{
"script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG",
"value": 10000
}
]
} }
], ],
"fromTransaction": [ "fromTransaction": [

View file

@ -95,13 +95,11 @@ describe('bitcoinjs-lib (advanced)', function () {
this.timeout(30000) this.timeout(30000)
var tx2 = new bitcoin.TransactionBuilder(network) var tx2 = new bitcoin.TransactionBuilder(network)
// tx2.setLockTime(threeHoursAgo) // TODO tx2.setLockTime(threeHoursAgo)
tx2.addInput(txId, 0, 0xfffffffe) tx2.addInput(txId, 0, 0xfffffffe)
tx2.addOutput(alice.getAddress(), 1000) tx2.addOutput(alice.getAddress(), 1000)
var tx2Raw = tx2.buildIncomplete() var tx2Raw = tx2.buildIncomplete()
tx2Raw.locktime = threeHoursAgo // TODO
var hashType = bitcoin.Transaction.SIGHASH_ALL var hashType = bitcoin.Transaction.SIGHASH_ALL
var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType) var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType)
var signature = alice.sign(signatureHash) var signature = alice.sign(signatureHash)
@ -120,13 +118,11 @@ describe('bitcoinjs-lib (advanced)', function () {
this.timeout(30000) this.timeout(30000)
var tx2 = new bitcoin.TransactionBuilder(network) var tx2 = new bitcoin.TransactionBuilder(network)
// tx2.setLockTime(threeHoursAgo) // TODO tx2.setLockTime(threeHoursAgo)
tx2.addInput(txId, 0, 0xfffffffe) tx2.addInput(txId, 0, 0xfffffffe)
tx2.addOutput(alice.getAddress(), 1000) tx2.addOutput(alice.getAddress(), 1000)
var tx2Raw = tx2.buildIncomplete() var tx2Raw = tx2.buildIncomplete()
tx2Raw.locktime = threeHoursAgo // TODO
var hashType = bitcoin.Transaction.SIGHASH_ALL var hashType = bitcoin.Transaction.SIGHASH_ALL
var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType) var signatureHash = tx2Raw.hashForSignature(0, redeemScript, hashType)
var signatureA = alice.sign(signatureHash) var signatureA = alice.sign(signatureHash)

View file

@ -17,13 +17,13 @@ function construct (f, sign) {
var network = NETWORKS[f.network] var network = NETWORKS[f.network]
var txb = new TransactionBuilder(network) var txb = new TransactionBuilder(network)
// FIXME: add support for locktime/version in TransactionBuilder API // FIXME: add support for version in TransactionBuilder API
if (f.version !== undefined) { if (f.version !== undefined) {
txb.tx.version = f.version txb.tx.version = f.version
} }
if (f.locktime !== undefined) { if (f.locktime !== undefined) {
txb.tx.locktime = f.locktime txb.setLockTime(f.locktime)
} }
f.inputs.forEach(function (input) { f.inputs.forEach(function (input) {
@ -241,6 +241,17 @@ describe('TransactionBuilder', function () {
}) })
}) })
describe('setLockTime', function () {
it('throws if if there exist any scriptSigs', function () {
txb.addInput(txHash, 0)
txb.sign(0, keyPair)
assert.throws(function () {
txb.setLockTime(65535)
}, /No, this would invalidate signatures/)
})
})
describe('sign', function () { describe('sign', function () {
fixtures.invalid.sign.forEach(function (f) { fixtures.invalid.sign.forEach(function (f) {
it('throws on ' + f.exception + (f.description ? ' (' + f.description + ')' : ''), function () { it('throws on ' + f.exception + (f.description ? ' (' + f.description + ')' : ''), function () {