@bitcoinerlab/miniscript-policies 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Makefile +14 -0
- package/README.md +34 -0
- package/dist/index.js +204 -0
- package/example.js +34 -0
- package/js_bindings.cpp +154 -0
- package/package.json +52 -0
- package/patches/uppercase-h.patch +11 -0
- package/rollup.config.js +13 -0
- package/src/index.js +5 -0
- package/src/miniscript.js +149 -0
- package/test/fixtures.js +898 -0
- package/test/miniscript.test.js +21 -0
- package/test/policy.test.js +20 -0
- package/types/index.d.ts +14 -0
package/test/fixtures.js
ADDED
|
@@ -0,0 +1,898 @@
|
|
|
1
|
+
import bip68 from 'bip68';
|
|
2
|
+
|
|
3
|
+
export const primitives = {
|
|
4
|
+
0: {
|
|
5
|
+
miniscript: '0',
|
|
6
|
+
script: '0',
|
|
7
|
+
nonMalleableSats: [],
|
|
8
|
+
malleableSats: []
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
1: {
|
|
12
|
+
miniscript: '1',
|
|
13
|
+
script: '1',
|
|
14
|
+
throws: 'Miniscript 1 is not sane.'
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
//'pk_k(key)' is not a valid miniscript
|
|
18
|
+
'c:pk_k(key)': {
|
|
19
|
+
miniscript: 'c:pk_k(key)',
|
|
20
|
+
script: '<key> OP_CHECKSIG',
|
|
21
|
+
nonMalleableSats: [{ asm: '<sig(key)>' }],
|
|
22
|
+
malleableSats: []
|
|
23
|
+
},
|
|
24
|
+
//same as above
|
|
25
|
+
'pk(key)': {
|
|
26
|
+
miniscript: 'pk(key)',
|
|
27
|
+
script: '<key> OP_CHECKSIG',
|
|
28
|
+
nonMalleableSats: [{ asm: '<sig(key)>' }],
|
|
29
|
+
malleableSats: []
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
//'pk_h(key)' is not a valid miniscript
|
|
33
|
+
'c:pk_h(key)': {
|
|
34
|
+
miniscript: 'c:pk_h(key)',
|
|
35
|
+
script: 'OP_DUP OP_HASH160 <HASH160(key)> OP_EQUALVERIFY OP_CHECKSIG',
|
|
36
|
+
nonMalleableSats: [{ asm: '<sig(key)> <key>' }],
|
|
37
|
+
malleableSats: []
|
|
38
|
+
},
|
|
39
|
+
//same as above
|
|
40
|
+
'pkh(key)': {
|
|
41
|
+
miniscript: 'pkh(key)',
|
|
42
|
+
script: 'OP_DUP OP_HASH160 <HASH160(key)> OP_EQUALVERIFY OP_CHECKSIG',
|
|
43
|
+
nonMalleableSats: [{ asm: '<sig(key)> <key>' }],
|
|
44
|
+
malleableSats: []
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
//older
|
|
48
|
+
'and_v(v:pk(key),older(10))': {
|
|
49
|
+
miniscript: 'and_v(v:pk(key),older(10))',
|
|
50
|
+
script: '<key> OP_CHECKSIGVERIFY 10 OP_CHECKSEQUENCEVERIFY',
|
|
51
|
+
nonMalleableSats: [{ asm: '<sig(key)>', nSequence: 10 }],
|
|
52
|
+
malleableSats: []
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
//after
|
|
56
|
+
'and_v(v:pk(key),after(10))': {
|
|
57
|
+
miniscript: 'and_v(v:pk(key),after(10))',
|
|
58
|
+
script: '<key> OP_CHECKSIGVERIFY 10 OP_CHECKLOCKTIMEVERIFY',
|
|
59
|
+
nonMalleableSats: [{ asm: '<sig(key)>', nLockTime: 10 }],
|
|
60
|
+
malleableSats: []
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
//hashes
|
|
64
|
+
'and_v(v:pk(k),sha256(H))': {
|
|
65
|
+
miniscript: 'and_v(v:pk(k),sha256(H))',
|
|
66
|
+
script:
|
|
67
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL',
|
|
68
|
+
nonMalleableSats: [{ asm: '<sha256_preimage(H)> <sig(k)>' }],
|
|
69
|
+
malleableSats: []
|
|
70
|
+
},
|
|
71
|
+
'with unknowns - and_v(v:pk(k),sha256(H))': {
|
|
72
|
+
miniscript: 'and_v(v:pk(k),sha256(H))',
|
|
73
|
+
script:
|
|
74
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL',
|
|
75
|
+
unknowns: ['<sha256_preimage(H)>'],
|
|
76
|
+
unknownSats: [{ asm: '<sha256_preimage(H)> <sig(k)>' }],
|
|
77
|
+
//If the preimage is unknown we cannot compute any satisfaction
|
|
78
|
+
nonMalleableSats: [],
|
|
79
|
+
malleableSats: []
|
|
80
|
+
},
|
|
81
|
+
'and_v(v:pk(k),ripemd160(H))': {
|
|
82
|
+
miniscript: 'and_v(v:pk(k),ripemd160(H))',
|
|
83
|
+
script:
|
|
84
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUAL',
|
|
85
|
+
nonMalleableSats: [{ asm: '<ripemd160_preimage(H)> <sig(k)>' }],
|
|
86
|
+
malleableSats: []
|
|
87
|
+
},
|
|
88
|
+
'and_v(v:pk(k),hash256(H))': {
|
|
89
|
+
miniscript: 'and_v(v:pk(k),hash256(H))',
|
|
90
|
+
script:
|
|
91
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_HASH256 <H> OP_EQUAL',
|
|
92
|
+
nonMalleableSats: [{ asm: '<hash256_preimage(H)> <sig(k)>' }],
|
|
93
|
+
malleableSats: []
|
|
94
|
+
},
|
|
95
|
+
'and_v(v:pk(k),hash160(H))': {
|
|
96
|
+
miniscript: 'and_v(v:pk(k),hash160(H))',
|
|
97
|
+
script:
|
|
98
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_HASH160 <H> OP_EQUAL',
|
|
99
|
+
nonMalleableSats: [{ asm: '<hash160_preimage(H)> <sig(k)>' }],
|
|
100
|
+
malleableSats: []
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
//andor ~truth table
|
|
104
|
+
'andor(0,0,0)': {
|
|
105
|
+
miniscript: 'andor(0,0,0)',
|
|
106
|
+
script: '0 OP_NOTIF 0 OP_ELSE 0 OP_ENDIF',
|
|
107
|
+
nonMalleableSats: [],
|
|
108
|
+
malleableSats: []
|
|
109
|
+
},
|
|
110
|
+
'andor(0,0,pk(k))': {
|
|
111
|
+
miniscript: 'andor(0,0,pk(k))',
|
|
112
|
+
script: '0 OP_NOTIF <k> OP_CHECKSIG OP_ELSE 0 OP_ENDIF',
|
|
113
|
+
nonMalleableSats: [{ asm: '<sig(k)>' }],
|
|
114
|
+
malleableSats: []
|
|
115
|
+
},
|
|
116
|
+
'andor(0,pk(k),0)': {
|
|
117
|
+
miniscript: 'andor(0,pk(k),0)',
|
|
118
|
+
script: '0 OP_NOTIF 0 OP_ELSE <k> OP_CHECKSIG OP_ENDIF',
|
|
119
|
+
nonMalleableSats: [],
|
|
120
|
+
malleableSats: []
|
|
121
|
+
},
|
|
122
|
+
'andor(0,pk(key1),pk(key2))': {
|
|
123
|
+
miniscript: 'andor(0,pk(key1),pk(key2))',
|
|
124
|
+
script: '0 OP_NOTIF <key2> OP_CHECKSIG OP_ELSE <key1> OP_CHECKSIG OP_ENDIF',
|
|
125
|
+
nonMalleableSats: [{ asm: '<sig(key2)>' }],
|
|
126
|
+
malleableSats: []
|
|
127
|
+
},
|
|
128
|
+
//other andor(1,Y,Z) combinations are not valid miniscripts
|
|
129
|
+
|
|
130
|
+
//and_v ~truth table
|
|
131
|
+
'and_v(v:0,0)': {
|
|
132
|
+
miniscript: 'and_v(v:0,0)',
|
|
133
|
+
script: '0 OP_VERIFY 0',
|
|
134
|
+
nonMalleableSats: [],
|
|
135
|
+
malleableSats: []
|
|
136
|
+
},
|
|
137
|
+
'and_v(v:0,1)': {
|
|
138
|
+
miniscript: 'and_v(v:0,1)',
|
|
139
|
+
script: '0 OP_VERIFY 1',
|
|
140
|
+
nonMalleableSats: [],
|
|
141
|
+
malleableSats: []
|
|
142
|
+
},
|
|
143
|
+
'and_v(v:1,0)': {
|
|
144
|
+
miniscript: 'and_v(v:1,0)',
|
|
145
|
+
script: '1 OP_VERIFY 0',
|
|
146
|
+
nonMalleableSats: [],
|
|
147
|
+
malleableSats: []
|
|
148
|
+
},
|
|
149
|
+
'and_v(v:pk(key1),pk(key2))': {
|
|
150
|
+
miniscript: 'and_v(v:pk(key1),pk(key2))',
|
|
151
|
+
script: '<key1> OP_CHECKSIGVERIFY <key2> OP_CHECKSIG',
|
|
152
|
+
nonMalleableSats: [{ asm: '<sig(key2)> <sig(key1)>' }],
|
|
153
|
+
malleableSats: []
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
//and_b(X,Y): [X] [Y] BOOLAND
|
|
157
|
+
'and_b(0,s:pk(key))': {
|
|
158
|
+
miniscript: 'and_b(0,s:pk(key))',
|
|
159
|
+
script: '0 OP_SWAP <key> OP_CHECKSIG OP_BOOLAND',
|
|
160
|
+
nonMalleableSats: [],
|
|
161
|
+
malleableSats: []
|
|
162
|
+
},
|
|
163
|
+
'and_b(1,s:pk(key))': {
|
|
164
|
+
miniscript: 'and_b(1,s:pk(key))',
|
|
165
|
+
script: '1 OP_SWAP <key> OP_CHECKSIG OP_BOOLAND',
|
|
166
|
+
nonMalleableSats: [{ asm: '<sig(key)>' }],
|
|
167
|
+
malleableSats: []
|
|
168
|
+
},
|
|
169
|
+
'and_b(pk(a),s:pk(b))': {
|
|
170
|
+
miniscript: 'and_b(pk(a),s:pk(b))',
|
|
171
|
+
script: '<a> OP_CHECKSIG OP_SWAP <b> OP_CHECKSIG OP_BOOLAND',
|
|
172
|
+
nonMalleableSats: [{ asm: '<sig(b)> <sig(a)>' }],
|
|
173
|
+
malleableSats: []
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
//or_b(X,Z)\t[X] [Z] BOOLOR
|
|
177
|
+
'or_b(0,a:0)': {
|
|
178
|
+
miniscript: 'or_b(0,a:0)',
|
|
179
|
+
script: '0 OP_TOALTSTACK 0 OP_FROMALTSTACK OP_BOOLOR',
|
|
180
|
+
nonMalleableSats: [],
|
|
181
|
+
malleableSats: []
|
|
182
|
+
},
|
|
183
|
+
'and_v(v:pk(key1),or_b(pk(key2),a:pk(key3)))': {
|
|
184
|
+
miniscript: 'and_v(v:pk(key1),or_b(pk(key2),a:pk(key3)))',
|
|
185
|
+
script:
|
|
186
|
+
'<key1> OP_CHECKSIGVERIFY <key2> OP_CHECKSIG OP_TOALTSTACK <key3> OP_CHECKSIG OP_FROMALTSTACK OP_BOOLOR',
|
|
187
|
+
nonMalleableSats: [
|
|
188
|
+
{ asm: '0 <sig(key2)> <sig(key1)>' },
|
|
189
|
+
{ asm: '<sig(key3)> 0 <sig(key1)>' }
|
|
190
|
+
],
|
|
191
|
+
malleableSats: [{ asm: '<sig(key3)> <sig(key2)> <sig(key1)>' }]
|
|
192
|
+
},
|
|
193
|
+
'and_v(v:pk(key1),or_b(pk(key2),su:after(500000)))': {
|
|
194
|
+
miniscript: 'and_v(v:pk(key1),or_b(pk(key2),su:after(500000)))',
|
|
195
|
+
script:
|
|
196
|
+
'<key1> OP_CHECKSIGVERIFY <key2> OP_CHECKSIG OP_SWAP OP_IF <20a107> OP_CHECKLOCKTIMEVERIFY OP_ELSE 0 OP_ENDIF OP_BOOLOR',
|
|
197
|
+
nonMalleableSats: [
|
|
198
|
+
{ nLockTime: 500000, asm: '1 0 <sig(key1)>' },
|
|
199
|
+
{ asm: '0 <sig(key2)> <sig(key1)>' }
|
|
200
|
+
],
|
|
201
|
+
malleableSats: [{ nLockTime: 500000, asm: '1 <sig(key2)> <sig(key1)>' }]
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
//or_c(X,Z)\t[X] NOTIF [Z] ENDIF
|
|
205
|
+
't:or_c(0,v:0)': {
|
|
206
|
+
miniscript: 't:or_c(0,v:0)',
|
|
207
|
+
script: '0 OP_NOTIF 0 OP_VERIFY OP_ENDIF 1',
|
|
208
|
+
nonMalleableSats: [],
|
|
209
|
+
malleableSats: []
|
|
210
|
+
},
|
|
211
|
+
//Here we assume that both we and the attacker know ripemd160_preimage.
|
|
212
|
+
//In fact, all pre-images are assumed to be publicly known by default.
|
|
213
|
+
//If this is the case then we cannot provide this result:
|
|
214
|
+
//{"script": "<sig(key2)> <sig(key1)>"}
|
|
215
|
+
//Because an attacker could build a new satisfaction using sig(key2)
|
|
216
|
+
'c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))': {
|
|
217
|
+
miniscript: 'c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))',
|
|
218
|
+
script:
|
|
219
|
+
'<key1> OP_CHECKSIG OP_NOTIF OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY OP_ENDIF <key2> OP_CHECKSIG',
|
|
220
|
+
nonMalleableSats: [{ asm: '<sig(key2)> <ripemd160_preimage(H)> 0' }],
|
|
221
|
+
malleableSats: [{ asm: '<sig(key2)> <sig(key1)>' }]
|
|
222
|
+
},
|
|
223
|
+
//Here we assume that no-one knows ripemd160_preimage.
|
|
224
|
+
//The only possible solution is siginig with 2 keys. The attacker cannot
|
|
225
|
+
//create a new solution because ripemd160_preimage is not known.
|
|
226
|
+
'with unknows set - c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))': {
|
|
227
|
+
miniscript: 'c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))',
|
|
228
|
+
script:
|
|
229
|
+
'<key1> OP_CHECKSIG OP_NOTIF OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY OP_ENDIF <key2> OP_CHECKSIG',
|
|
230
|
+
unknowns: ['<ripemd160_preimage(H)>'],
|
|
231
|
+
unknownSats: [{ asm: '<sig(key2)> <ripemd160_preimage(H)> 0' }],
|
|
232
|
+
nonMalleableSats: [{ asm: '<sig(key2)> <sig(key1)>' }],
|
|
233
|
+
malleableSats: []
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
//or_d(X,Z): [X] IFDUP NOTIF [Z] ENDIF
|
|
237
|
+
'or_d(0,0)': {
|
|
238
|
+
miniscript: 'or_d(0,0)',
|
|
239
|
+
script: '0 OP_IFDUP OP_NOTIF 0 OP_ENDIF',
|
|
240
|
+
nonMalleableSats: [],
|
|
241
|
+
malleableSats: []
|
|
242
|
+
},
|
|
243
|
+
//solutions are malleable because an attacker can allways default to
|
|
244
|
+
//{"nLockTime": 500000, "script": "1 0 0"}
|
|
245
|
+
//So nLockTime solution would be the only possible one except this would not
|
|
246
|
+
//be sane because it has no signatures.
|
|
247
|
+
'or_d(pk(key1),and_b(pk(key2),a:sha256(H)))': {
|
|
248
|
+
miniscript: 'or_d(pk(key1),and_b(pk(key2),a:sha256(H)))',
|
|
249
|
+
script:
|
|
250
|
+
'<key1> OP_CHECKSIG OP_IFDUP OP_NOTIF <key2> OP_CHECKSIG OP_TOALTSTACK OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL OP_FROMALTSTACK OP_BOOLAND OP_ENDIF',
|
|
251
|
+
nonMalleableSats: [
|
|
252
|
+
{ asm: '<sig(key1)>' },
|
|
253
|
+
{ asm: '<sha256_preimage(H)> <sig(key2)> 0' }
|
|
254
|
+
],
|
|
255
|
+
malleableSats: []
|
|
256
|
+
},
|
|
257
|
+
//same as above. if don't know sig(key2)
|
|
258
|
+
'with unknows set - or_d(pk(key1),and_b(pk(key2),a:sha256(H)))': {
|
|
259
|
+
miniscript: 'or_d(pk(key1),and_b(pk(key2),a:sha256(H)))',
|
|
260
|
+
script:
|
|
261
|
+
'<key1> OP_CHECKSIG OP_IFDUP OP_NOTIF <key2> OP_CHECKSIG OP_TOALTSTACK OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL OP_FROMALTSTACK OP_BOOLAND OP_ENDIF',
|
|
262
|
+
unknowns: ['<sig(key2)>'],
|
|
263
|
+
//[{"script": "<sig(key1)>"}, {"script": "0 <sig(key2)> 0"}, {"nLockTime": 500000, "script": "1 0 0"}, {"nLockTime": 500000, "script": "1 <sig(key2)> 0"}]
|
|
264
|
+
unknownSats: [{ asm: '<sha256_preimage(H)> <sig(key2)> 0' }],
|
|
265
|
+
nonMalleableSats: [{ asm: '<sig(key1)>' }],
|
|
266
|
+
malleableSats: []
|
|
267
|
+
},
|
|
268
|
+
'or_d(c:pk_h(key1),andor(c:pk_k(key2),older(2016),pk(key3)))': {
|
|
269
|
+
miniscript: 'or_d(c:pk_h(key1),andor(c:pk_k(key2),older(2016),pk(key3)))',
|
|
270
|
+
script:
|
|
271
|
+
'OP_DUP OP_HASH160 <HASH160(key1)> OP_EQUALVERIFY OP_CHECKSIG OP_IFDUP OP_NOTIF <key2> OP_CHECKSIG OP_NOTIF <key3> OP_CHECKSIG OP_ELSE <e007> OP_CHECKSEQUENCEVERIFY OP_ENDIF OP_ENDIF',
|
|
272
|
+
nonMalleableSats: [
|
|
273
|
+
{ asm: '<sig(key1)> <key1>' },
|
|
274
|
+
{ nSequence: 2016, asm: '<sig(key2)> 0 <key1>' },
|
|
275
|
+
{ asm: '<sig(key3)> 0 0 <key1>' }
|
|
276
|
+
],
|
|
277
|
+
malleableSats: []
|
|
278
|
+
},
|
|
279
|
+
|
|
280
|
+
//or_i(X,Z)\tIF [X] ELSE [Z] ENDIF
|
|
281
|
+
'c:or_i(pk_k(key1),pk_k(key2))': {
|
|
282
|
+
miniscript: 'c:or_i(pk_k(key1),pk_k(key2))',
|
|
283
|
+
script: 'OP_IF <key1> OP_ELSE <key2> OP_ENDIF OP_CHECKSIG',
|
|
284
|
+
nonMalleableSats: [{ asm: '<sig(key1)> 1' }, { asm: '<sig(key2)> 0' }],
|
|
285
|
+
malleableSats: []
|
|
286
|
+
},
|
|
287
|
+
'c:or_i(and_v(v:after(500000),pk_k(key1)),pk_k(key2))': {
|
|
288
|
+
miniscript: 'c:or_i(and_v(v:after(500000),pk_k(key1)),pk_k(key2))',
|
|
289
|
+
script:
|
|
290
|
+
'OP_IF <20a107> OP_CHECKLOCKTIMEVERIFY OP_VERIFY <key1> OP_ELSE <key2> OP_ENDIF OP_CHECKSIG',
|
|
291
|
+
nonMalleableSats: [
|
|
292
|
+
{ nLockTime: 500000, asm: '<sig(key1)> 1' },
|
|
293
|
+
{ asm: '<sig(key2)> 0' }
|
|
294
|
+
],
|
|
295
|
+
malleableSats: []
|
|
296
|
+
},
|
|
297
|
+
'with unknowns set - c:or_i(and_v(v:after(500000),pk_k(key1)),pk_k(key2))': {
|
|
298
|
+
miniscript: 'c:or_i(and_v(v:after(500000),pk_k(key1)),pk_k(key2))',
|
|
299
|
+
script:
|
|
300
|
+
'OP_IF <20a107> OP_CHECKLOCKTIMEVERIFY OP_VERIFY <key1> OP_ELSE <key2> OP_ENDIF OP_CHECKSIG',
|
|
301
|
+
unknowns: ['<sig(key1)>'],
|
|
302
|
+
//If the preimage is not konwn, then it is not malleable.
|
|
303
|
+
//[{"nLockTime": 500000, "script": "<sig(key1)> 1"}, {"script": "<sha256_preimage(H)> 0"}]
|
|
304
|
+
unknownSats: [{ nLockTime: 500000, asm: '<sig(key1)> 1' }],
|
|
305
|
+
nonMalleableSats: [{ asm: '<sig(key2)> 0' }],
|
|
306
|
+
malleableSats: []
|
|
307
|
+
},
|
|
308
|
+
'c:or_i(and_v(v:older(16),pk_h(key1)),pk_h(key2))': {
|
|
309
|
+
miniscript: 'c:or_i(and_v(v:older(16),pk_h(key1)),pk_h(key2))',
|
|
310
|
+
script:
|
|
311
|
+
'OP_IF 16 OP_CHECKSEQUENCEVERIFY OP_VERIFY OP_DUP OP_HASH160 <HASH160(key1)> OP_EQUALVERIFY OP_ELSE OP_DUP OP_HASH160 <HASH160(key2)> OP_EQUALVERIFY OP_ENDIF OP_CHECKSIG',
|
|
312
|
+
nonMalleableSats: [
|
|
313
|
+
{ nSequence: 16, asm: '<sig(key1)> <key1> 1' },
|
|
314
|
+
{ asm: '<sig(key2)> <key2> 0' }
|
|
315
|
+
],
|
|
316
|
+
malleableSats: []
|
|
317
|
+
},
|
|
318
|
+
'with unknowns set - c:or_i(and_v(v:older(16),pk_h(key1)),pk_h(key2))': {
|
|
319
|
+
miniscript: 'c:or_i(and_v(v:older(16),pk_h(key1)),pk_h(key2))',
|
|
320
|
+
script:
|
|
321
|
+
'OP_IF 16 OP_CHECKSEQUENCEVERIFY OP_VERIFY OP_DUP OP_HASH160 <HASH160(key1)> OP_EQUALVERIFY OP_ELSE OP_DUP OP_HASH160 <HASH160(key2)> OP_EQUALVERIFY OP_ENDIF OP_CHECKSIG',
|
|
322
|
+
unknowns: ['<sig(key1)>', '<sig(key2)>'],
|
|
323
|
+
unknownSats: [
|
|
324
|
+
{ nSequence: 16, asm: '<sig(key1)> <key1> 1' },
|
|
325
|
+
{ asm: '<sig(key2)> <key2> 0' }
|
|
326
|
+
],
|
|
327
|
+
nonMalleableSats: [],
|
|
328
|
+
malleableSats: []
|
|
329
|
+
},
|
|
330
|
+
'c:or_i(andor(c:pk_h(key1),pk_h(key2),pk_h(key3)),pk_k(key4))': {
|
|
331
|
+
miniscript: 'c:or_i(andor(c:pk_h(key1),pk_h(key2),pk_h(key3)),pk_k(key4))',
|
|
332
|
+
script:
|
|
333
|
+
'OP_IF OP_DUP OP_HASH160 <HASH160(key1)> OP_EQUALVERIFY OP_CHECKSIG OP_NOTIF OP_DUP OP_HASH160 <HASH160(key3)> OP_EQUALVERIFY OP_ELSE OP_DUP OP_HASH160 <HASH160(key2)> OP_EQUALVERIFY OP_ENDIF OP_ELSE <key4> OP_ENDIF OP_CHECKSIG',
|
|
334
|
+
nonMalleableSats: [
|
|
335
|
+
{ asm: '<sig(key2)> <key2> <sig(key1)> <key1> 1' },
|
|
336
|
+
{ asm: '<sig(key3)> <key3> 0 <key1> 1' },
|
|
337
|
+
{ asm: '<sig(key4)> 0' }
|
|
338
|
+
],
|
|
339
|
+
malleableSats: []
|
|
340
|
+
},
|
|
341
|
+
'or_i(and_b(pk(key1),s:pk(key2)),and_b(older(1),s:pk(key3)))': {
|
|
342
|
+
miniscript: 'or_i(and_b(pk(key1),s:pk(key2)),and_b(older(1),s:pk(key3)))',
|
|
343
|
+
script:
|
|
344
|
+
'OP_IF <key1> OP_CHECKSIG OP_SWAP <key2> OP_CHECKSIG OP_BOOLAND OP_ELSE 1 OP_CHECKSEQUENCEVERIFY OP_SWAP <key3> OP_CHECKSIG OP_BOOLAND OP_ENDIF',
|
|
345
|
+
nonMalleableSats: [
|
|
346
|
+
{ asm: '<sig(key2)> <sig(key1)> 1' },
|
|
347
|
+
{ nSequence: 1, asm: '<sig(key3)> 0' }
|
|
348
|
+
],
|
|
349
|
+
malleableSats: []
|
|
350
|
+
},
|
|
351
|
+
'with unknowns set - or_i(and_b(pk(key1),s:pk(key2)),and_b(older(1),s:pk(key3)))':
|
|
352
|
+
{
|
|
353
|
+
miniscript: 'or_i(and_b(pk(key1),s:pk(key2)),and_b(older(1),s:pk(key3)))',
|
|
354
|
+
script:
|
|
355
|
+
'OP_IF <key1> OP_CHECKSIG OP_SWAP <key2> OP_CHECKSIG OP_BOOLAND OP_ELSE 1 OP_CHECKSEQUENCEVERIFY OP_SWAP <key3> OP_CHECKSIG OP_BOOLAND OP_ENDIF',
|
|
356
|
+
unknowns: ['<sig(key3)>'],
|
|
357
|
+
unknownSats: [{ nSequence: 1, asm: '<sig(key3)> 0' }],
|
|
358
|
+
nonMalleableSats: [{ asm: '<sig(key2)> <sig(key1)> 1' }],
|
|
359
|
+
malleableSats: []
|
|
360
|
+
},
|
|
361
|
+
|
|
362
|
+
//thresh(k,X1,...,Xn)\t[X1] [X2] ADD ... [Xn] ADD ... <k> EQUAL
|
|
363
|
+
'thresh(2,pk(A),s:pk(B),sln:1)': {
|
|
364
|
+
miniscript: 'thresh(2,pk(A),s:pk(B),sln:1)',
|
|
365
|
+
script:
|
|
366
|
+
'<A> OP_CHECKSIG OP_SWAP <B> OP_CHECKSIG OP_ADD OP_SWAP OP_IF 0 OP_ELSE 1 OP_0NOTEQUAL OP_ENDIF OP_ADD 2 OP_EQUAL',
|
|
367
|
+
nonMalleableSats: [{ asm: '0 0 <sig(A)>' }, { asm: '0 <sig(B)> 0' }],
|
|
368
|
+
malleableSats: [{ asm: '1 <sig(B)> <sig(A)>' }]
|
|
369
|
+
},
|
|
370
|
+
'with unknownws - thresh(2,pk(A),s:pk(B),sln:1)': {
|
|
371
|
+
miniscript: 'thresh(2,pk(A),s:pk(B),sln:1)',
|
|
372
|
+
script:
|
|
373
|
+
'<A> OP_CHECKSIG OP_SWAP <B> OP_CHECKSIG OP_ADD OP_SWAP OP_IF 0 OP_ELSE 1 OP_0NOTEQUAL OP_ENDIF OP_ADD 2 OP_EQUAL',
|
|
374
|
+
unknowns: ['<sig(A)>'],
|
|
375
|
+
unknownSats: [{ asm: '0 0 <sig(A)>' }, { asm: '1 <sig(B)> <sig(A)>' }],
|
|
376
|
+
nonMalleableSats: [{ asm: '0 <sig(B)> 0' }],
|
|
377
|
+
malleableSats: []
|
|
378
|
+
},
|
|
379
|
+
'with unknowns set - thresh(2,pk(k1),s:pk(k2),sjtv:sha256(H))': {
|
|
380
|
+
miniscript: 'thresh(2,pk(k1),s:pk(k2),sjtv:sha256(H))',
|
|
381
|
+
script:
|
|
382
|
+
'<k1> OP_CHECKSIG OP_SWAP <k2> OP_CHECKSIG OP_ADD OP_SWAP OP_SIZE OP_0NOTEQUAL OP_IF OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUALVERIFY 1 OP_ENDIF OP_ADD 2 OP_EQUAL',
|
|
383
|
+
unknowns: ['<sha256_preimage(H)>'],
|
|
384
|
+
unknownSats: [
|
|
385
|
+
{ asm: '<sha256_preimage(H)> 0 <sig(k1)>' },
|
|
386
|
+
{ asm: '<sha256_preimage(H)> <sig(k2)> 0' }
|
|
387
|
+
],
|
|
388
|
+
nonMalleableSats: [{ asm: '0 <sig(k2)> <sig(k1)>' }],
|
|
389
|
+
malleableSats: []
|
|
390
|
+
},
|
|
391
|
+
'or(thresh(2,pk(k1),pk(k2),sha256(H)),pk(k3))': {
|
|
392
|
+
miniscript: 'or(thresh(2,pk(k1),pk(k2),sha256(H)),pk(k3))',
|
|
393
|
+
throws:
|
|
394
|
+
'Miniscript or(thresh(2,pk(k1),pk(k2),sha256(H)),pk(k3)) is not sane'
|
|
395
|
+
},
|
|
396
|
+
'thresh(2,multi(2,key1,key2),a:multi(1,key3),ac:pk_k(key4))': {
|
|
397
|
+
miniscript: 'thresh(2,multi(2,key1,key2),a:multi(1,key3),ac:pk_k(key4))',
|
|
398
|
+
script:
|
|
399
|
+
'2 <key1> <key2> 2 OP_CHECKMULTISIG OP_TOALTSTACK 1 <key3> 1 OP_CHECKMULTISIG OP_FROMALTSTACK OP_ADD OP_TOALTSTACK <key4> OP_CHECKSIG OP_FROMALTSTACK OP_ADD 2 OP_EQUAL',
|
|
400
|
+
//I manually checked them:
|
|
401
|
+
nonMalleableSats: [
|
|
402
|
+
{ asm: '0 0 <sig(key3)> 0 <sig(key1)> <sig(key2)>' },
|
|
403
|
+
{ asm: '<sig(key4)> 0 0 0 <sig(key1)> <sig(key2)>' },
|
|
404
|
+
{ asm: '<sig(key4)> 0 <sig(key3)> 0 0 0' }
|
|
405
|
+
],
|
|
406
|
+
malleableSats: []
|
|
407
|
+
},
|
|
408
|
+
'thresh(2,c:pk_h(key),s:sha256(e38990d0c7fc009880a9c07c23842e886c6bbdc964ce6bdd5817ad357335ee6f),a:hash160(dd69735817e0e3f6f826a9238dc2e291184f0131))':
|
|
409
|
+
{
|
|
410
|
+
miniscript:
|
|
411
|
+
'thresh(2,c:pk_h(key),s:sha256(e38990d0c7fc009880a9c07c23842e886c6bbdc964ce6bdd5817ad357335ee6f),a:hash160(dd69735817e0e3f6f826a9238dc2e291184f0131))',
|
|
412
|
+
script:
|
|
413
|
+
'OP_DUP OP_HASH160 <HASH160(key1)> OP_EQUALVERIFY OP_CHECKSIG OP_SWAP OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <e38990d0c7fc009880a9c07c23842e886c6bbdc964ce6bdd5817ad357335ee6f> OP_EQUAL OP_ADD OP_TOALTSTACK OP_SIZE <20> OP_EQUALVERIFY OP_HASH160 OP_EQUAL OP_FROMALTSTACK OP_ADD 2 OP_EQUAL',
|
|
414
|
+
//This is insane because miniscript assumes that preimages are public
|
|
415
|
+
//and so 2 of 3 pieces of information would allways be available to
|
|
416
|
+
//attackers
|
|
417
|
+
//This is not going to work even by setting preimages to unknowns because
|
|
418
|
+
//this is expression insane at the miniscript level.
|
|
419
|
+
//Read the docs at satisfier(), argument:unknowns, for the details.
|
|
420
|
+
throws:
|
|
421
|
+
'Miniscript thresh(2,c:pk_h(key),s:sha256(e38990d0c7fc009880a9c07c23842e886c6bbdc964ce6bdd5817ad357335ee6f),a:hash160(dd69735817e0e3f6f826a9238dc2e291184f0131)) is not sane.'
|
|
422
|
+
},
|
|
423
|
+
'thresh(1,c:pk_k(key1),altv:after(1000000000),altv:after(100))': {
|
|
424
|
+
miniscript: 'thresh(1,c:pk_k(key1),altv:after(1000000000),altv:after(100))',
|
|
425
|
+
//This is insane at the miniscript level because a) it mixes time locks and
|
|
426
|
+
//b) because it cannot be satisfyed in a non-malleable: adding any key1
|
|
427
|
+
//would satisfy it.
|
|
428
|
+
throws:
|
|
429
|
+
'Miniscript thresh(1,c:pk_k(key1),altv:after(1000000000),altv:after(100)) is not sane.'
|
|
430
|
+
},
|
|
431
|
+
'thresh(2,c:pk_k(key1),altv:after(200),altv:after(100))': {
|
|
432
|
+
miniscript: 'thresh(2,c:pk_k(key1),altv:after(200),altv:after(100))',
|
|
433
|
+
script:
|
|
434
|
+
'<key1> OP_CHECKSIG OP_TOALTSTACK OP_IF 0 OP_ELSE <c800> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE <64> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD 2 OP_EQUAL',
|
|
435
|
+
//[{"nLockTime": 200, "script": "1 0 <sig(key1)>"}, {"nLockTime": 100, "script": "0 1 <sig(key1)>"}, {"nLockTime": 200, "script": "0 0 0"}]
|
|
436
|
+
nonMalleableSats: [{ nLockTime: 200, asm: '0 0 0' }], //Don't reveal the signature
|
|
437
|
+
//because it would be malleable
|
|
438
|
+
malleableSats: []
|
|
439
|
+
},
|
|
440
|
+
'thresh(2,c:pk_k(key1),altv:after(200),altv:after(100))': {
|
|
441
|
+
miniscript: 'thresh(2,c:pk_k(key1),altv:after(200),altv:after(100))',
|
|
442
|
+
script:
|
|
443
|
+
'<key1> OP_CHECKSIG OP_TOALTSTACK OP_IF 0 OP_ELSE <c800> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE <64> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD 2 OP_EQUAL',
|
|
444
|
+
throws:
|
|
445
|
+
'Miniscript thresh(2,c:pk_k(key1),altv:after(200),altv:after(100)) is not sane.'
|
|
446
|
+
},
|
|
447
|
+
'thresh(2,c:pk_k(key1),ac:pk_k(key2),altv:after(1000000000),altv:after(100))':
|
|
448
|
+
{
|
|
449
|
+
miniscript:
|
|
450
|
+
'thresh(2,c:pk_k(key1),ac:pk_k(key2),altv:after(1000000000),altv:after(100))',
|
|
451
|
+
//Same reasoning as above. timelock mic¡xing and any key1 or key2 could satisfy
|
|
452
|
+
throws:
|
|
453
|
+
'Miniscript thresh(2,c:pk_k(key1),ac:pk_k(key2),altv:after(1000000000),altv:after(100)) is not sane.'
|
|
454
|
+
},
|
|
455
|
+
'thresh(2,c:pk_k(key1),ac:pk_k(key2),altv:after(100))': {
|
|
456
|
+
miniscript: 'thresh(2,c:pk_k(key1),ac:pk_k(key2),altv:after(100))',
|
|
457
|
+
//Note that <sig(key1)> or <sig(key2)> in the first solution cannot be
|
|
458
|
+
//used to form the other solutions since nLockTime forms part of the
|
|
459
|
+
//transaction template whose hash is signed.
|
|
460
|
+
// [{"script": "1 <sig(key2)> <sig(key1)>"}, {"nLockTime": 100, "script": "0 0 <sig(key1)>"}, {"nLockTime": 100, "script": "0 <sig(key2)> 0"}]
|
|
461
|
+
script:
|
|
462
|
+
'<key1> OP_CHECKSIG OP_TOALTSTACK <key2> OP_CHECKSIG OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE <64> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD 2 OP_EQUAL',
|
|
463
|
+
nonMalleableSats: [
|
|
464
|
+
{ asm: '1 <sig(key2)> <sig(key1)>' },
|
|
465
|
+
{ nLockTime: 100, asm: '0 0 <sig(key1)>' },
|
|
466
|
+
{ nLockTime: 100, asm: '0 <sig(key2)> 0' }
|
|
467
|
+
],
|
|
468
|
+
malleableSats: []
|
|
469
|
+
},
|
|
470
|
+
'thresh(3,c:pk_k(key1),ac:pk_k(key2),altv:after(100),altv:after(200))': {
|
|
471
|
+
miniscript:
|
|
472
|
+
'thresh(3,c:pk_k(key1),ac:pk_k(key2),altv:after(100),altv:after(200))',
|
|
473
|
+
script:
|
|
474
|
+
'<key1> OP_CHECKSIG OP_TOALTSTACK <key2> OP_CHECKSIG OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE <64> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE <c800> OP_CHECKLOCKTIMEVERIFY OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD 3 OP_EQUAL',
|
|
475
|
+
nonMalleableSats: [
|
|
476
|
+
{ nLockTime: 100, asm: '1 0 <sig(key2)> <sig(key1)>' },
|
|
477
|
+
//This one below should not be used because it could used to create the
|
|
478
|
+
//2 other solutions below by an attacker
|
|
479
|
+
//{"nLockTime": 200, "script": "0 1 <sig(key2)> <sig(key1)>"},
|
|
480
|
+
{ nLockTime: 200, asm: '0 0 0 <sig(key1)>' },
|
|
481
|
+
{ nLockTime: 200, asm: '0 0 <sig(key2)> 0' }
|
|
482
|
+
],
|
|
483
|
+
malleableSats: [{ nLockTime: 200, asm: '0 1 <sig(key2)> <sig(key1)>' }]
|
|
484
|
+
},
|
|
485
|
+
'thresh(3,j:and_v(v:ripemd160(H),and_v(v:ripemd160(H),n:older(110))),s:pk(A),s:pk(B),aj:and_v(v:sha256(H),and_v(v:sha256(H),n:older(100))))':
|
|
486
|
+
{
|
|
487
|
+
miniscript:
|
|
488
|
+
'thresh(3,j:and_v(v:ripemd160(H),and_v(v:ripemd160(H),n:older(110))),s:pk(A),s:pk(B),aj:and_v(v:sha256(H),and_v(v:sha256(H),n:older(100))))',
|
|
489
|
+
script:
|
|
490
|
+
'OP_SIZE OP_0NOTEQUAL OP_IF OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY <6e> OP_CHECKSEQUENCEVERIFY OP_0NOTEQUAL OP_ENDIF OP_SWAP <A> OP_CHECKSIG OP_ADD OP_SWAP <B> OP_CHECKSIG OP_ADD OP_TOALTSTACK OP_SIZE OP_0NOTEQUAL OP_IF OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUALVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUALVERIFY <64> OP_CHECKSEQUENCEVERIFY OP_0NOTEQUAL OP_ENDIF OP_FROMALTSTACK OP_ADD 3 OP_EQUAL',
|
|
491
|
+
nonMalleableSats: [
|
|
492
|
+
{
|
|
493
|
+
nSequence: 110,
|
|
494
|
+
asm: '<sha256_preimage(H)> <sha256_preimage(H)> 0 <sig(A)> <ripemd160_preimage(H)> <ripemd160_preimage(H)>'
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
nSequence: 110,
|
|
498
|
+
asm: '<sha256_preimage(H)> <sha256_preimage(H)> <sig(B)> 0 <ripemd160_preimage(H)> <ripemd160_preimage(H)>'
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
nSequence: 100,
|
|
502
|
+
asm: '<sha256_preimage(H)> <sha256_preimage(H)> <sig(B)> <sig(A)> 0'
|
|
503
|
+
}
|
|
504
|
+
],
|
|
505
|
+
malleableSats: [
|
|
506
|
+
{
|
|
507
|
+
nSequence: 110,
|
|
508
|
+
asm: '0 <sig(B)> <sig(A)> <ripemd160_preimage(H)> <ripemd160_preimage(H)>'
|
|
509
|
+
}
|
|
510
|
+
]
|
|
511
|
+
},
|
|
512
|
+
'with unknowns sats - thresh(3,j:and_v(v:ripemd160(H),and_v(v:ripemd160(H),n:older(110))),s:pk(A),s:pk(B),aj:and_v(v:sha256(H),and_v(v:sha256(H),n:older(100))))':
|
|
513
|
+
{
|
|
514
|
+
miniscript:
|
|
515
|
+
'thresh(3,j:and_v(v:ripemd160(H),and_v(v:ripemd160(H),n:older(110))),s:pk(A),s:pk(B),aj:and_v(v:sha256(H),and_v(v:sha256(H),n:older(100))))',
|
|
516
|
+
script:
|
|
517
|
+
'OP_SIZE OP_0NOTEQUAL OP_IF OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY <6e> OP_CHECKSEQUENCEVERIFY OP_0NOTEQUAL OP_ENDIF OP_SWAP <A> OP_CHECKSIG OP_ADD OP_SWAP <B> OP_CHECKSIG OP_ADD OP_TOALTSTACK OP_SIZE OP_0NOTEQUAL OP_IF OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUALVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUALVERIFY <64> OP_CHECKSEQUENCEVERIFY OP_0NOTEQUAL OP_ENDIF OP_FROMALTSTACK OP_ADD 3 OP_EQUAL',
|
|
518
|
+
unknowns: ['<sha256_preimage(H)>'],
|
|
519
|
+
unknownSats: [
|
|
520
|
+
{
|
|
521
|
+
nSequence: 110,
|
|
522
|
+
asm: '<sha256_preimage(H)> <sha256_preimage(H)> 0 <sig(A)> <ripemd160_preimage(H)> <ripemd160_preimage(H)>'
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
nSequence: 110,
|
|
526
|
+
asm: '<sha256_preimage(H)> <sha256_preimage(H)> <sig(B)> 0 <ripemd160_preimage(H)> <ripemd160_preimage(H)>'
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
nSequence: 100,
|
|
530
|
+
asm: '<sha256_preimage(H)> <sha256_preimage(H)> <sig(B)> <sig(A)> 0'
|
|
531
|
+
}
|
|
532
|
+
],
|
|
533
|
+
nonMalleableSats: [
|
|
534
|
+
{
|
|
535
|
+
nSequence: 110,
|
|
536
|
+
asm: '0 <sig(B)> <sig(A)> <ripemd160_preimage(H)> <ripemd160_preimage(H)>'
|
|
537
|
+
}
|
|
538
|
+
],
|
|
539
|
+
malleableSats: []
|
|
540
|
+
},
|
|
541
|
+
'thresh(3,c:pk_k(key1),ac:pk_k(key2),altv:1,altv:1)': {
|
|
542
|
+
miniscript: 'thresh(3,c:pk_k(key1),ac:pk_k(key2),altv:1,altv:1)',
|
|
543
|
+
script:
|
|
544
|
+
'<key1> OP_CHECKSIG OP_TOALTSTACK <key2> OP_CHECKSIG OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE 1 OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD OP_TOALTSTACK OP_IF 0 OP_ELSE 1 OP_VERIFY 1 OP_ENDIF OP_FROMALTSTACK OP_ADD 3 OP_EQUAL',
|
|
545
|
+
nonMalleableSats: [
|
|
546
|
+
{ asm: '0 0 0 <sig(key1)>' },
|
|
547
|
+
{ asm: '0 0 <sig(key2)> 0' }
|
|
548
|
+
],
|
|
549
|
+
malleableSats: [
|
|
550
|
+
{ asm: '1 0 <sig(key2)> <sig(key1)>' },
|
|
551
|
+
{ asm: '0 1 <sig(key2)> <sig(key1)>' }
|
|
552
|
+
]
|
|
553
|
+
},
|
|
554
|
+
//multi(k,key1,...,keyn)\t-> <k> <key1> ... <keyn> <n> CHECKMULTISIG
|
|
555
|
+
'multi(3,key1,key2,key3,key4)': {
|
|
556
|
+
miniscript: 'multi(3,key1,key2,key3,key4)',
|
|
557
|
+
script: '3 <key1> <key2> <key3> <key4> 4 OP_CHECKMULTISIG',
|
|
558
|
+
nonMalleableSats: [
|
|
559
|
+
{ asm: '0 <sig(key1)> <sig(key2)> <sig(key3)>' },
|
|
560
|
+
{ asm: '0 <sig(key1)> <sig(key2)> <sig(key4)>' },
|
|
561
|
+
{ asm: '0 <sig(key1)> <sig(key3)> <sig(key4)>' },
|
|
562
|
+
{ asm: '0 <sig(key2)> <sig(key3)> <sig(key4)>' }
|
|
563
|
+
],
|
|
564
|
+
malleableSats: []
|
|
565
|
+
},
|
|
566
|
+
'multi(2,key1,key2,key3,key4)': {
|
|
567
|
+
miniscript: 'multi(2,key1,key2,key3,key4)',
|
|
568
|
+
script: '2 <key1> <key2> <key3> <key4> 4 OP_CHECKMULTISIG',
|
|
569
|
+
nonMalleableSats: [
|
|
570
|
+
{ asm: '0 <sig(key1)> <sig(key2)>' },
|
|
571
|
+
{ asm: '0 <sig(key1)> <sig(key3)>' },
|
|
572
|
+
{ asm: '0 <sig(key1)> <sig(key4)>' },
|
|
573
|
+
{ asm: '0 <sig(key2)> <sig(key3)>' },
|
|
574
|
+
{ asm: '0 <sig(key2)> <sig(key4)>' },
|
|
575
|
+
{ asm: '0 <sig(key3)> <sig(key4)>' }
|
|
576
|
+
],
|
|
577
|
+
malleableSats: []
|
|
578
|
+
},
|
|
579
|
+
'multi(1,key1,key2)': {
|
|
580
|
+
miniscript: 'multi(1,key1,key2)',
|
|
581
|
+
script: '1 <key1> <key2> 2 OP_CHECKMULTISIG',
|
|
582
|
+
nonMalleableSats: [{ asm: '0 <sig(key1)>' }, { asm: '0 <sig(key2)>' }],
|
|
583
|
+
malleableSats: []
|
|
584
|
+
},
|
|
585
|
+
'multi(0,key1,key2,key3,key4)': {
|
|
586
|
+
miniscript: 'multi(0,key1,key2,key3,key4)',
|
|
587
|
+
script: '0 <key1> <key2> <key3> <key4> 4 OP_CHECKMULTISIG',
|
|
588
|
+
throws: 'Miniscript multi(0,key1,key2,key3,key4) is not sane.'
|
|
589
|
+
},
|
|
590
|
+
|
|
591
|
+
//a:X\t-> TOALTSTACK [X] FROMALTSTACK -> This has already been tested above.
|
|
592
|
+
//s:X -> s:X\tSWAP [X] -> This has already been tested above.
|
|
593
|
+
//c:X -> [X] CHECKSIG -> Tested above.
|
|
594
|
+
|
|
595
|
+
//d:X -> DUP IF [X] ENDIF
|
|
596
|
+
'and_v(v:pk(key),or_d(nd:and_v(v:after(10),v:after(20)),0))': {
|
|
597
|
+
miniscript: 'and_v(v:pk(key),or_d(nd:and_v(v:after(10),v:after(20)),0))',
|
|
598
|
+
script:
|
|
599
|
+
'<key> OP_CHECKSIGVERIFY OP_DUP OP_IF 10 OP_CHECKLOCKTIMEVERIFY OP_VERIFY <14> OP_CHECKLOCKTIMEVERIFY OP_VERIFY OP_ENDIF OP_0NOTEQUAL OP_IFDUP OP_NOTIF 0 OP_ENDIF',
|
|
600
|
+
nonMalleableSats: [{ nLockTime: 20, asm: '1 <sig(key)>' }],
|
|
601
|
+
malleableSats: []
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
//v:X\t-> [X] VERIFY (or VERIFY version of last opcode in [X]) -> This has alrady been tested above.
|
|
605
|
+
//j:X\t-> SIZE 0NOTEQUAL IF [X] ENDIF -> This has alrady been tested above.
|
|
606
|
+
//n:X -> [X] 0NOTEQUAL -> This has alrady been tested above.
|
|
607
|
+
};
|
|
608
|
+
|
|
609
|
+
export const timeLocks = {
|
|
610
|
+
'Sign with key and older than 10 and older than 20 blocks': {
|
|
611
|
+
policy: 'and(pk(key),and(older(10),older(20)))',
|
|
612
|
+
miniscript: 'and_v(v:pk(key),and_v(v:older(10),older(20)))',
|
|
613
|
+
script:
|
|
614
|
+
'<key> OP_CHECKSIGVERIFY 10 OP_CHECKSEQUENCEVERIFY OP_VERIFY <14> OP_CHECKSEQUENCEVERIFY',
|
|
615
|
+
nonMalleableSats: [{ asm: '<sig(key)>', nSequence: 20 }],
|
|
616
|
+
malleableSats: []
|
|
617
|
+
},
|
|
618
|
+
'(Sign with key1 and older than 10 blocks) or (sign with key2 and older than 20 blocks)':
|
|
619
|
+
{
|
|
620
|
+
policy: 'or(and(pk(key1),older(10)),and(pk(key2),older(20)))',
|
|
621
|
+
miniscript: 'andor(pk(key1),older(10),and_v(v:pk(key2),older(20)))',
|
|
622
|
+
script:
|
|
623
|
+
'<key1> OP_CHECKSIG OP_NOTIF <key2> OP_CHECKSIGVERIFY <14> OP_CHECKSEQUENCEVERIFY OP_ELSE 10 OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
624
|
+
nonMalleableSats: [
|
|
625
|
+
{ nSequence: 10, asm: '<sig(key1)>' },
|
|
626
|
+
{ nSequence: 20, asm: '<sig(key2)> 0' }
|
|
627
|
+
],
|
|
628
|
+
malleableSats: []
|
|
629
|
+
},
|
|
630
|
+
'(Sign with key1 and after than 10 seconds) or (sign with key2 and after than 20 sconds)':
|
|
631
|
+
{
|
|
632
|
+
policy: 'or(and(pk(key1),after(10)),and(pk(key2),after(20)))',
|
|
633
|
+
miniscript: 'andor(pk(key1),after(10),and_v(v:pk(key2),after(20)))',
|
|
634
|
+
script:
|
|
635
|
+
'<key1> OP_CHECKSIG OP_NOTIF <key2> OP_CHECKSIGVERIFY <14> OP_CHECKLOCKTIMEVERIFY OP_ELSE 10 OP_CHECKLOCKTIMEVERIFY OP_ENDIF',
|
|
636
|
+
nonMalleableSats: [
|
|
637
|
+
{ asm: '<sig(key1)>', nLockTime: 10 },
|
|
638
|
+
{ asm: '<sig(key2)> 0', nLockTime: 20 }
|
|
639
|
+
],
|
|
640
|
+
malleableSats: []
|
|
641
|
+
},
|
|
642
|
+
'Throw on mix absolute time locks types. Sign with key and after than 10 and after 500000000':
|
|
643
|
+
{
|
|
644
|
+
miniscript: 'and_v(v:pk(key),and_v(v:after(10),after(500000000)))',
|
|
645
|
+
script:
|
|
646
|
+
'<key> OP_CHECKSIGVERIFY 10 OP_CHECKLOCKTIMEVERIFY OP_VERIFY <0065cd1d> OP_CHECKLOCKTIMEVERIFY',
|
|
647
|
+
//throws: 'nLockTime values must be either below 500000000 or both above or equal 500000000'
|
|
648
|
+
throws:
|
|
649
|
+
'Miniscript and_v(v:pk(key),and_v(v:after(10),after(500000000))) is not sane.'
|
|
650
|
+
},
|
|
651
|
+
['Throw on mix relative time locks types. Sign with key and older than 10 blocks and older than 512 seconds: ' +
|
|
652
|
+
`and_v(v:pk(key),and_v(v:older(${bip68.encode({
|
|
653
|
+
seconds: 1 * 512
|
|
654
|
+
})}),older(${bip68.encode({ blocks: 10 })})))`]: {
|
|
655
|
+
miniscript: `and_v(v:pk(key),and_v(v:older(${bip68.encode({
|
|
656
|
+
seconds: 1 * 512
|
|
657
|
+
})}),older(${bip68.encode({ blocks: 10 })})))`,
|
|
658
|
+
//throws: 'a and b must both be either represent seconds or block height'
|
|
659
|
+
throws:
|
|
660
|
+
'Miniscript and_v(v:pk(key),and_v(v:older(4194305),older(10))) is not sane.'
|
|
661
|
+
},
|
|
662
|
+
'Do not throw on mix relative time locks types but using different paths. (Sign with key1 and older than 512 seconds) or (sign with key2 and older than 10 blocks)':
|
|
663
|
+
{
|
|
664
|
+
miniscript: `andor(pk(key1),older(${bip68.encode({
|
|
665
|
+
seconds: 1 * 512
|
|
666
|
+
})}),and_v(v:pk(key2),older(${bip68.encode({ blocks: 10 })})))`,
|
|
667
|
+
script:
|
|
668
|
+
'<key1> OP_CHECKSIG OP_NOTIF <key2> OP_CHECKSIGVERIFY 10 OP_CHECKSEQUENCEVERIFY OP_ELSE <010040> OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
669
|
+
nonMalleableSats: [
|
|
670
|
+
{
|
|
671
|
+
asm: '<sig(key1)>',
|
|
672
|
+
nSequence: bip68.encode({
|
|
673
|
+
seconds: 1 * 512
|
|
674
|
+
})
|
|
675
|
+
},
|
|
676
|
+
{ asm: '<sig(key2)> 0', nSequence: bip68.encode({ blocks: 10 }) }
|
|
677
|
+
],
|
|
678
|
+
malleableSats: []
|
|
679
|
+
},
|
|
680
|
+
'and_v(and_v(v:pk(a),v:after(10)),and_v(v:pk(b),after(11)))': {
|
|
681
|
+
policy: 'and(and(pk(a),after(10)),and(pk(b),after(11)))',
|
|
682
|
+
miniscript: 'and_v(and_v(v:pk(a),v:after(10)),and_v(v:pk(b),after(11)))',
|
|
683
|
+
script:
|
|
684
|
+
'<a> OP_CHECKSIGVERIFY 10 OP_CHECKLOCKTIMEVERIFY OP_VERIFY <b> OP_CHECKSIGVERIFY 11 OP_CHECKLOCKTIMEVERIFY',
|
|
685
|
+
nonMalleableSats: [{ asm: '<sig(b)> <sig(a)>', nLockTime: 11 }],
|
|
686
|
+
malleableSats: []
|
|
687
|
+
},
|
|
688
|
+
|
|
689
|
+
'andor(pk(c),after(13),and_v(and_v(v:pk(a),v:after(10)),after(11)))': {
|
|
690
|
+
policy: 'or(and(and(pk(a),after(10)),after(11)),and(pk(c),after(13)))',
|
|
691
|
+
miniscript:
|
|
692
|
+
'andor(pk(c),after(13),and_v(and_v(v:pk(a),v:after(10)),after(11)))',
|
|
693
|
+
script:
|
|
694
|
+
'<c> OP_CHECKSIG OP_NOTIF <a> OP_CHECKSIGVERIFY 10 OP_CHECKLOCKTIMEVERIFY OP_VERIFY 11 OP_CHECKLOCKTIMEVERIFY OP_ELSE 13 OP_CHECKLOCKTIMEVERIFY OP_ENDIF',
|
|
695
|
+
nonMalleableSats: [
|
|
696
|
+
{ asm: '<sig(c)>', nLockTime: 13 },
|
|
697
|
+
{ asm: '<sig(a)> 0', nLockTime: 11 }
|
|
698
|
+
],
|
|
699
|
+
malleableSats: []
|
|
700
|
+
},
|
|
701
|
+
'andor(pk(b),after(100),pk(a))': {
|
|
702
|
+
policy: 'or(pk(a),and(pk(b),after(100)))',
|
|
703
|
+
miniscript: 'andor(pk(b),after(100),pk(a))',
|
|
704
|
+
script:
|
|
705
|
+
'<b> OP_CHECKSIG OP_NOTIF <a> OP_CHECKSIG OP_ELSE <64> OP_CHECKLOCKTIMEVERIFY OP_ENDIF',
|
|
706
|
+
nonMalleableSats: [
|
|
707
|
+
{ asm: '<sig(b)>', nLockTime: 100 },
|
|
708
|
+
{ asm: '<sig(a)> 0' }
|
|
709
|
+
],
|
|
710
|
+
malleableSats: []
|
|
711
|
+
}
|
|
712
|
+
};
|
|
713
|
+
export const other = {
|
|
714
|
+
'and_v(v:pk(key_remote),hash160(H))': {
|
|
715
|
+
miniscript: 'and_v(v:pk(key_remote),hash160(H))',
|
|
716
|
+
nonMalleableSats: [{ asm: '<hash160_preimage(H)> <sig(key_remote)>' }],
|
|
717
|
+
script:
|
|
718
|
+
'<key_remote> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_HASH160 <H> OP_EQUAL',
|
|
719
|
+
malleableSats: []
|
|
720
|
+
},
|
|
721
|
+
'and_v(v:pk(key),or_b(l:after(100),al:after(200)))': {
|
|
722
|
+
miniscript: 'and_v(v:pk(key),or_b(l:after(100),al:after(200)))',
|
|
723
|
+
script:
|
|
724
|
+
'<key> OP_CHECKSIGVERIFY OP_IF 0 OP_ELSE <64> OP_CHECKLOCKTIMEVERIFY OP_ENDIF OP_TOALTSTACK OP_IF 0 OP_ELSE <c800> OP_CHECKLOCKTIMEVERIFY OP_ENDIF OP_FROMALTSTACK OP_BOOLOR',
|
|
725
|
+
throws:
|
|
726
|
+
'Miniscript and_v(v:pk(key),or_b(l:after(100),al:after(200))) is not sane.'
|
|
727
|
+
},
|
|
728
|
+
'and_v(v:pk(key_user),or_d(pk(key_service),older(12960)))': {
|
|
729
|
+
miniscript: 'and_v(v:pk(key_user),or_d(pk(key_service),older(12960)))',
|
|
730
|
+
script:
|
|
731
|
+
'<key_user> OP_CHECKSIGVERIFY <key_service> OP_CHECKSIG OP_IFDUP OP_NOTIF <a032> OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
732
|
+
nonMalleableSats: [
|
|
733
|
+
{ nSequence: 12960, asm: '0 <sig(key_user)>' },
|
|
734
|
+
{ asm: '<sig(key_service)> <sig(key_user)>' }
|
|
735
|
+
],
|
|
736
|
+
malleableSats: []
|
|
737
|
+
},
|
|
738
|
+
'andor(pk(matured),older(8640),pk(rushed))': {
|
|
739
|
+
miniscript: 'andor(pk(matured),older(8640),pk(rushed))',
|
|
740
|
+
script:
|
|
741
|
+
'<matured> OP_CHECKSIG OP_NOTIF <rushed> OP_CHECKSIG OP_ELSE <c021> OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
742
|
+
nonMalleableSats: [
|
|
743
|
+
{ nSequence: 8640, asm: '<sig(matured)>' },
|
|
744
|
+
{ asm: '<sig(rushed)> 0' }
|
|
745
|
+
],
|
|
746
|
+
malleableSats: []
|
|
747
|
+
},
|
|
748
|
+
'with unknown matured - andor(pk(matured),older(8640),pk(rushed))': {
|
|
749
|
+
miniscript: 'andor(pk(matured),older(8640),pk(rushed))',
|
|
750
|
+
script:
|
|
751
|
+
'<matured> OP_CHECKSIG OP_NOTIF <rushed> OP_CHECKSIG OP_ELSE <c021> OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
752
|
+
unknowns: ['<sig(matured)>'],
|
|
753
|
+
unknownSats: [{ nSequence: 8640, asm: '<sig(matured)>' }],
|
|
754
|
+
nonMalleableSats: [{ asm: '<sig(rushed)> 0' }],
|
|
755
|
+
malleableSats: []
|
|
756
|
+
},
|
|
757
|
+
'with unknown rushed - andor(pk(matured),older(8640),pk(rushed))': {
|
|
758
|
+
miniscript: 'andor(pk(matured),older(8640),pk(rushed))',
|
|
759
|
+
script:
|
|
760
|
+
'<matured> OP_CHECKSIG OP_NOTIF <rushed> OP_CHECKSIG OP_ELSE <c021> OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
761
|
+
unknowns: ['<sig(rushed)>'],
|
|
762
|
+
unknownSats: [{ asm: '<sig(rushed)> 0' }],
|
|
763
|
+
nonMalleableSats: [{ nSequence: 8640, asm: '<sig(matured)>' }],
|
|
764
|
+
malleableSats: []
|
|
765
|
+
},
|
|
766
|
+
'thresh(3,pk(key_1),s:pk(key_2),s:pk(key_3),sln:older(12960))': {
|
|
767
|
+
miniscript: 'thresh(3,pk(key_1),s:pk(key_2),s:pk(key_3),sln:older(12960))',
|
|
768
|
+
script:
|
|
769
|
+
'<key_1> OP_CHECKSIG OP_SWAP <key_2> OP_CHECKSIG OP_ADD OP_SWAP <key_3> OP_CHECKSIG OP_ADD OP_SWAP OP_IF 0 OP_ELSE <a032> OP_CHECKSEQUENCEVERIFY OP_0NOTEQUAL OP_ENDIF OP_ADD 3 OP_EQUAL',
|
|
770
|
+
nonMalleableSats: [
|
|
771
|
+
{ nSequence: 12960, asm: '0 0 <sig(key_2)> <sig(key_1)>' },
|
|
772
|
+
{ nSequence: 12960, asm: '0 <sig(key_3)> 0 <sig(key_1)>' },
|
|
773
|
+
{ nSequence: 12960, asm: '0 <sig(key_3)> <sig(key_2)> 0' },
|
|
774
|
+
{ asm: '1 <sig(key_3)> <sig(key_2)> <sig(key_1)>' }
|
|
775
|
+
],
|
|
776
|
+
malleableSats: []
|
|
777
|
+
},
|
|
778
|
+
'andor(pk(key_local),older(1008),pk(key_revocation))': {
|
|
779
|
+
miniscript: 'andor(pk(key_local),older(1008),pk(key_revocation))',
|
|
780
|
+
script:
|
|
781
|
+
'<key_local> OP_CHECKSIG OP_NOTIF <key_revocation> OP_CHECKSIG OP_ELSE <f003> OP_CHECKSEQUENCEVERIFY OP_ENDIF',
|
|
782
|
+
nonMalleableSats: [
|
|
783
|
+
{ nSequence: 1008, asm: '<sig(key_local)>' },
|
|
784
|
+
{ asm: '<sig(key_revocation)> 0' }
|
|
785
|
+
],
|
|
786
|
+
malleableSats: []
|
|
787
|
+
},
|
|
788
|
+
't:or_c(pk(key_revocation),and_v(v:pk(key_remote),or_c(pk(key_local),v:hash160(H))))':
|
|
789
|
+
{
|
|
790
|
+
miniscript:
|
|
791
|
+
't:or_c(pk(key_revocation),and_v(v:pk(key_remote),or_c(pk(key_local),v:hash160(H))))',
|
|
792
|
+
script:
|
|
793
|
+
'<key_revocation> OP_CHECKSIG OP_NOTIF <key_remote> OP_CHECKSIGVERIFY <key_local> OP_CHECKSIG OP_NOTIF OP_SIZE <20> OP_EQUALVERIFY OP_HASH160 <H> OP_EQUALVERIFY OP_ENDIF OP_ENDIF 1',
|
|
794
|
+
nonMalleableSats: [
|
|
795
|
+
{ asm: '<sig(key_revocation)>' },
|
|
796
|
+
{ asm: '<hash160_preimage(H)> 0 <sig(key_remote)> 0' }
|
|
797
|
+
],
|
|
798
|
+
malleableSats: [{ asm: '<sig(key_local)> <sig(key_remote)> 0' }]
|
|
799
|
+
},
|
|
800
|
+
'with unknown preimage - t:or_c(pk(key_revocation),and_v(v:pk(key_remote),or_c(pk(key_local),v:hash160(H))))':
|
|
801
|
+
{
|
|
802
|
+
miniscript:
|
|
803
|
+
't:or_c(pk(key_revocation),and_v(v:pk(key_remote),or_c(pk(key_local),v:hash160(H))))',
|
|
804
|
+
script:
|
|
805
|
+
'<key_revocation> OP_CHECKSIG OP_NOTIF <key_remote> OP_CHECKSIGVERIFY <key_local> OP_CHECKSIG OP_NOTIF OP_SIZE <20> OP_EQUALVERIFY OP_HASH160 <H> OP_EQUALVERIFY OP_ENDIF OP_ENDIF 1',
|
|
806
|
+
unknowns: ['<hash160_preimage(H)>'],
|
|
807
|
+
unknownSats: [{ asm: '<hash160_preimage(H)> 0 <sig(key_remote)> 0' }],
|
|
808
|
+
nonMalleableSats: [
|
|
809
|
+
{ asm: '<sig(key_local)> <sig(key_remote)> 0' },
|
|
810
|
+
{ asm: '<sig(key_revocation)>' }
|
|
811
|
+
],
|
|
812
|
+
malleableSats: []
|
|
813
|
+
},
|
|
814
|
+
'andor(pk(key_remote),or_i(and_v(v:pkh(key_local),hash160(H)),older(1008)),pk(key_revocation))':
|
|
815
|
+
{
|
|
816
|
+
miniscript:
|
|
817
|
+
'andor(pk(key_remote),or_i(and_v(v:pkh(key_local),hash160(H)),older(1008)),pk(key_revocation))',
|
|
818
|
+
script:
|
|
819
|
+
'<key_remote> OP_CHECKSIG OP_NOTIF <key_revocation> OP_CHECKSIG OP_ELSE OP_IF OP_DUP OP_HASH160 <HASH160(key_local)> OP_EQUALVERIFY OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_HASH160 <H> OP_EQUAL OP_ELSE <f003> OP_CHECKSEQUENCEVERIFY OP_ENDIF OP_ENDIF',
|
|
820
|
+
nonMalleableSats: [
|
|
821
|
+
{ nSequence: 1008, asm: '0 <sig(key_remote)>' },
|
|
822
|
+
{ asm: '<sig(key_revocation)> 0' },
|
|
823
|
+
{
|
|
824
|
+
asm: '<hash160_preimage(H)> <sig(key_local)> <key_local> 1 <sig(key_remote)>'
|
|
825
|
+
}
|
|
826
|
+
],
|
|
827
|
+
malleableSats: []
|
|
828
|
+
},
|
|
829
|
+
'thresh(1,pkh(@0),a:and_n(multi(1,@1,@2),n:older(2)))': {
|
|
830
|
+
miniscript: 'thresh(1,pkh(@0),a:and_n(multi(1,@1,@2),n:older(2)))',
|
|
831
|
+
script:
|
|
832
|
+
'OP_DUP OP_HASH160 <HASH160(@0)> OP_EQUALVERIFY OP_CHECKSIG OP_TOALTSTACK 1 <@1> <@2> 2 OP_CHECKMULTISIG OP_NOTIF 0 OP_ELSE 2 OP_CHECKSEQUENCEVERIFY OP_0NOTEQUAL OP_ENDIF OP_FROMALTSTACK OP_ADD 1 OP_EQUAL',
|
|
833
|
+
nonMalleableSats: [
|
|
834
|
+
{ asm: '0 0 <sig(@0)> <@0>' },
|
|
835
|
+
{ asm: '0 <sig(@1)> 0 <@0>', nSequence: 2 },
|
|
836
|
+
{ asm: '0 <sig(@2)> 0 <@0>', nSequence: 2 }
|
|
837
|
+
],
|
|
838
|
+
malleableSats: []
|
|
839
|
+
}
|
|
840
|
+
};
|
|
841
|
+
export const knowns = {
|
|
842
|
+
'with unknowns - and_v(v:pk(k),sha256(H))': {
|
|
843
|
+
miniscript: 'and_v(v:pk(k),sha256(H))',
|
|
844
|
+
script:
|
|
845
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL',
|
|
846
|
+
unknowns: ['<sha256_preimage(H)>'],
|
|
847
|
+
unknownSats: [{ asm: '<sha256_preimage(H)> <sig(k)>' }],
|
|
848
|
+
//If the preimage is unknown we cannot compute any satisfaction
|
|
849
|
+
nonMalleableSats: [],
|
|
850
|
+
malleableSats: []
|
|
851
|
+
},
|
|
852
|
+
'with knowns - and_v(v:pk(k),sha256(H))': {
|
|
853
|
+
miniscript: 'and_v(v:pk(k),sha256(H))',
|
|
854
|
+
script:
|
|
855
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL',
|
|
856
|
+
knowns: ['<sig(k)>'],
|
|
857
|
+
unknownSats: [{ asm: '<sha256_preimage(H)> <sig(k)>' }],
|
|
858
|
+
//If the preimage is unknown we cannot compute any satisfaction
|
|
859
|
+
nonMalleableSats: [],
|
|
860
|
+
malleableSats: []
|
|
861
|
+
},
|
|
862
|
+
'with all knowns - and_v(v:pk(k),sha256(H))': {
|
|
863
|
+
miniscript: 'and_v(v:pk(k),sha256(H))',
|
|
864
|
+
script:
|
|
865
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL',
|
|
866
|
+
knowns: ['<sig(k)>', '<sha256_preimage(H)>'],
|
|
867
|
+
unknownSats: [],
|
|
868
|
+
//If the preimage is unknown we cannot compute any satisfaction
|
|
869
|
+
nonMalleableSats: [{ asm: '<sha256_preimage(H)> <sig(k)>' }],
|
|
870
|
+
malleableSats: []
|
|
871
|
+
},
|
|
872
|
+
'throws with both knowns and unknowns - and_v(v:pk(k),sha256(H))': {
|
|
873
|
+
miniscript: 'and_v(v:pk(k),sha256(H))',
|
|
874
|
+
script:
|
|
875
|
+
'<k> OP_CHECKSIGVERIFY OP_SIZE <20> OP_EQUALVERIFY OP_SHA256 <H> OP_EQUAL',
|
|
876
|
+
knowns: ['<sig(k)>'],
|
|
877
|
+
unknowns: ['<sha256_preimage(H)>'],
|
|
878
|
+
throws: 'Cannot pass both knowns and unknowns'
|
|
879
|
+
},
|
|
880
|
+
'with unknows set - c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))': {
|
|
881
|
+
miniscript: 'c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))',
|
|
882
|
+
script:
|
|
883
|
+
'<key1> OP_CHECKSIG OP_NOTIF OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY OP_ENDIF <key2> OP_CHECKSIG',
|
|
884
|
+
unknowns: ['<ripemd160_preimage(H)>'],
|
|
885
|
+
unknownSats: [{ asm: '<sig(key2)> <ripemd160_preimage(H)> 0' }],
|
|
886
|
+
nonMalleableSats: [{ asm: '<sig(key2)> <sig(key1)>' }],
|
|
887
|
+
malleableSats: []
|
|
888
|
+
},
|
|
889
|
+
'with knows set - c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))': {
|
|
890
|
+
miniscript: 'c:and_v(or_c(pk(key1),v:ripemd160(H)),pk_k(key2))',
|
|
891
|
+
script:
|
|
892
|
+
'<key1> OP_CHECKSIG OP_NOTIF OP_SIZE <20> OP_EQUALVERIFY OP_RIPEMD160 <H> OP_EQUALVERIFY OP_ENDIF <key2> OP_CHECKSIG',
|
|
893
|
+
knowns: ['<sig(key1)>', '<sig(key2)>'],
|
|
894
|
+
unknownSats: [{ asm: '<sig(key2)> <ripemd160_preimage(H)> 0' }],
|
|
895
|
+
nonMalleableSats: [{ asm: '<sig(key2)> <sig(key1)>' }],
|
|
896
|
+
malleableSats: []
|
|
897
|
+
}
|
|
898
|
+
};
|