Skip to content

Commit 3610c1d

Browse files
authored
Merge pull request #98 from sanket1729/pkh_changes
Adds PkH alias
2 parents 31b4431 + f556fd6 commit 3610c1d

File tree

10 files changed

+54
-16
lines changed

10 files changed

+54
-16
lines changed

examples/htlc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fn main() {
3535

3636
assert_eq!(
3737
format!("{}", htlc_descriptor),
38-
"wsh(andor(pk(022222222222222222222222222222222222222222222222222222222222222222),sha256(1111111111111111111111111111111111111111111111111111111111111111),and_v(vc:pk_h(4377a5acd66dc5cb67148a24818d1e51fa183bd2),older(4444))))"
38+
"wsh(andor(pk(022222222222222222222222222222222222222222222222222222222222222222),sha256(1111111111111111111111111111111111111111111111111111111111111111),and_v(v:pkh(4377a5acd66dc5cb67148a24818d1e51fa183bd2),older(4444))))"
3939
);
4040

4141
assert_eq!(

fuzz/fuzz_targets/compile_descriptor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fn do_test(data: &[u8]) {
1919
let output = desc.to_string();
2020
if let Ok(desc) = DummyScript::from_str(&output) {
2121
let rtt = desc.to_string();
22-
assert_eq!(output, rtt);
22+
assert_eq!(output.to_lowercase(), rtt.to_lowercase());
2323
} else {
2424
panic!("compiler output something unparseable: {}", output)
2525
}

fuzz/fuzz_targets/roundtrip_concrete.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn do_test(data: &[u8]) {
1515
let re = Regex::new("(\\D)1@").unwrap();
1616
let output = re.replace_all(&output, "$1");
1717
let data_str = re.replace_all(&data_str, "$1");
18-
assert_eq!(data_str, output);
18+
assert_eq!(data_str.to_lowercase(), output.to_lowercase());
1919
}
2020
}
2121

fuzz/fuzz_targets/roundtrip_descriptor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ fn do_test(data: &[u8]) {
1818
let normalize_aliases = multi_wrap_pkh_re.replace_all(&normalize_aliases, "$1:pkh(");
1919
let normalize_aliases = normalize_aliases.replace("c:pk_k(", "pk(").replace("c:pk_h(", "pkh(");
2020

21-
assert_eq!(normalize_aliases, output);
21+
assert_eq!(normalize_aliases.to_lowercase(), output.to_lowercase());
2222
}
2323
}
2424

fuzz/fuzz_targets/roundtrip_miniscript_str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fn do_test(data: &[u8]) {
2020
let normalize_aliases = multi_wrap_pkh_re.replace_all(&normalize_aliases, "$1:pkh(");
2121
let normalize_aliases = normalize_aliases.replace("c:pk_k(", "pk(").replace("c:pk_h(", "pkh(");
2222

23-
assert_eq!(normalize_aliases, output);
23+
assert_eq!(normalize_aliases.to_lowercase(), output.to_lowercase());
2424

2525
}
2626
}

fuzz/fuzz_targets/roundtrip_semantic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ fn do_test(data: &[u8]) {
1010
let data_str = String::from_utf8_lossy(data);
1111
if let Ok(pol) = DummyPolicy::from_str(&data_str) {
1212
let output = pol.to_string();
13-
assert_eq!(data_str, output);
13+
assert_eq!(data_str.to_lowercase(), output.to_lowercase());
1414
}
1515
}
1616

src/descriptor/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ mod tests {
565565
fn roundtrip_descriptor(s: &str) {
566566
let desc = Descriptor::<DummyKey>::from_str(&s).unwrap();
567567
let output = desc.to_string();
568-
let normalize_aliases = s.replace("c:pk_k(", "pk(");
568+
let normalize_aliases = s.replace("c:pk_k(", "pk(").replace("c:pk_h(", "pkh(");
569569
assert_eq!(normalize_aliases, output);
570570
}
571571

@@ -574,6 +574,7 @@ mod tests {
574574
roundtrip_descriptor("c:pk_k()");
575575
roundtrip_descriptor("wsh(pk())");
576576
roundtrip_descriptor("wsh(c:pk_k())");
577+
roundtrip_descriptor("c:pk_h()");
577578
}
578579
#[test]
579580
fn parse_descriptor() {

src/miniscript/astelem.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ impl<Pk: MiniscriptKey> fmt::Display for Terminal<Pk> {
301301
if let Terminal::PkK(ref pk) = sub.node {
302302
// alias: pk(K) = c:pk_k(K)
303303
return write!(f, "pk({})", pk);
304+
} else if let Terminal::PkH(ref pkh) = sub.node {
305+
// alias: pkh(K) = c:pk_h(K)
306+
return write!(f, "pkh({})", pkh);
304307
}
305308
}
306309

@@ -314,6 +317,8 @@ impl<Pk: MiniscriptKey> fmt::Display for Terminal<Pk> {
314317
Some(('c', ms)) => {
315318
if let Terminal::PkK(ref _pk) = ms.node {
316319
fmt::Write::write_char(f, ':')?;
320+
} else if let Terminal::PkH(ref _pkh) = ms.node {
321+
fmt::Write::write_char(f, ':')?;
317322
}
318323
}
319324
_ => {}
@@ -345,7 +350,7 @@ where
345350
<<Pk as MiniscriptKey>::Hash as str::FromStr>::Err: ToString,
346351
{
347352
fn from_tree(top: &expression::Tree) -> Result<Terminal<Pk>, Error> {
348-
let aliased_wrap;
353+
let mut aliased_wrap;
349354
let frag_name;
350355
let frag_wrap;
351356
let mut name_split = top.name.split(':');
@@ -358,6 +363,9 @@ where
358363
if name == "pk" {
359364
frag_name = "pk_k";
360365
frag_wrap = "c";
366+
} else if name == "pkh" {
367+
frag_name = "pk_h";
368+
frag_wrap = "c";
361369
} else {
362370
frag_name = name;
363371
frag_wrap = "";
@@ -369,7 +377,13 @@ where
369377
}
370378
if name == "pk" {
371379
frag_name = "pk_k";
372-
aliased_wrap = wrap.to_owned() + &"c";
380+
aliased_wrap = wrap.to_owned();
381+
aliased_wrap.push_str("c");
382+
frag_wrap = &aliased_wrap;
383+
} else if name == "pkh" {
384+
frag_name = "pk_h";
385+
aliased_wrap = wrap.to_owned();
386+
aliased_wrap.push_str("c");
373387
frag_wrap = &aliased_wrap;
374388
} else {
375389
frag_name = name;

src/miniscript/mod.rs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -526,11 +526,7 @@ mod tests {
526526
ty: Type::cast_check(Type::from_pk_h()).unwrap(),
527527
ext: ExtData::cast_check(ExtData::from_pk_h()).unwrap(),
528528
};
529-
string_rtt(
530-
pkh_ms,
531-
"[B/nduesm]c:[K/nduesm]pk_h(DummyKeyHash)",
532-
"c:pk_h()",
533-
);
529+
string_rtt(pkh_ms, "[B/nduesm]c:[K/nduesm]pk_h(DummyKeyHash)", "pkh()");
534530

535531
let pkk_ms: Miniscript<bitcoin::PublicKey> = Miniscript {
536532
node: Terminal::Check(Arc::new(Miniscript {
@@ -605,6 +601,32 @@ mod tests {
605601
"[B/onufsm]t[V/onfsm]v[B/onduesm]c:[K/onduesm]pk_k(PublicKey { compressed: true, key: PublicKey(aa4c32e50fb34a95a372940ae3654b692ea35294748c3dd2c08b29f87ba9288c8294efcb73dc719e45b91c45f084e77aebc07c1ff3ed8f37935130a36304a340) })",
606602
"tv:pk(028c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa)"
607603
);
604+
605+
let pubkey_hash =
606+
hash160::Hash::from_str("f54a5851e9372b87810a8e60cdd2e7cfd80b6e31").unwrap();
607+
let script: Miniscript<bitcoin::PublicKey> = ms_str!("c:pk_h({})", pubkey_hash.to_string());
608+
609+
string_rtt(
610+
script,
611+
"[B/nduesm]c:[K/nduesm]pk_h(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
612+
"pkh(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
613+
);
614+
615+
let script: Miniscript<bitcoin::PublicKey> = ms_str!("pkh({})", pubkey_hash.to_string());
616+
617+
string_rtt(
618+
script,
619+
"[B/nduesm]c:[K/nduesm]pk_h(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
620+
"pkh(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
621+
);
622+
623+
let script: Miniscript<bitcoin::PublicKey> = ms_str!("tv:pkh({})", pubkey_hash.to_string());
624+
625+
string_rtt(
626+
script,
627+
"[B/nufsm]t[V/nfsm]v[B/nduesm]c:[K/nduesm]pk_h(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
628+
"tv:pkh(f54a5851e9372b87810a8e60cdd2e7cfd80b6e31)",
629+
);
608630
}
609631

610632
#[test]

src/policy/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,13 @@ mod tests {
155155
fn concrete_policy_rtt(s: &str) {
156156
let conc = ConcretePol::from_str(s).unwrap();
157157
let output = conc.to_string();
158-
assert_eq!(s, output);
158+
assert_eq!(s.to_lowercase(), output.to_lowercase());
159159
}
160160

161161
fn semantic_policy_rtt(s: &str) {
162162
let sem = SemanticPol::from_str(s).unwrap();
163163
let output = sem.to_string();
164-
assert_eq!(s, output);
164+
assert_eq!(s.to_lowercase(), output.to_lowercase());
165165
}
166166

167167
#[test]
@@ -177,6 +177,7 @@ mod tests {
177177
//fuzzer crashes
178178
assert!(ConcretePol::from_str("thresh()").is_err());
179179
assert!(SemanticPol::from_str("thresh()").is_err());
180+
concrete_policy_rtt("ripemd160(aaaaaaaaaaaaaaaaaaaaaa0Daaaaaaaaaabaaaaa)");
180181
}
181182

182183
#[test]

0 commit comments

Comments
 (0)