From 7059b177eb4c5f9dd4bd17f5f75cb9451d3c4174 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 12 Oct 2016 12:15:13 +1100 Subject: [PATCH] TransactionBuilder: re-order in order of usage --- src/transaction_builder.js | 132 ++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/transaction_builder.js b/src/transaction_builder.js index 587085d..cf79c0b 100644 --- a/src/transaction_builder.js +++ b/src/transaction_builder.js @@ -84,6 +84,37 @@ function expandInput (scriptSig, redeemScript) { } } +function fixMultisigOrder (input, transaction, vin) { + if (input.redeemScriptType !== 'multisig' || !input.redeemScript) return + if (input.pubKeys.length === input.signatures.length) return + + var unmatched = input.signatures.concat() + var hashType = input.hashType || Transaction.SIGHASH_ALL + var hash = transaction.hashForSignature(vin, input.redeemScript, hashType) + + input.signatures = input.pubKeys.map(function (pubKey, y) { + var keyPair = ECPair.fromPublicKeyBuffer(pubKey) + var match + + // check for a signature + unmatched.some(function (signature, i) { + // skip if undefined || OP_0 + if (!signature) return false + + // skip if signature does not match pubKey + if (!keyPair.verify(hash, signature)) return false + + // remove matched signature from unmatched + unmatched[i] = undefined + match = signature + + return true + }) + + return match + }) +} + function expandOutput (script, scriptType, ourPubKey) { typeforce(types.Buffer, script) @@ -122,50 +153,6 @@ function expandOutput (script, scriptType, ourPubKey) { } } -function buildInput (input, allowIncomplete) { - var signatures = input.signatures - var scriptType = input.redeemScriptType || input.prevOutType - var scriptSig - - switch (scriptType) { - case 'pubkeyhash': - case 'pubkey': - if (signatures.length < 1 || !signatures[0]) throw new Error('Not enough signatures provided') - - var pkSignature = signatures[0].toScriptSignature(input.hashType) - if (scriptType === 'pubkeyhash') { - scriptSig = bscript.pubKeyHashInput(pkSignature, input.pubKeys[0]) - } else { - scriptSig = bscript.pubKeyInput(pkSignature) - } - - break - - // ref https://github.com/bitcoin/bitcoin/blob/d612837814020ae832499d18e6ee5eb919a87907/src/script/sign.cpp#L232 - case 'multisig': - signatures = signatures.map(function (signature) { - return (signature && signature.toScriptSignature(input.hashType)) || ops.OP_0 - }) - - if (!allowIncomplete) { - // remove blank signatures - signatures = signatures.filter(function (x) { return x !== ops.OP_0 }) - } - - scriptSig = bscript.multisigInput(signatures, allowIncomplete ? undefined : input.redeemScript) - break - - default: return - } - - // wrap as scriptHash if necessary - if (input.prevOutType === 'scripthash') { - scriptSig = bscript.scriptHashInput(scriptSig, input.redeemScript) - } - - return scriptSig -} - function prepareInput (input, kpPubKey, redeemScript, hashType) { if (redeemScript) { var redeemScriptHash = bcrypto.hash160(redeemScript) @@ -212,35 +199,48 @@ function prepareInput (input, kpPubKey, redeemScript, hashType) { input.hashType = hashType } -function fixMultisigOrder (input, transaction, vin) { - if (input.redeemScriptType !== 'multisig' || !input.redeemScript) return - if (input.pubKeys.length === input.signatures.length) return +function buildInput (input, allowIncomplete) { + var signatures = input.signatures + var scriptType = input.redeemScriptType || input.prevOutType + var scriptSig - var unmatched = input.signatures.concat() - var hashType = input.hashType || Transaction.SIGHASH_ALL - var hash = transaction.hashForSignature(vin, input.redeemScript, hashType) + switch (scriptType) { + case 'pubkeyhash': + case 'pubkey': + if (signatures.length < 1 || !signatures[0]) throw new Error('Not enough signatures provided') - input.signatures = input.pubKeys.map(function (pubKey, y) { - var keyPair = ECPair.fromPublicKeyBuffer(pubKey) - var match + var pkSignature = signatures[0].toScriptSignature(input.hashType) + if (scriptType === 'pubkeyhash') { + scriptSig = bscript.pubKeyHashInput(pkSignature, input.pubKeys[0]) + } else { + scriptSig = bscript.pubKeyInput(pkSignature) + } - // check for a signature - unmatched.some(function (signature, i) { - // skip if undefined || OP_0 - if (!signature) return false + break - // skip if signature does not match pubKey - if (!keyPair.verify(hash, signature)) return false + // ref https://github.com/bitcoin/bitcoin/blob/d612837814020ae832499d18e6ee5eb919a87907/src/script/sign.cpp#L232 + case 'multisig': + signatures = signatures.map(function (signature) { + return (signature && signature.toScriptSignature(input.hashType)) || ops.OP_0 + }) - // remove matched signature from unmatched - unmatched[i] = undefined - match = signature + if (!allowIncomplete) { + // remove blank signatures + signatures = signatures.filter(function (x) { return x !== ops.OP_0 }) + } - return true - }) + scriptSig = bscript.multisigInput(signatures, allowIncomplete ? undefined : input.redeemScript) + break - return match - }) + default: return + } + + // wrap as scriptHash if necessary + if (input.prevOutType === 'scripthash') { + scriptSig = bscript.scriptHashInput(scriptSig, input.redeemScript) + } + + return scriptSig } function TransactionBuilder (network) {