From 8c217a7ba7e1d615175a1a1af9a15a6c284c2593 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 27 Sep 2017 08:30:31 +1000 Subject: [PATCH] witnessScriptHash: fixed implementation --- src/templates/witnessscripthash/input.js | 64 ++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/src/templates/witnessscripthash/input.js b/src/templates/witnessscripthash/input.js index 02b6545..bc2e909 100644 --- a/src/templates/witnessscripthash/input.js +++ b/src/templates/witnessscripthash/input.js @@ -1,9 +1,63 @@ -// {signature} {pubKey} +// {serialized scriptPubKey script} -var p2sh = require('../scripthash/input') +var bscript = require('../../script') +var types = require('../../types') +var typeforce = require('typeforce') + +var p2ms = require('../multisig/') +var p2pk = require('../pubkey/') +var p2pkh = require('../pubkeyhash/') + +function check (chunks, allowIncomplete) { + typeforce(types.Array, chunks) + if (chunks.length < 1) return false + + var witnessScript = chunks[chunks.length - 1] + if (!Buffer.isBuffer(witnessScript)) return false + + var witnessScriptChunks = bscript.decompile(witnessScript) + + // is witnessScript a valid script? + if (witnessScriptChunks.length === 0) return false + + var witnessRawScriptSig = bscript.compile(chunks.slice(0, -1)) + + // match types + if (p2pkh.input.check(witnessRawScriptSig) && + p2pkh.output.check(witnessScriptChunks)) return true + + if (p2ms.input.check(witnessRawScriptSig, allowIncomplete) && + p2ms.output.check(witnessScriptChunks)) return true + + if (p2pk.input.check(witnessRawScriptSig) && + p2pk.output.check(witnessScriptChunks)) return true + + return false +} +check.toJSON = function () { return 'witnessScriptHash input' } + +function encodeStack (witnessData, witnessScript) { + typeforce({ + witnessData: [types.Buffer], + witnessScript: types.Buffer + }, { + witnessData: witnessData, + witnessScript: witnessScript + }) + + return [].concat(witnessData, witnessScript) +} + +function decodeStack (chunks) { + typeforce(check, chunks) + return { + witnessData: chunks.slice(0, -1), + witnessScript: chunks[chunks.length - 1] + } +} module.exports = { - check: p2sh.check, - decodeStack: p2sh.decodeStack, - encodeStack: p2sh.encodeStack + check: check, + decodeStack: decodeStack, + encodeStack: encodeStack }