Skip to content

Commit 8c217a7

Browse files
committed
witnessScriptHash: fixed implementation
1 parent 6013bf0 commit 8c217a7

File tree

1 file changed

+59
-5
lines changed

1 file changed

+59
-5
lines changed
Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,63 @@
1-
// {signature} {pubKey}
1+
// <scriptSig> {serialized scriptPubKey script}
22

3-
var p2sh = require('../scripthash/input')
3+
var bscript = require('../../script')
4+
var types = require('../../types')
5+
var typeforce = require('typeforce')
6+
7+
var p2ms = require('../multisig/')
8+
var p2pk = require('../pubkey/')
9+
var p2pkh = require('../pubkeyhash/')
10+
11+
function check (chunks, allowIncomplete) {
12+
typeforce(types.Array, chunks)
13+
if (chunks.length < 1) return false
14+
15+
var witnessScript = chunks[chunks.length - 1]
16+
if (!Buffer.isBuffer(witnessScript)) return false
17+
18+
var witnessScriptChunks = bscript.decompile(witnessScript)
19+
20+
// is witnessScript a valid script?
21+
if (witnessScriptChunks.length === 0) return false
22+
23+
var witnessRawScriptSig = bscript.compile(chunks.slice(0, -1))
24+
25+
// match types
26+
if (p2pkh.input.check(witnessRawScriptSig) &&
27+
p2pkh.output.check(witnessScriptChunks)) return true
28+
29+
if (p2ms.input.check(witnessRawScriptSig, allowIncomplete) &&
30+
p2ms.output.check(witnessScriptChunks)) return true
31+
32+
if (p2pk.input.check(witnessRawScriptSig) &&
33+
p2pk.output.check(witnessScriptChunks)) return true
34+
35+
return false
36+
}
37+
check.toJSON = function () { return 'witnessScriptHash input' }
38+
39+
function encodeStack (witnessData, witnessScript) {
40+
typeforce({
41+
witnessData: [types.Buffer],
42+
witnessScript: types.Buffer
43+
}, {
44+
witnessData: witnessData,
45+
witnessScript: witnessScript
46+
})
47+
48+
return [].concat(witnessData, witnessScript)
49+
}
50+
51+
function decodeStack (chunks) {
52+
typeforce(check, chunks)
53+
return {
54+
witnessData: chunks.slice(0, -1),
55+
witnessScript: chunks[chunks.length - 1]
56+
}
57+
}
458

559
module.exports = {
6-
check: p2sh.check,
7-
decodeStack: p2sh.decodeStack,
8-
encodeStack: p2sh.encodeStack
60+
check: check,
61+
decodeStack: decodeStack,
62+
encodeStack: encodeStack
963
}

0 commit comments

Comments
 (0)