witnessScriptHash: fixed implementation
This commit is contained in:
parent
6013bf075c
commit
8c217a7ba7
1 changed files with 59 additions and 5 deletions
|
@ -1,9 +1,63 @@
|
||||||
// {signature} {pubKey}
|
// <scriptSig> {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 = {
|
module.exports = {
|
||||||
check: p2sh.check,
|
check: check,
|
||||||
decodeStack: p2sh.decodeStack,
|
decodeStack: decodeStack,
|
||||||
encodeStack: p2sh.encodeStack
|
encodeStack: encodeStack
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue