Browse Source

TransactionBuilder: avoid extra getPublicKeyBuffer calls

hk-custom-address
Daniel Cousens 8 years ago
parent
commit
83b2bb5d6a
  1. 64
      src/transaction_builder.js

64
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]

Loading…
Cancel
Save