From 83b2bb5d6acc289d2f82a6412cc81402382e7e33 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Tue, 27 Sep 2016 21:04:32 +1000 Subject: [PATCH 1/2] TransactionBuilder: avoid extra getPublicKeyBuffer calls --- src/transaction_builder.js | 64 +++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/transaction_builder.js b/src/transaction_builder.js index 08ac655..fdbf16b 100644 --- a/src/transaction_builder.js +++ b/src/transaction_builder.js @@ -140,6 +140,36 @@ function extractInput (transaction, txIn, vin) { } } +function extractFromOutputScript (outputScript, kpPubKey) { + var scriptType = bscript.classifyOutput(outputScript) + var outputScriptChunks = bscript.decompile(outputScript) + + switch (scriptType) { + case 'pubkeyhash': + var pkh1 = outputScriptChunks[2] + var pkh2 = bcrypto.hash160(kpPubKey) + + if (!bufferEquals(pkh1, pkh2)) throw new Error('privateKey cannot sign for this input') + + return { + pubKeys: [kpPubKey], + scriptType: scriptType + } + + case 'pubkey': + return { + pubKeys: outputScriptChunks.slice(0, 1), + scriptType: scriptType + } + + case 'multisig': + return { + pubKeys: outputScriptChunks.slice(1, -2), + scriptType: scriptType + } + } +} + function TransactionBuilder (network) { this.prevTxMap = {} this.network = network || networks.bitcoin @@ -379,36 +409,6 @@ TransactionBuilder.prototype.__build = function (allowIncomplete) { return tx } -function extractFromOutputScript (outputScript, keyPair, kpPubKey) { - var scriptType = bscript.classifyOutput(outputScript) - var outputScriptChunks = bscript.decompile(outputScript) - - switch (scriptType) { - case 'pubkeyhash': - var pkh1 = outputScriptChunks[2] - var pkh2 = bcrypto.hash160(keyPair.getPublicKeyBuffer()) - - if (!bufferEquals(pkh1, pkh2)) throw new Error('privateKey cannot sign for this input') - - return { - pubKeys: [kpPubKey], - scriptType: scriptType - } - - case 'pubkey': - return { - pubKeys: outputScriptChunks.slice(0, 1), - scriptType: scriptType - } - - case 'multisig': - return { - pubKeys: outputScriptChunks.slice(1, -2), - scriptType: scriptType - } - } -} - TransactionBuilder.prototype.sign = function (index, keyPair, redeemScript, hashType) { if (keyPair.network !== this.network) throw new Error('Inconsistent network') if (!this.inputs[index]) throw new Error('No input at index: ' + index) @@ -446,7 +446,7 @@ TransactionBuilder.prototype.sign = function (index, keyPair, redeemScript, hash if (!bufferEquals(scriptHash, bcrypto.hash160(redeemScript))) throw new Error('RedeemScript does not match ' + scriptHash.toString('hex')) } - var extracted = extractFromOutputScript(redeemScript, keyPair, kpPubKey) + var extracted = extractFromOutputScript(redeemScript, kpPubKey) if (!extracted) throw new Error('RedeemScript not supported "' + bscript.toASM(redeemScript) + '"') // if we don't have a prevOutScript, generate a P2SH script @@ -465,7 +465,7 @@ TransactionBuilder.prototype.sign = function (index, keyPair, redeemScript, hash // if we don't have a scriptType, assume pubKeyHash otherwise if (!input.scriptType) { - input.prevOutScript = bscript.pubKeyHashOutput(bcrypto.hash160(keyPair.getPublicKeyBuffer())) + input.prevOutScript = bscript.pubKeyHashOutput(bcrypto.hash160(kpPubKey)) input.prevOutType = 'pubkeyhash' input.pubKeys = [kpPubKey] From 6826aa312d46913a4ac67b41286e65153b77f319 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Tue, 27 Sep 2016 21:08:48 +1000 Subject: [PATCH 2/2] TransactionBuilder: less exits --- src/transaction_builder.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/transaction_builder.js b/src/transaction_builder.js index fdbf16b..259fa6b 100644 --- a/src/transaction_builder.js +++ b/src/transaction_builder.js @@ -144,29 +144,30 @@ function extractFromOutputScript (outputScript, kpPubKey) { var scriptType = bscript.classifyOutput(outputScript) var outputScriptChunks = bscript.decompile(outputScript) + var pubKeys switch (scriptType) { case 'pubkeyhash': var pkh1 = outputScriptChunks[2] var pkh2 = bcrypto.hash160(kpPubKey) if (!bufferEquals(pkh1, pkh2)) throw new Error('privateKey cannot sign for this input') - - return { - pubKeys: [kpPubKey], - scriptType: scriptType - } + pubKeys = [kpPubKey] + break case 'pubkey': - return { - pubKeys: outputScriptChunks.slice(0, 1), - scriptType: scriptType - } + pubKeys = outputScriptChunks.slice(0, 1) + break case 'multisig': - return { - pubKeys: outputScriptChunks.slice(1, -2), - scriptType: scriptType - } + pubKeys = outputScriptChunks.slice(1, -2) + break + + default: return + } + + return { + pubKeys: pubKeys, + scriptType: scriptType } }