From 7059b177eb4c5f9dd4bd17f5f75cb9451d3c4174 Mon Sep 17 00:00:00 2001
From: Daniel Cousens <github@dcousens.com>
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) {