From 80762543e701fc6b35d304444ec4e027051f77db Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 14 Dec 2016 15:52:38 +1100 Subject: [PATCH] templates: add encode/decode* stack functions --- src/templates/index.js | 4 +-- src/templates/multisig/input.js | 23 +++++++++++----- src/templates/pubkey/input.js | 22 ++++++++++----- src/templates/pubkeyhash/input.js | 26 ++++++++++++------ src/templates/scripthash/input.js | 35 ++++++++++++++++-------- src/templates/witnesspubkeyhash/index.js | 1 + src/templates/witnesspubkeyhash/input.js | 9 ++++++ src/templates/witnessscripthash/index.js | 1 + src/templates/witnessscripthash/input.js | 9 ++++++ 9 files changed, 94 insertions(+), 36 deletions(-) create mode 100644 src/templates/witnesspubkeyhash/input.js create mode 100644 src/templates/witnessscripthash/input.js diff --git a/src/templates/index.js b/src/templates/index.js index fa7c4ea..72143f1 100644 --- a/src/templates/index.js +++ b/src/templates/index.js @@ -52,8 +52,8 @@ function classifyWitness (script, allowIncomplete) { // XXX: optimization, below functions .decompile before use var chunks = decompile(script) - if (pubKeyHash.input.check(chunks)) return types.P2WPKH - if (scriptHash.input.check(chunks)) return types.P2WSH + if (witnessPubKeyHash.input.check(chunks)) return types.P2WPKH + if (witnessScriptHash.input.check(chunks)) return types.P2WSH return types.NONSTANDARD } diff --git a/src/templates/multisig/input.js b/src/templates/multisig/input.js index aed80af..d3e230c 100644 --- a/src/templates/multisig/input.js +++ b/src/templates/multisig/input.js @@ -21,7 +21,7 @@ function check (script, allowIncomplete) { } check.toJSON = function () { return 'multisig input' } -function encode (signatures, scriptPubKey) { +function encodeStack (signatures, scriptPubKey) { typeforce([partialSignature], signatures) 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) { - var chunks = bscript.decompile(buffer) - typeforce(check, chunks, allowIncomplete) +function encode (signatures, scriptPubKey) { + return bscript.compile(encodeStack(signatures, scriptPubKey)) +} - 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 = { check: check, decode: decode, - encode: encode + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack } diff --git a/src/templates/pubkey/input.js b/src/templates/pubkey/input.js index 7357adc..0e8ed8d 100644 --- a/src/templates/pubkey/input.js +++ b/src/templates/pubkey/input.js @@ -12,21 +12,29 @@ function check (script) { } check.toJSON = function () { return 'pubKey input' } -function encode (signature) { +function encodeStack (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) { - var chunks = bscript.decompile(buffer) - typeforce(check, chunks) - - return chunks[0] + var stack = bscript.decompile(buffer) + return decodeStack(stack) } module.exports = { check: check, decode: decode, - encode: encode + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack } diff --git a/src/templates/pubkeyhash/input.js b/src/templates/pubkeyhash/input.js index d085da7..82b89f9 100644 --- a/src/templates/pubkeyhash/input.js +++ b/src/templates/pubkeyhash/input.js @@ -13,28 +13,38 @@ function check (script) { } check.toJSON = function () { return 'pubKeyHash input' } -function encode (signature, pubKey) { +function encodeStack (signature, pubKey) { typeforce({ signature: types.Buffer, pubKey: types.Buffer }, { signature: signature, pubKey: pubKey }) - return bscript.compile([signature, pubKey]) + return [signature, pubKey] } -function decode (buffer) { - var chunks = bscript.decompile(buffer) - typeforce(check, chunks) +function encode (signature, pubKey) { + return bscript.compile(encodeStack(signature, pubKey)) +} + +function decodeStack (stack) { + typeforce(check, stack) return { - signature: chunks[0], - pubKey: chunks[1] + signature: stack[0], + pubKey: stack[1] } } +function decode (buffer) { + var stack = bscript.decompile(buffer) + return decodeStack(stack) +} + module.exports = { check: check, decode: decode, - encode: encode + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack } diff --git a/src/templates/scripthash/input.js b/src/templates/scripthash/input.js index adf1cec..ce2bef7 100644 --- a/src/templates/scripthash/input.js +++ b/src/templates/scripthash/input.js @@ -25,28 +25,39 @@ function check (script, allowIncomplete) { } check.toJSON = function () { return 'scriptHash input' } -function encode (redeemScriptSig, redeemScript) { - var scriptSigChunks = bscript.decompile(redeemScriptSig) +function encodeStack (redeemScriptStack, redeemScript) { var serializedScriptPubKey = bscript.compile(redeemScript) - return bscript.compile([].concat( - scriptSigChunks, - serializedScriptPubKey - )) + return [].concat(redeemScriptStack, serializedScriptPubKey) } -function decode (buffer) { - var chunks = bscript.decompile(buffer) - typeforce(check, chunks) +function encode (redeemScriptSig, redeemScript) { + var redeemScriptStack = bscript.decompile(redeemScriptSig) + + return bscript.compile(encodeStack(redeemScriptStack, redeemScript)) +} + +function decodeStack (stack) { + typeforce(check, stack) return { - redeemScriptSig: bscript.compile(chunks.slice(0, -1)), - redeemScript: chunks[chunks.length - 1] + redeemScriptStack: stack.slice(0, -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 = { check: check, decode: decode, - encode: encode + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack } diff --git a/src/templates/witnesspubkeyhash/index.js b/src/templates/witnesspubkeyhash/index.js index d459038..46863d6 100644 --- a/src/templates/witnesspubkeyhash/index.js +++ b/src/templates/witnesspubkeyhash/index.js @@ -1,3 +1,4 @@ module.exports = { + input: require('./input'), output: require('./output') } diff --git a/src/templates/witnesspubkeyhash/input.js b/src/templates/witnesspubkeyhash/input.js new file mode 100644 index 0000000..d9d678b --- /dev/null +++ b/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 +} diff --git a/src/templates/witnessscripthash/index.js b/src/templates/witnessscripthash/index.js index d459038..46863d6 100644 --- a/src/templates/witnessscripthash/index.js +++ b/src/templates/witnessscripthash/index.js @@ -1,3 +1,4 @@ module.exports = { + input: require('./input'), output: require('./output') } diff --git a/src/templates/witnessscripthash/input.js b/src/templates/witnessscripthash/input.js new file mode 100644 index 0000000..02b6545 --- /dev/null +++ b/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 +}