Skip to content

Commit 6250791

Browse files
committed
miniscript: eliminate recursion in substitute_raw_pkh
As always, dropping the same method from Terminal
1 parent af810d4 commit 6250791

File tree

2 files changed

+16
-72
lines changed

2 files changed

+16
-72
lines changed

src/miniscript/astelem.rs

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -46,77 +46,6 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
4646
}
4747
}
4848

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

src/miniscript/mod.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,22 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Miniscript<Pk, Ctx> {
438438

439439
/// Substitutes raw public keys hashes with the public keys as provided by map.
440440
pub fn substitute_raw_pkh(&self, pk_map: &BTreeMap<hash160::Hash, Pk>) -> Miniscript<Pk, Ctx> {
441-
Miniscript::from_ast(self.node.substitute_raw_pkh(pk_map)).expect("type check failed")
441+
let mut translated = vec![];
442+
for data in Arc::new(self.clone()).post_order_iter() {
443+
let new_term = if let Terminal::RawPkH(ref p) = data.node.node {
444+
match pk_map.get(p) {
445+
Some(pk) => Terminal::PkH(pk.clone()).into(),
446+
None => Terminal::RawPkH(*p).into(),
447+
}
448+
} else {
449+
data.node.node.clone()
450+
};
451+
452+
let new_ms = Miniscript::from_ast(new_term).expect("typeck");
453+
translated.push(Arc::new(new_ms));
454+
}
455+
456+
Arc::try_unwrap(translated.pop().unwrap()).unwrap()
442457
}
443458
}
444459

0 commit comments

Comments
 (0)