Skip to content

Commit e2d715e

Browse files
committed
Remove mut from Interpreter type for iterator
This is an unituitive API that mutates interpreter for minor efficiency gains
1 parent 374ab9a commit e2d715e

File tree

2 files changed

+47
-48
lines changed

2 files changed

+47
-48
lines changed

src/interpreter/mod.rs

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -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());

src/psbt/finalizer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ pub fn interpreter_check<C: secp256k1::Verification>(
300300
let csv = psbt.unsigned_tx.input[index].sequence;
301301
let amt = get_amt(psbt, index).map_err(|e| Error::InputError(e, index))?;
302302

303-
let mut interpreter =
303+
let interpreter =
304304
interpreter::Interpreter::from_txdata(spk, &script_sig, &witness, cltv, csv)
305305
.map_err(|e| Error::InputError(InputError::Interpreter(e), index))?;
306306

0 commit comments

Comments
 (0)