@@ -173,11 +173,8 @@ impl<'txin> Interpreter<'txin> {
173
173
///
174
174
/// In case the script is actually dissatisfied, this may return several values
175
175
/// 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.
179
176
pub fn iter < ' iter , F : FnMut ( & KeySigPair ) -> bool > (
180
- & ' iter mut self ,
177
+ & ' iter self ,
181
178
verify_sig : F ,
182
179
) -> Iter < ' txin , ' iter , F > {
183
180
Iter {
@@ -196,7 +193,9 @@ impl<'txin> Interpreter<'txin> {
196
193
} else {
197
194
vec ! [ ]
198
195
} ,
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 ( ) ,
200
199
age : self . age ,
201
200
height : self . height ,
202
201
has_errored : false ,
@@ -485,7 +484,7 @@ pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&KeySigPair) -> bool> {
485
484
verify_sig : F ,
486
485
public_key : Option < & ' intp BitcoinKey > ,
487
486
state : Vec < NodeEvaluationState < ' intp > > ,
488
- stack : & ' intp mut Stack < ' txin > ,
487
+ stack : Stack < ' txin > ,
489
488
age : u32 ,
490
489
height : u32 ,
491
490
has_errored : bool ,
@@ -1014,7 +1013,7 @@ mod tests {
1014
1013
1015
1014
fn from_stack < ' txin , ' elem , F > (
1016
1015
verify_fn : F ,
1017
- stack : & ' elem mut Stack < ' txin > ,
1016
+ stack : Stack < ' txin > ,
1018
1017
ms : & ' elem Miniscript < BitcoinKey , NoChecksEcdsa > ,
1019
1018
) -> Iter < ' elem , ' txin , F >
1020
1019
where
@@ -1054,9 +1053,9 @@ mod tests {
1054
1053
let ripemd160_hash = ripemd160:: Hash :: hash ( & preimage) ;
1055
1054
let ripemd160 = no_checks_ms ( & format ! ( "ripemd160({})" , ripemd160_hash) ) ;
1056
1055
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 ] ) ] ) ;
1058
1057
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) ;
1060
1059
let pk_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1061
1060
assert_eq ! (
1062
1061
pk_satisfied. unwrap( ) ,
@@ -1066,20 +1065,20 @@ mod tests {
1066
1065
) ;
1067
1066
1068
1067
//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 ] ) ;
1070
1069
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) ;
1072
1071
let pk_err: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1073
1072
assert ! ( pk_err. is_err( ) ) ;
1074
1073
1075
1074
//Check Pkh
1076
1075
let pk_bytes = pks[ 1 ] . to_public_key ( ) . to_bytes ( ) ;
1077
- let mut stack = Stack :: from ( vec ! [
1076
+ let stack = Stack :: from ( vec ! [
1078
1077
stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
1079
1078
stack:: Element :: Push ( & pk_bytes) ,
1080
1079
] ) ;
1081
1080
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) ;
1083
1082
let pkh_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1084
1083
assert_eq ! (
1085
1084
pkh_satisfied. unwrap( ) ,
@@ -1090,29 +1089,29 @@ mod tests {
1090
1089
) ;
1091
1090
1092
1091
//Check After
1093
- let mut stack = Stack :: from ( vec ! [ ] ) ;
1092
+ let stack = Stack :: from ( vec ! [ ] ) ;
1094
1093
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) ;
1096
1095
let after_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1097
1096
assert_eq ! (
1098
1097
after_satisfied. unwrap( ) ,
1099
1098
vec![ SatisfiedConstraint :: AbsoluteTimeLock { time: 1000 } ]
1100
1099
) ;
1101
1100
1102
1101
//Check Older
1103
- let mut stack = Stack :: from ( vec ! [ ] ) ;
1102
+ let stack = Stack :: from ( vec ! [ ] ) ;
1104
1103
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) ;
1106
1105
let older_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1107
1106
assert_eq ! (
1108
1107
older_satisfied. unwrap( ) ,
1109
1108
vec![ SatisfiedConstraint :: RelativeTimeLock { time: 1000 } ]
1110
1109
) ;
1111
1110
1112
1111
//Check Sha256
1113
- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1112
+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1114
1113
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) ;
1116
1115
let sah256_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1117
1116
assert_eq ! (
1118
1117
sah256_satisfied. unwrap( ) ,
@@ -1123,9 +1122,9 @@ mod tests {
1123
1122
) ;
1124
1123
1125
1124
//Check Shad256
1126
- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1125
+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1127
1126
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) ;
1129
1128
let sha256d_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1130
1129
assert_eq ! (
1131
1130
sha256d_satisfied. unwrap( ) ,
@@ -1136,9 +1135,9 @@ mod tests {
1136
1135
) ;
1137
1136
1138
1137
//Check hash160
1139
- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1138
+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1140
1139
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) ;
1142
1141
let hash160_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1143
1142
assert_eq ! (
1144
1143
hash160_satisfied. unwrap( ) ,
@@ -1149,9 +1148,9 @@ mod tests {
1149
1148
) ;
1150
1149
1151
1150
//Check ripemd160
1152
- let mut stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1151
+ let stack = Stack :: from ( vec ! [ stack:: Element :: Push ( & preimage) ] ) ;
1153
1152
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) ;
1155
1154
let ripemd160_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1156
1155
assert_eq ! (
1157
1156
ripemd160_satisfied. unwrap( ) ,
@@ -1163,7 +1162,7 @@ mod tests {
1163
1162
1164
1163
//Check AndV
1165
1164
let pk_bytes = pks[ 1 ] . to_public_key ( ) . to_bytes ( ) ;
1166
- let mut stack = Stack :: from ( vec ! [
1165
+ let stack = Stack :: from ( vec ! [
1167
1166
stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
1168
1167
stack:: Element :: Push ( & pk_bytes) ,
1169
1168
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
@@ -1174,7 +1173,7 @@ mod tests {
1174
1173
pks[ 1 ] . to_pubkeyhash( )
1175
1174
) ) ;
1176
1175
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) ;
1178
1177
1179
1178
let and_v_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1180
1179
assert_eq ! (
@@ -1191,7 +1190,7 @@ mod tests {
1191
1190
) ;
1192
1191
1193
1192
//Check AndB
1194
- let mut stack = Stack :: from ( vec ! [
1193
+ let stack = Stack :: from ( vec ! [
1195
1194
stack:: Element :: Push ( & preimage) ,
1196
1195
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
1197
1196
] ) ;
@@ -1200,7 +1199,7 @@ mod tests {
1200
1199
pks[ 0 ] , sha256_hash
1201
1200
) ) ;
1202
1201
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) ;
1204
1203
1205
1204
let and_b_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1206
1205
assert_eq ! (
@@ -1217,7 +1216,7 @@ mod tests {
1217
1216
) ;
1218
1217
1219
1218
//Check AndOr
1220
- let mut stack = Stack :: from ( vec ! [
1219
+ let stack = Stack :: from ( vec ! [
1221
1220
stack:: Element :: Push ( & preimage) ,
1222
1221
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
1223
1222
] ) ;
@@ -1228,7 +1227,7 @@ mod tests {
1228
1227
pks[ 1 ] . to_pubkeyhash( ) ,
1229
1228
) ) ;
1230
1229
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) ;
1232
1231
1233
1232
let and_or_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1234
1233
assert_eq ! (
@@ -1246,13 +1245,13 @@ mod tests {
1246
1245
1247
1246
//AndOr second satisfaction path
1248
1247
let pk_bytes = pks[ 1 ] . to_public_key ( ) . to_bytes ( ) ;
1249
- let mut stack = Stack :: from ( vec ! [
1248
+ let stack = Stack :: from ( vec ! [
1250
1249
stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
1251
1250
stack:: Element :: Push ( & pk_bytes) ,
1252
1251
stack:: Element :: Dissatisfied ,
1253
1252
] ) ;
1254
1253
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) ;
1256
1255
1257
1256
let and_or_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1258
1257
assert_eq ! (
@@ -1264,7 +1263,7 @@ mod tests {
1264
1263
) ;
1265
1264
1266
1265
//Check OrB
1267
- let mut stack = Stack :: from ( vec ! [
1266
+ let stack = Stack :: from ( vec ! [
1268
1267
stack:: Element :: Push ( & preimage) ,
1269
1268
stack:: Element :: Dissatisfied ,
1270
1269
] ) ;
@@ -1273,7 +1272,7 @@ mod tests {
1273
1272
pks[ 0 ] , sha256_hash
1274
1273
) ) ;
1275
1274
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) ;
1277
1276
1278
1277
let or_b_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1279
1278
assert_eq ! (
@@ -1285,13 +1284,13 @@ mod tests {
1285
1284
) ;
1286
1285
1287
1286
//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 ] ) ] ) ;
1289
1288
let elem = no_checks_ms ( & format ! (
1290
1289
"or_d(c:pk_k({}),jtv:sha256({}))" ,
1291
1290
pks[ 0 ] , sha256_hash
1292
1291
) ) ;
1293
1292
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) ;
1295
1294
1296
1295
let or_d_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1297
1296
assert_eq ! (
@@ -1302,7 +1301,7 @@ mod tests {
1302
1301
) ;
1303
1302
1304
1303
//Check OrC
1305
- let mut stack = Stack :: from ( vec ! [
1304
+ let stack = Stack :: from ( vec ! [
1306
1305
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
1307
1306
stack:: Element :: Dissatisfied ,
1308
1307
] ) ;
@@ -1311,7 +1310,7 @@ mod tests {
1311
1310
sha256_hash, pks[ 0 ]
1312
1311
) ) ;
1313
1312
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) ;
1315
1314
1316
1315
let or_c_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1317
1316
assert_eq ! (
@@ -1322,7 +1321,7 @@ mod tests {
1322
1321
) ;
1323
1322
1324
1323
//Check OrI
1325
- let mut stack = Stack :: from ( vec ! [
1324
+ let stack = Stack :: from ( vec ! [
1326
1325
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
1327
1326
stack:: Element :: Dissatisfied ,
1328
1327
] ) ;
@@ -1331,7 +1330,7 @@ mod tests {
1331
1330
sha256_hash, pks[ 0 ]
1332
1331
) ) ;
1333
1332
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) ;
1335
1334
1336
1335
let or_i_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1337
1336
assert_eq ! (
@@ -1342,7 +1341,7 @@ mod tests {
1342
1341
) ;
1343
1342
1344
1343
//Check Thres
1345
- let mut stack = Stack :: from ( vec ! [
1344
+ let stack = Stack :: from ( vec ! [
1346
1345
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
1347
1346
stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
1348
1347
stack:: Element :: Push ( & der_sigs[ 2 ] ) ,
@@ -1354,7 +1353,7 @@ mod tests {
1354
1353
pks[ 4 ] , pks[ 3 ] , pks[ 2 ] , pks[ 1 ] , pks[ 0 ] ,
1355
1354
) ) ;
1356
1355
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) ;
1358
1357
1359
1358
let thresh_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1360
1359
assert_eq ! (
@@ -1373,7 +1372,7 @@ mod tests {
1373
1372
) ;
1374
1373
1375
1374
// Check multi
1376
- let mut stack = Stack :: from ( vec ! [
1375
+ let stack = Stack :: from ( vec ! [
1377
1376
stack:: Element :: Dissatisfied ,
1378
1377
stack:: Element :: Push ( & der_sigs[ 2 ] ) ,
1379
1378
stack:: Element :: Push ( & der_sigs[ 1 ] ) ,
@@ -1384,7 +1383,7 @@ mod tests {
1384
1383
pks[ 4 ] , pks[ 3 ] , pks[ 2 ] , pks[ 1 ] , pks[ 0 ] ,
1385
1384
) ) ;
1386
1385
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) ;
1388
1387
1389
1388
let multi_satisfied: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1390
1389
assert_eq ! (
@@ -1403,7 +1402,7 @@ mod tests {
1403
1402
) ;
1404
1403
1405
1404
// Error multi: Invalid order of sigs
1406
- let mut stack = Stack :: from ( vec ! [
1405
+ let stack = Stack :: from ( vec ! [
1407
1406
stack:: Element :: Dissatisfied ,
1408
1407
stack:: Element :: Push ( & der_sigs[ 0 ] ) ,
1409
1408
stack:: Element :: Push ( & der_sigs[ 2 ] ) ,
@@ -1414,7 +1413,7 @@ mod tests {
1414
1413
pks[ 4 ] , pks[ 3 ] , pks[ 2 ] , pks[ 1 ] , pks[ 0 ] ,
1415
1414
) ) ;
1416
1415
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) ;
1418
1417
1419
1418
let multi_error: Result < Vec < SatisfiedConstraint > , Error > = constraints. collect ( ) ;
1420
1419
assert ! ( multi_error. is_err( ) ) ;
0 commit comments