@@ -173,11 +173,8 @@ impl<'txin> Interpreter<'txin> {
173173 ///
174174 /// In case the script is actually dissatisfied, this may return several values
175175 /// before ultimately returning an error.
176- ///
177- /// Running the iterator through will consume the internal stack of the
178- /// `Interpreter`, and it should not be used again after this.
179176 pub fn iter < ' iter , F : FnMut ( & KeySigPair ) -> bool > (
180- & ' iter mut self ,
177+ & ' iter self ,
181178 verify_sig : F ,
182179 ) -> Iter < ' txin , ' iter , F > {
183180 Iter {
@@ -196,7 +193,9 @@ impl<'txin> Interpreter<'txin> {
196193 } else {
197194 vec ! [ ]
198195 } ,
199- stack : & mut self . stack ,
196+ // Cloning the references to elements of stack should be fine as it allows
197+ // call interpreter.iter() without mutating interpreter
198+ stack : self . stack . clone ( ) ,
200199 age : self . age ,
201200 height : self . height ,
202201 has_errored : false ,
@@ -485,7 +484,7 @@ pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&KeySigPair) -> bool> {
485484 verify_sig : F ,
486485 public_key : Option < & ' intp BitcoinKey > ,
487486 state : Vec < NodeEvaluationState < ' intp > > ,
488- stack : & ' intp mut Stack < ' txin > ,
487+ stack : Stack < ' txin > ,
489488 age : u32 ,
490489 height : u32 ,
491490 has_errored : bool ,
@@ -1014,7 +1013,7 @@ mod tests {
10141013
10151014 fn from_stack < ' txin , ' elem , F > (
10161015 verify_fn : F ,
1017- stack : & ' elem mut Stack < ' txin > ,
1016+ stack : Stack < ' txin > ,
10181017 ms : & ' elem Miniscript < BitcoinKey , NoChecksEcdsa > ,
10191018 ) -> Iter < ' elem , ' txin , F >
10201019 where
@@ -1054,9 +1053,9 @@ mod tests {
10541053 let ripemd160_hash = ripemd160:: Hash :: hash ( & preimage) ;
10551054 let ripemd160 = no_checks_ms ( & format ! ( "ripemd160({})" , ripemd160_hash) ) ;
10561055
1057- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & der_sigs[ 0 ] ) ] ) ;
1056+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & der_sigs[ 0 ] ) ] ) ;
10581057 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1059- let constraints = from_stack ( & mut vfyfn, & mut stack, & pk) ;
1058+ let constraints = from_stack ( & mut vfyfn, stack, & pk) ;
10601059 let pk_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
10611060 assert_eq ! (
10621061 pk_satisfied. unwrap( ) ,
@@ -1066,20 +1065,20 @@ mod tests {
10661065 ) ;
10671066
10681067 //Check Pk failure with wrong signature
1069- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Dissatisfied ] ) ;
1068+ let stack = Stack :: from ( vec ! [ stack:: Element :: Dissatisfied ] ) ;
10701069 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1071- let constraints = from_stack ( & mut vfyfn, & mut stack, & pk) ;
1070+ let constraints = from_stack ( & mut vfyfn, stack, & pk) ;
10721071 let pk_err: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
10731072 assert ! ( pk_err. is_err( ) ) ;
10741073
10751074 //Check Pkh
10761075 let pk_bytes = pks[ 1 ] . to_public_key ( ) . to_bytes ( ) ;
1077- let mut stack = Stack :: from ( vec ! [
1076+ let stack = Stack :: from ( vec ! [
10781077 stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
10791078 stack:: Element :: Push ( & pk_bytes) ,
10801079 ] ) ;
10811080 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1082- let constraints = from_stack ( & mut vfyfn, & mut stack, & pkh) ;
1081+ let constraints = from_stack ( & mut vfyfn, stack, & pkh) ;
10831082 let pkh_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
10841083 assert_eq ! (
10851084 pkh_satisfied. unwrap( ) ,
@@ -1090,29 +1089,29 @@ mod tests {
10901089 ) ;
10911090
10921091 //Check After
1093- let mut stack = Stack :: from ( vec ! [ ] ) ;
1092+ let stack = Stack :: from ( vec ! [ ] ) ;
10941093 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1095- let constraints = from_stack ( & mut vfyfn, & mut stack, & after) ;
1094+ let constraints = from_stack ( & mut vfyfn, stack, & after) ;
10961095 let after_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
10971096 assert_eq ! (
10981097 after_satisfied. unwrap( ) ,
10991098 vec![ SatisfiedConstraint :: AbsoluteTimeLock { time: 1000 } ]
11001099 ) ;
11011100
11021101 //Check Older
1103- let mut stack = Stack :: from ( vec ! [ ] ) ;
1102+ let stack = Stack :: from ( vec ! [ ] ) ;
11041103 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1105- let constraints = from_stack ( & mut vfyfn, & mut stack, & older) ;
1104+ let constraints = from_stack ( & mut vfyfn, stack, & older) ;
11061105 let older_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
11071106 assert_eq ! (
11081107 older_satisfied. unwrap( ) ,
11091108 vec![ SatisfiedConstraint :: RelativeTimeLock { time: 1000 } ]
11101109 ) ;
11111110
11121111 //Check Sha256
1113- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1112+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
11141113 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1115- let constraints = from_stack ( & mut vfyfn, & mut stack, & sha256) ;
1114+ let constraints = from_stack ( & mut vfyfn, stack, & sha256) ;
11161115 let sah256_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
11171116 assert_eq ! (
11181117 sah256_satisfied. unwrap( ) ,
@@ -1123,9 +1122,9 @@ mod tests {
11231122 ) ;
11241123
11251124 //Check Shad256
1126- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1125+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
11271126 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1128- let constraints = from_stack ( & mut vfyfn, & mut stack, & hash256) ;
1127+ let constraints = from_stack ( & mut vfyfn, stack, & hash256) ;
11291128 let sha256d_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
11301129 assert_eq ! (
11311130 sha256d_satisfied. unwrap( ) ,
@@ -1136,9 +1135,9 @@ mod tests {
11361135 ) ;
11371136
11381137 //Check hash160
1139- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1138+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
11401139 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1141- let constraints = from_stack ( & mut vfyfn, & mut stack, & hash160) ;
1140+ let constraints = from_stack ( & mut vfyfn, stack, & hash160) ;
11421141 let hash160_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
11431142 assert_eq ! (
11441143 hash160_satisfied. unwrap( ) ,
@@ -1149,9 +1148,9 @@ mod tests {
11491148 ) ;
11501149
11511150 //Check ripemd160
1152- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1151+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
11531152 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1154- let constraints = from_stack ( & mut vfyfn, & mut stack, & ripemd160) ;
1153+ let constraints = from_stack ( & mut vfyfn, stack, & ripemd160) ;
11551154 let ripemd160_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
11561155 assert_eq ! (
11571156 ripemd160_satisfied. unwrap( ) ,
@@ -1163,7 +1162,7 @@ mod tests {
11631162
11641163 //Check AndV
11651164 let pk_bytes = pks[ 1 ] . to_public_key ( ) . to_bytes ( ) ;
1166- let mut stack = Stack :: from ( vec ! [
1165+ let stack = Stack :: from ( vec ! [
11671166 stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
11681167 stack:: Element :: Push ( & pk_bytes) ,
11691168 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
@@ -1174,7 +1173,7 @@ mod tests {
11741173 pks[ 1 ] . to_pubkeyhash( )
11751174 ) ) ;
11761175 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1177- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1176+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
11781177
11791178 let and_v_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
11801179 assert_eq ! (
@@ -1191,7 +1190,7 @@ mod tests {
11911190 ) ;
11921191
11931192 //Check AndB
1194- let mut stack = Stack :: from ( vec ! [
1193+ let stack = Stack :: from ( vec ! [
11951194 stack:: Element :: Push ( & preimage) ,
11961195 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
11971196 ] ) ;
@@ -1200,7 +1199,7 @@ mod tests {
12001199 pks[ 0 ] , sha256_hash
12011200 ) ) ;
12021201 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1203- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1202+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
12041203
12051204 let and_b_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
12061205 assert_eq ! (
@@ -1217,7 +1216,7 @@ mod tests {
12171216 ) ;
12181217
12191218 //Check AndOr
1220- let mut stack = Stack :: from ( vec ! [
1219+ let stack = Stack :: from ( vec ! [
12211220 stack:: Element :: Push ( & preimage) ,
12221221 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
12231222 ] ) ;
@@ -1228,7 +1227,7 @@ mod tests {
12281227 pks[ 1 ] . to_pubkeyhash( ) ,
12291228 ) ) ;
12301229 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1231- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1230+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
12321231
12331232 let and_or_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
12341233 assert_eq ! (
@@ -1246,13 +1245,13 @@ mod tests {
12461245
12471246 //AndOr second satisfaction path
12481247 let pk_bytes = pks[ 1 ] . to_public_key ( ) . to_bytes ( ) ;
1249- let mut stack = Stack :: from ( vec ! [
1248+ let stack = Stack :: from ( vec ! [
12501249 stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
12511250 stack:: Element :: Push ( & pk_bytes) ,
12521251 stack:: Element :: Dissatisfied ,
12531252 ] ) ;
12541253 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1255- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1254+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
12561255
12571256 let and_or_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
12581257 assert_eq ! (
@@ -1264,7 +1263,7 @@ mod tests {
12641263 ) ;
12651264
12661265 //Check OrB
1267- let mut stack = Stack :: from ( vec ! [
1266+ let stack = Stack :: from ( vec ! [
12681267 stack:: Element :: Push ( & preimage) ,
12691268 stack:: Element :: Dissatisfied ,
12701269 ] ) ;
@@ -1273,7 +1272,7 @@ mod tests {
12731272 pks[ 0 ] , sha256_hash
12741273 ) ) ;
12751274 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1276- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1275+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
12771276
12781277 let or_b_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
12791278 assert_eq ! (
@@ -1285,13 +1284,13 @@ mod tests {
12851284 ) ;
12861285
12871286 //Check OrD
1288- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & der_sigs[ 0 ] ) ] ) ;
1287+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & der_sigs[ 0 ] ) ] ) ;
12891288 let elem = no_checks_ms ( & format ! (
12901289 "or_d(c:pk_k({}),jtv:sha256({}))" ,
12911290 pks[ 0 ] , sha256_hash
12921291 ) ) ;
12931292 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1294- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1293+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
12951294
12961295 let or_d_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
12971296 assert_eq ! (
@@ -1302,7 +1301,7 @@ mod tests {
13021301 ) ;
13031302
13041303 //Check OrC
1305- let mut stack = Stack :: from ( vec ! [
1304+ let stack = Stack :: from ( vec ! [
13061305 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
13071306 stack:: Element :: Dissatisfied ,
13081307 ] ) ;
@@ -1311,7 +1310,7 @@ mod tests {
13111310 sha256_hash, pks[ 0 ]
13121311 ) ) ;
13131312 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1314- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1313+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
13151314
13161315 let or_c_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
13171316 assert_eq ! (
@@ -1322,7 +1321,7 @@ mod tests {
13221321 ) ;
13231322
13241323 //Check OrI
1325- let mut stack = Stack :: from ( vec ! [
1324+ let stack = Stack :: from ( vec ! [
13261325 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
13271326 stack:: Element :: Dissatisfied ,
13281327 ] ) ;
@@ -1331,7 +1330,7 @@ mod tests {
13311330 sha256_hash, pks[ 0 ]
13321331 ) ) ;
13331332 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1334- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1333+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
13351334
13361335 let or_i_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
13371336 assert_eq ! (
@@ -1342,7 +1341,7 @@ mod tests {
13421341 ) ;
13431342
13441343 //Check Thres
1345- let mut stack = Stack :: from ( vec ! [
1344+ let stack = Stack :: from ( vec ! [
13461345 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
13471346 stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
13481347 stack:: Element :: Push ( & der_sigs[ 2 ] ) ,
@@ -1354,7 +1353,7 @@ mod tests {
13541353 pks[ 4 ] , pks[ 3 ] , pks[ 2 ] , pks[ 1 ] , pks[ 0 ] ,
13551354 ) ) ;
13561355 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1357- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1356+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
13581357
13591358 let thresh_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
13601359 assert_eq ! (
@@ -1373,7 +1372,7 @@ mod tests {
13731372 ) ;
13741373
13751374 // Check multi
1376- let mut stack = Stack :: from ( vec ! [
1375+ let stack = Stack :: from ( vec ! [
13771376 stack:: Element :: Dissatisfied ,
13781377 stack:: Element :: Push ( & der_sigs[ 2 ] ) ,
13791378 stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
@@ -1384,7 +1383,7 @@ mod tests {
13841383 pks[ 4 ] , pks[ 3 ] , pks[ 2 ] , pks[ 1 ] , pks[ 0 ] ,
13851384 ) ) ;
13861385 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1387- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1386+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
13881387
13891388 let multi_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
13901389 assert_eq ! (
@@ -1403,7 +1402,7 @@ mod tests {
14031402 ) ;
14041403
14051404 // Error multi: Invalid order of sigs
1406- let mut stack = Stack :: from ( vec ! [
1405+ let stack = Stack :: from ( vec ! [
14071406 stack:: Element :: Dissatisfied ,
14081407 stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
14091408 stack:: Element :: Push ( & der_sigs[ 2 ] ) ,
@@ -1414,7 +1413,7 @@ mod tests {
14141413 pks[ 4 ] , pks[ 3 ] , pks[ 2 ] , pks[ 1 ] , pks[ 0 ] ,
14151414 ) ) ;
14161415 let mut vfyfn = vfyfn_. clone ( ) ; // sigh rust 1.29...
1417- let constraints = from_stack ( & mut vfyfn, & mut stack, & elem) ;
1416+ let constraints = from_stack ( & mut vfyfn, stack, & elem) ;
14181417
14191418 let multi_error: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
14201419 assert ! ( multi_error. is_err( ) ) ;
0 commit comments