@@ -17,8 +17,9 @@ use std::{fmt, hash};
17
17
use bitcoin;
18
18
use bitcoin:: blockdata:: constants:: MAX_BLOCK_WEIGHT ;
19
19
use miniscript:: limits:: {
20
- MAX_OPS_PER_SCRIPT , MAX_SCRIPTSIG_SIZE , MAX_SCRIPT_ELEMENT_SIZE , MAX_SCRIPT_SIZE ,
21
- MAX_STACK_SIZE , MAX_STANDARD_P2WSH_SCRIPT_SIZE , MAX_STANDARD_P2WSH_STACK_ITEMS ,
20
+ MAX_OPS_PER_SCRIPT , MAX_PUBKEYS_PER_MULTISIG , MAX_SCRIPTSIG_SIZE , MAX_SCRIPT_ELEMENT_SIZE ,
21
+ MAX_SCRIPT_SIZE , MAX_STACK_SIZE , MAX_STANDARD_P2WSH_SCRIPT_SIZE ,
22
+ MAX_STANDARD_P2WSH_STACK_ITEMS ,
22
23
} ;
23
24
use miniscript:: types;
24
25
use util:: witness_to_scriptsig;
@@ -67,6 +68,8 @@ pub enum ScriptContextError {
67
68
TaprootMultiDisabled ,
68
69
/// Stack size exceeded in script execution
69
70
StackSizeLimitExceeded { actual : usize , limit : usize } ,
71
+ /// More than 20 keys in a Multi fragment
72
+ CheckMultiSigLimitExceeded ,
70
73
}
71
74
72
75
impl fmt:: Display for ScriptContextError {
@@ -132,6 +135,12 @@ impl fmt::Display for ScriptContextError {
132
135
actual, limit
133
136
)
134
137
}
138
+ ScriptContextError :: CheckMultiSigLimitExceeded => {
139
+ write ! (
140
+ f,
141
+ "CHECkMULTISIG ('multi()' descriptor) only supports up to 20 pubkeys"
142
+ )
143
+ }
135
144
}
136
145
}
137
146
}
@@ -323,6 +332,16 @@ impl ScriptContext for Legacy {
323
332
if ms. ext . pk_cost > MAX_SCRIPT_ELEMENT_SIZE {
324
333
return Err ( ScriptContextError :: MaxRedeemScriptSizeExceeded ) ;
325
334
}
335
+
336
+ match ms. node {
337
+ Terminal :: Multi ( _k, ref pks) => {
338
+ if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
339
+ return Err ( ScriptContextError :: CheckMultiSigLimitExceeded ) ;
340
+ }
341
+ }
342
+ _ => { }
343
+ }
344
+
326
345
Ok ( ( ) )
327
346
}
328
347
@@ -408,6 +427,9 @@ impl ScriptContext for Segwitv0 {
408
427
Ok ( ( ) )
409
428
}
410
429
Terminal :: Multi ( _k, ref pks) => {
430
+ if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
431
+ return Err ( ScriptContextError :: CheckMultiSigLimitExceeded ) ;
432
+ }
411
433
for pk in pks. iter ( ) {
412
434
if pk. is_uncompressed ( ) {
413
435
return Err ( ScriptContextError :: CompressedOnly ( pk. to_string ( ) ) ) ;
0 commit comments