Browse Source

TxBuilder: re-order to avoid mutation in case of failure

hk-custom-address
Daniel Cousens 10 years ago
parent
commit
ba97b5ee34
  1. 19
      src/transaction_builder.js
  2. 23
      test/transaction_builder.js

19
src/transaction_builder.js

@ -253,25 +253,28 @@ TransactionBuilder.prototype.sign = function(index, privKey, redeemScript, hashT
hash = this.tx.hashForSignature(index, prevOutScript, hashType)
}
this.prevOutScripts[index] = prevOutScript
this.prevOutTypes[index] = prevOutType
if (!(index in this.signatures)) {
this.signatures[index] = {
var input = this.signatures[index]
if (!input) {
input = {
hashType: hashType,
pubKeys: [],
redeemScript: redeemScript,
scriptType: scriptType,
signatures: []
}
this.signatures[index] = input
} else {
assert.equal(scriptType, 'multisig', scriptType + ' doesn\'t support multiple signatures')
assert.equal(input.hashType, hashType, 'Inconsistent hashType')
assert.deepEqual(input.redeemScript, redeemScript, 'Inconsistent redeemScript')
}
var input = this.signatures[index]
assert.equal(input.hashType, hashType, 'Inconsistent hashType')
assert.deepEqual(input.redeemScript, redeemScript, 'Inconsistent redeemScript')
this.prevOutScripts[index] = prevOutScript
this.prevOutTypes[index] = prevOutType
// TODO: order signatures for multisig, enforce m < n
var signature = privKey.sign(hash)
input.pubKeys.push(privKey.pub)
input.signatures.push(signature)

23
test/transaction_builder.js

@ -153,6 +153,29 @@ describe('TransactionBuilder', function() {
}, /RedeemScript can\'t be P2SH/)
})
it('throws if hashType is inconsistent', function() {
var redeemScript = scripts.multisigOutput(1, [privKey.pub])
txb.addInput(prevTxHash, 0)
txb.sign(0, privKey, redeemScript, 83)
assert.throws(function() {
txb.sign(0, privKey, redeemScript, 82)
}, /Inconsistent hashType/)
})
it('throws if redeemScript is inconsistent', function() {
var firstScript = scripts.multisigOutput(1, [privKey.pub])
var otherScript = scripts.multisigOutput(2, [privKey.pub, privKey.pub])
txb.addInput(prevTxHash, 0)
txb.sign(0, privKey, firstScript)
assert.throws(function() {
txb.sign(0, privKey, otherScript)
}, /Inconsistent redeemScript/)
})
it('throws if redeemScript not supported', function() {
txb.addInput(prevTxHash, 0)

Loading…
Cancel
Save