Browse Source

templates: add encode/decode* stack functions

hk-custom-address
Daniel Cousens 8 years ago
committed by Daniel Cousens
parent
commit
80762543e7
  1. 4
      src/templates/index.js
  2. 23
      src/templates/multisig/input.js
  3. 22
      src/templates/pubkey/input.js
  4. 26
      src/templates/pubkeyhash/input.js
  5. 35
      src/templates/scripthash/input.js
  6. 1
      src/templates/witnesspubkeyhash/index.js
  7. 9
      src/templates/witnesspubkeyhash/input.js
  8. 1
      src/templates/witnessscripthash/index.js
  9. 9
      src/templates/witnessscripthash/input.js

4
src/templates/index.js

@ -52,8 +52,8 @@ function classifyWitness (script, allowIncomplete) {
// XXX: optimization, below functions .decompile before use // XXX: optimization, below functions .decompile before use
var chunks = decompile(script) var chunks = decompile(script)
if (pubKeyHash.input.check(chunks)) return types.P2WPKH if (witnessPubKeyHash.input.check(chunks)) return types.P2WPKH
if (scriptHash.input.check(chunks)) return types.P2WSH if (witnessScriptHash.input.check(chunks)) return types.P2WSH
return types.NONSTANDARD return types.NONSTANDARD
} }

23
src/templates/multisig/input.js

@ -21,7 +21,7 @@ function check (script, allowIncomplete) {
} }
check.toJSON = function () { return 'multisig input' } check.toJSON = function () { return 'multisig input' }
function encode (signatures, scriptPubKey) { function encodeStack (signatures, scriptPubKey) {
typeforce([partialSignature], signatures) typeforce([partialSignature], signatures)
if (scriptPubKey) { if (scriptPubKey) {
@ -36,18 +36,27 @@ function encode (signatures, scriptPubKey) {
} }
} }
return bscript.compile([].concat(OPS.OP_0, signatures)) return [].concat(OPS.OP_0, signatures)
} }
function decode (buffer, allowIncomplete) { function encode (signatures, scriptPubKey) {
var chunks = bscript.decompile(buffer) return bscript.compile(encodeStack(signatures, scriptPubKey))
typeforce(check, chunks, allowIncomplete) }
return chunks.slice(1) function decodeStack (stack, allowIncomplete) {
typeforce(check, stack, allowIncomplete)
return stack.slice(1)
}
function decode (buffer, allowIncomplete) {
var stack = bscript.decompile(buffer)
return decodeStack(stack, allowIncomplete)
} }
module.exports = { module.exports = {
check: check, check: check,
decode: decode, decode: decode,
encode: encode decodeStack: decodeStack,
encode: encode,
encodeStack: encodeStack
} }

22
src/templates/pubkey/input.js

@ -12,21 +12,29 @@ function check (script) {
} }
check.toJSON = function () { return 'pubKey input' } check.toJSON = function () { return 'pubKey input' }
function encode (signature) { function encodeStack (signature) {
typeforce(types.Buffer, signature) typeforce(types.Buffer, signature)
return [signature]
}
function encode (signature) {
return bscript.compile(encodeStack(signature))
}
return bscript.compile([signature]) function decodeStack (stack) {
typeforce(check, stack)
return stack[0]
} }
function decode (buffer) { function decode (buffer) {
var chunks = bscript.decompile(buffer) var stack = bscript.decompile(buffer)
typeforce(check, chunks) return decodeStack(stack)
return chunks[0]
} }
module.exports = { module.exports = {
check: check, check: check,
decode: decode, decode: decode,
encode: encode decodeStack: decodeStack,
encode: encode,
encodeStack: encodeStack
} }

26
src/templates/pubkeyhash/input.js

@ -13,28 +13,38 @@ function check (script) {
} }
check.toJSON = function () { return 'pubKeyHash input' } check.toJSON = function () { return 'pubKeyHash input' }
function encode (signature, pubKey) { function encodeStack (signature, pubKey) {
typeforce({ typeforce({
signature: types.Buffer, pubKey: types.Buffer signature: types.Buffer, pubKey: types.Buffer
}, { }, {
signature: signature, pubKey: pubKey signature: signature, pubKey: pubKey
}) })
return bscript.compile([signature, pubKey]) return [signature, pubKey]
} }
function decode (buffer) { function encode (signature, pubKey) {
var chunks = bscript.decompile(buffer) return bscript.compile(encodeStack(signature, pubKey))
typeforce(check, chunks) }
function decodeStack (stack) {
typeforce(check, stack)
return { return {
signature: chunks[0], signature: stack[0],
pubKey: chunks[1] pubKey: stack[1]
}
} }
function decode (buffer) {
var stack = bscript.decompile(buffer)
return decodeStack(stack)
} }
module.exports = { module.exports = {
check: check, check: check,
decode: decode, decode: decode,
encode: encode decodeStack: decodeStack,
encode: encode,
encodeStack: encodeStack
} }

35
src/templates/scripthash/input.js

@ -25,28 +25,39 @@ function check (script, allowIncomplete) {
} }
check.toJSON = function () { return 'scriptHash input' } check.toJSON = function () { return 'scriptHash input' }
function encode (redeemScriptSig, redeemScript) { function encodeStack (redeemScriptStack, redeemScript) {
var scriptSigChunks = bscript.decompile(redeemScriptSig)
var serializedScriptPubKey = bscript.compile(redeemScript) var serializedScriptPubKey = bscript.compile(redeemScript)
return bscript.compile([].concat( return [].concat(redeemScriptStack, serializedScriptPubKey)
scriptSigChunks,
serializedScriptPubKey
))
} }
function decode (buffer) { function encode (redeemScriptSig, redeemScript) {
var chunks = bscript.decompile(buffer) var redeemScriptStack = bscript.decompile(redeemScriptSig)
typeforce(check, chunks)
return bscript.compile(encodeStack(redeemScriptStack, redeemScript))
}
function decodeStack (stack) {
typeforce(check, stack)
return { return {
redeemScriptSig: bscript.compile(chunks.slice(0, -1)), redeemScriptStack: stack.slice(0, -1),
redeemScript: chunks[chunks.length - 1] redeemScript: stack[stack.length - 1]
}
} }
function decode (buffer) {
var stack = bscript.decompile(buffer)
var result = decodeStack(stack)
result.redeemScriptSig = bscript.compile(result.redeemScriptStack)
delete result.redeemScriptStack
return result
} }
module.exports = { module.exports = {
check: check, check: check,
decode: decode, decode: decode,
encode: encode decodeStack: decodeStack,
encode: encode,
encodeStack: encodeStack
} }

1
src/templates/witnesspubkeyhash/index.js

@ -1,3 +1,4 @@
module.exports = { module.exports = {
input: require('./input'),
output: require('./output') output: require('./output')
} }

9
src/templates/witnesspubkeyhash/input.js

@ -0,0 +1,9 @@
// {signature} {pubKey}
var pkh = require('../pubkeyhash/input')
module.exports = {
check: pkh.check,
decodeStack: pkh.decodeStack,
encodeStack: pkh.encodeStack
}

1
src/templates/witnessscripthash/index.js

@ -1,3 +1,4 @@
module.exports = { module.exports = {
input: require('./input'),
output: require('./output') output: require('./output')
} }

9
src/templates/witnessscripthash/input.js

@ -0,0 +1,9 @@
// {signature} {pubKey}
var p2sh = require('../scripthash/input')
module.exports = {
check: p2sh.check,
decodeStack: p2sh.decodeStack,
encodeStack: p2sh.encodeStack
}
Loading…
Cancel
Save