Skip to content

Commit 25c85c2

Browse files
committed
miniscript: eliminate recursion in substitute_raw_pkh
As always, dropping the same method from Terminal
1 parent 8a4a535 commit 25c85c2

File tree

2 files changed

+16
-72
lines changed

2 files changed

+16
-72
lines changed

src/miniscript/astelem.rs

-71
Original file line numberDiff line numberDiff line change
@@ -45,77 +45,6 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
4545
}
4646
}
4747

48-
impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
49-
/// Substitutes raw public keys hashes with the public keys as provided by map.
50-
pub fn substitute_raw_pkh(&self, pk_map: &BTreeMap<hash160::Hash, Pk>) -> Terminal<Pk, Ctx> {
51-
match self {
52-
Terminal::RawPkH(ref p) => match pk_map.get(p) {
53-
Some(pk) => Terminal::PkH(pk.clone()).into(),
54-
None => Terminal::RawPkH(*p).into(),
55-
},
56-
Terminal::PkK(..)
57-
| Terminal::PkH(..)
58-
| Terminal::Multi(..)
59-
| Terminal::MultiA(..)
60-
| Terminal::After(..)
61-
| Terminal::Older(..)
62-
| Terminal::Sha256(..)
63-
| Terminal::Hash256(..)
64-
| Terminal::Ripemd160(..)
65-
| Terminal::Hash160(..)
66-
| Terminal::True
67-
| Terminal::False => self.clone().into(),
68-
Terminal::Alt(ref sub) => Terminal::Alt(Arc::new(sub.substitute_raw_pkh(pk_map))),
69-
Terminal::Swap(ref sub) => Terminal::Swap(Arc::new(sub.substitute_raw_pkh(pk_map))),
70-
Terminal::Check(ref sub) => Terminal::Check(Arc::new(sub.substitute_raw_pkh(pk_map))),
71-
Terminal::DupIf(ref sub) => Terminal::DupIf(Arc::new(sub.substitute_raw_pkh(pk_map))),
72-
Terminal::Verify(ref sub) => Terminal::Verify(Arc::new(sub.substitute_raw_pkh(pk_map))),
73-
Terminal::NonZero(ref sub) => {
74-
Terminal::NonZero(Arc::new(sub.substitute_raw_pkh(pk_map)))
75-
}
76-
Terminal::ZeroNotEqual(ref sub) => {
77-
Terminal::ZeroNotEqual(Arc::new(sub.substitute_raw_pkh(pk_map)))
78-
}
79-
Terminal::AndV(ref left, ref right) => Terminal::AndV(
80-
Arc::new(left.substitute_raw_pkh(pk_map)),
81-
Arc::new(right.substitute_raw_pkh(pk_map)),
82-
),
83-
Terminal::AndB(ref left, ref right) => Terminal::AndB(
84-
Arc::new(left.substitute_raw_pkh(pk_map)),
85-
Arc::new(right.substitute_raw_pkh(pk_map)),
86-
),
87-
Terminal::AndOr(ref a, ref b, ref c) => Terminal::AndOr(
88-
Arc::new(a.substitute_raw_pkh(pk_map)),
89-
Arc::new(b.substitute_raw_pkh(pk_map)),
90-
Arc::new(c.substitute_raw_pkh(pk_map)),
91-
),
92-
Terminal::OrB(ref left, ref right) => Terminal::OrB(
93-
Arc::new(left.substitute_raw_pkh(pk_map)),
94-
Arc::new(right.substitute_raw_pkh(pk_map)),
95-
),
96-
Terminal::OrD(ref left, ref right) => Terminal::OrD(
97-
Arc::new(left.substitute_raw_pkh(pk_map)),
98-
Arc::new(right.substitute_raw_pkh(pk_map)),
99-
),
100-
Terminal::OrC(ref left, ref right) => Terminal::OrC(
101-
Arc::new(left.substitute_raw_pkh(pk_map)),
102-
Arc::new(right.substitute_raw_pkh(pk_map)),
103-
),
104-
Terminal::OrI(ref left, ref right) => Terminal::OrI(
105-
Arc::new(left.substitute_raw_pkh(pk_map)),
106-
Arc::new(right.substitute_raw_pkh(pk_map)),
107-
),
108-
Terminal::Thresh(k, ref subs) => {
109-
let subs: Vec<Arc<Miniscript<_, _>>> = subs
110-
.iter()
111-
.map(|s| Arc::new(s.substitute_raw_pkh(pk_map)))
112-
.collect();
113-
Terminal::Thresh(*k, subs)
114-
}
115-
}
116-
}
117-
}
118-
11948
impl<Pk: MiniscriptKey, Ctx: ScriptContext> fmt::Debug for Terminal<Pk, Ctx> {
12049
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
12150
f.write_str("[")?;

src/miniscript/mod.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,22 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
449449

450450
/// Substitutes raw public keys hashes with the public keys as provided by map.
451451
pub fn substitute_raw_pkh(&self, pk_map: &BTreeMap<hash160::Hash, Pk>) -> Miniscript<Pk, Ctx> {
452-
Miniscript::from_ast(self.node.substitute_raw_pkh(pk_map)).expect("type check failed")
452+
let mut translated = vec![];
453+
for data in Arc::new(self.clone()).post_order_iter() {
454+
let new_term = if let Terminal::RawPkH(ref p) = data.node.node {
455+
match pk_map.get(p) {
456+
Some(pk) => Terminal::PkH(pk.clone()).into(),
457+
None => Terminal::RawPkH(*p).into(),
458+
}
459+
} else {
460+
data.node.node.clone()
461+
};
462+
463+
let new_ms = Miniscript::from_ast(new_term).expect("typeck");
464+
translated.push(Arc::new(new_ms));
465+
}
466+
467+
Arc::try_unwrap(translated.pop().unwrap()).unwrap()
453468
}
454469
}
455470

0 commit comments

Comments
 (0)